XamlCompositionBrushBase Klasse

Definition

Stellt eine Basisklasse bereit, die zum Erstellen von XAML-Pinsel verwendet wird, die einen Bereich mit einem CompositionBrush zeichnen.

public ref class XamlCompositionBrushBase : Brush
/// [Windows.Foundation.Metadata.ContractVersion(Microsoft.UI.Xaml.WinUIContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class XamlCompositionBrushBase : Brush
[Windows.Foundation.Metadata.ContractVersion(typeof(Microsoft.UI.Xaml.WinUIContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public class XamlCompositionBrushBase : Brush
Public Class XamlCompositionBrushBase
Inherits Brush
Vererbung
Object Platform::Object IInspectable DependencyObject Brush XamlCompositionBrushBase
Abgeleitet
Attribute

Beispiele

Dieses Beispiel zeigt die Definition für einen benutzerdefinierten Pinsel, der eine verschwommene Kopie eines UIElements zeichnet, auf das der Pinsel mit einem Win2D-Weichzeichnereffekt und einem CompositionBackdropBrush angewendet wird:

public sealed class BackdropBlurBrush : XamlCompositionBrushBase
{
    public static readonly DependencyProperty BlurAmountProperty = DependencyProperty.Register(
        "BlurAmount",
        typeof(double),
        typeof(BackdropBlurBrush),
        new PropertyMetadata(0.0, new PropertyChangedCallback(OnBlurAmountChanged)
        )
    );

    public double BlurAmount
    {
        get { return (double)GetValue(BlurAmountProperty); }
        set { SetValue(BlurAmountProperty, value); }
    }

    private static void OnBlurAmountChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var brush = (BackdropBlurBrush)d;
        // Unbox and set a new blur amount if the CompositionBrush exists.
        brush.CompositionBrush?.Properties.InsertScalar("Blur.BlurAmount", (float)(double)e.NewValue);            
    }

    public BackdropBlurBrush()
    {
    }

    protected override void OnConnected()
    {
        // Delay creating composition resources until they're required.
        if (CompositionBrush == null)
        {
            var backdrop = Window.Current.Compositor.CreateBackdropBrush();                

            // Use a Win2D blur affect applied to a CompositionBackdropBrush.
            var graphicsEffect = new GaussianBlurEffect
            {
                Name = "Blur",
                BlurAmount = (float)this.BlurAmount,
                Source = new CompositionEffectSourceParameter("backdrop")
            };

            var effectFactory = Window.Current.Compositor.CreateEffectFactory(graphicsEffect, new[] { "Blur.BlurAmount" });
            var effectBrush = effectFactory.CreateBrush();

            effectBrush.SetSourceParameter("backdrop", backdrop);

            CompositionBrush = effectBrush;
        }
    }

    protected override void OnDisconnected()
    {
        // Dispose of composition resources when no longer in use.
        if (CompositionBrush != null)
        {
            CompositionBrush.Dispose();
            CompositionBrush = null;
        }
    }
}

Im folgenden C++/WinRT-Codebeispiel müssen Sie Ihrem Projekt eine Midl-Datei (IDL) -Datei hinzufügen.

// BackdropBlurBrush.idl
namespace MyApp
{
    [default_interface]
    runtimeclass BackdropBlurBrush : Windows.UI.Xaml.Media.XamlCompositionBrushBase
    {
        BackdropBlurBrush();
        static Windows.UI.Xaml.DependencyProperty BlurAmountProperty{ get; };
        Double BlurAmount;
    }
}
// pch.h
// You'll need to install the Microsoft Win2D NuGet package for this code example.
#include <winrt/Microsoft.Graphics.Canvas.Effects.h>
#include <winrt/Windows.Graphics.Effects.h>

// BackdropBlurBrush.h.
struct BackdropBlurBrush : BackdropBlurBrushT<BackdropBlurBrush>
{
    BackdropBlurBrush() = default;

    static Windows::UI::Xaml::DependencyProperty BlurAmountProperty() { return m_blurAmountProperty; }

    double BlurAmount()
    {
        return winrt::unbox_value<double>(GetValue(m_blurAmountProperty));
    }

    void BlurAmount(double value)
    {
        SetValue(m_blurAmountProperty, winrt::box_value(value));
    }

    void OnConnected();
    void OnDisconnected();

    static void OnBlurAmountChanged(Windows::UI::Xaml::DependencyObject const& d, Windows::UI::Xaml::DependencyPropertyChangedEventArgs const& e);

private:
    static Windows::UI::Xaml::DependencyProperty m_blurAmountProperty;
};

// WindowBlurBrush.cpp.
Windows::UI::Xaml::DependencyProperty BackdropBlurBrush::m_blurAmountProperty =
    Windows::UI::Xaml::DependencyProperty::Register(
        L"BlurAmount",
        winrt::xaml_typename<double>(),
        winrt::xaml_typename<MyApp::BackdropBlurBrush>(),
        Windows::UI::Xaml::PropertyMetadata{ winrt::box_value(0.), Windows::UI::Xaml::PropertyChangedCallback{ &BackdropBlurBrush::OnBlurAmountChanged } }
);

void BackdropBlurBrush::OnBlurAmountChanged(Windows::UI::Xaml::DependencyObject const& d, Windows::UI::Xaml::DependencyPropertyChangedEventArgs const& e)
{
    auto brush{ d.as<MyApp::BackdropBlurBrush>() };
    // Unbox and set a new blur amount if the CompositionBrush exists.
    if (brush.CompositionBrush() != nullptr)
    {
        brush.CompositionBrush().Properties().InsertScalar(L"Blur.BlurAmount", (float)winrt::unbox_value<double>(e.NewValue()));
    }
}

void BackdropBlurBrush::OnConnected()
{
    // Delay creating composition resources until they're required.
    if (!CompositionBrush())
    {
        auto backdrop{ Windows::UI::Xaml::Window::Current().Compositor().CreateBackdropBrush() };

        // Use a Win2D blur affect applied to a CompositionBackdropBrush.
        Microsoft::Graphics::Canvas::Effects::GaussianBlurEffect graphicsEffect{};
        graphicsEffect.Name(L"Blur");
        graphicsEffect.BlurAmount(this->BlurAmount());
        graphicsEffect.Source(Windows::UI::Composition::CompositionEffectSourceParameter(L"backdrop"));

        auto effectFactory{ Windows::UI::Xaml::Window::Current().Compositor().CreateEffectFactory(graphicsEffect, { L"Blur.BlurAmount" }) };
        auto effectBrush{ effectFactory.CreateBrush() };

        effectBrush.SetSourceParameter(L"backdrop", backdrop);

        CompositionBrush(effectBrush);
    }
}

void BackdropBlurBrush::OnDisconnected()
{
    // Dispose of composition resources when no longer in use.
    if (CompositionBrush())
    {
        CompositionBrush(nullptr);
    }
}
// WindowBlurBrush.h:
public ref class BackdropBlurBrush sealed :
    public Windows::UI::Xaml::Media::XamlCompositionBrushBase
{
public:
    BackdropBlurBrush();

    static property Windows::UI::Xaml::DependencyProperty^ BlurAmountProperty
    {
        Windows::UI::Xaml::DependencyProperty^ get() { return m_blurAmountProperty; }
    };

    property double BlurAmount
    {
        double get() 
        {
            return static_cast<double>(GetValue(BlurAmountProperty));
        }
        void set(double value) 
        {
            SetValue(BlurAmountProperty, value);
        }
    };

protected:
    virtual void OnConnected() override;
    virtual void OnDisconnected() override;	
    private:
    static Windows::UI::Xaml::DependencyProperty^ m_blurAmountProperty;
    static void OnBlurAmountChanged(Windows::UI::Xaml::DependencyObject^ d, Windows::UI::Xaml::DependencyPropertyChangedEventArgs^ e);
};

// WindowBlurBrush.cpp:
DependencyProperty^ BackdropBlurBrush::m_blurAmountProperty = DependencyProperty::Register(
    "BlurAmount",
    Platform::String::typeid,
    BackdropBlurBrush::typeid,
    ref new PropertyMetadata(0.0, ref new PropertyChangedCallback(OnBlurAmountChanged))
);

BackdropBlurBrush::BackdropBlurBrush()
{
}

void BackdropBlurBrush::OnBlurAmountChanged(DependencyObject^ d, DependencyPropertyChangedEventArgs^ e)
{
    auto brush = static_cast<BackdropBlurBrush^>(d);
    // Unbox and set a new blur amount if the CompositionBrush exists
    if (brush->CompositionBrush != nullptr)
    {
        brush->CompositionBrush->Properties->InsertScalar("Blur.BlurAmount", (float)static_cast<double>(e->NewValue));
    }
}

void BackdropBlurBrush::OnConnected()
{
    // Delay creating composition resources until they're required
    if (CompositionBrush == nullptr)
    {
        auto backdrop = Window::Current->Compositor->CreateBackdropBrush();

        // Use a Win2D blur affect applied to a CompositionBackdropBrush
        auto graphicsEffect = ref new GaussianBlurEffect();
        graphicsEffect->Name = "Blur";
        graphicsEffect->BlurAmount = static_cast<float>(this->BlurAmount);
        graphicsEffect->Source = ref new CompositionEffectSourceParameter("backdrop");

        auto animatableProperties = ref new Platform::Collections::Vector<Platform::String^>();
        animatableProperties->Append("Blur.BlurAmount");

        auto effectFactory = Window::Current->Compositor->CreateEffectFactory(graphicsEffect, animatableProperties);
        auto effectBrush = effectFactory->CreateBrush();

        effectBrush->SetSourceParameter("backdrop", backdrop);

        CompositionBrush = effectBrush;
    }
}

void BackdropBlurBrush::OnDisconnected()
{
    // Dispose of composition resources when no longer in use
    if (CompositionBrush != nullptr)
    {
        delete CompositionBrush;
        CompositionBrush = nullptr;
    }
}

Der obige Pinsel kann dann wie jeder andere XAML-Pinseltyp zum Zeichnen von UIElements verwendet werden, z. B.:

Fügen Sie #include "BackdropBlurBrush.h" für C++/WinRT auch zu MainPage.h.

<Ellipse Width="100" Height="100">
    <Ellipse.Fill>
        <local:BackdropBlurBrush BlurAmount="10" />
    </Ellipse.Fill>
</Ellipse>

Hinweise

Sie können XamlCompositionBrushBase verwenden, um benutzerdefinierte Pinsel zu erstellen.

Es kann beispielsweise verwendet werden, um einen Pinsel zu erstellen, der Effekte auf XAML-UIElements mithilfe eines CompositionEffectBrush oder eines SceneLightingEffect-Elements anwendet, das die reflektierenden Eigenschaften von Elementen steuert, wenn sie von einem XamlLight beleuchtet werden, oder eine ganze Reihe von Effekten, die miteinander verkettet sind, um etwas komplexer zu erzeugen.

Beim Erstellen eines Pinsels empfiehlt es sich in der Regel, das Erstellen eines CompositionBrush und alle zugehörigen Ressourcen zu verzögern, bis der Pinsel verwendet wird. Die OnConnected-Methode wird aufgerufen, wenn ein Pinsel erstmals auf dem Bildschirm zum Zeichnen eines Elements verwendet wird, sodass Sie OnConnected außer Kraft setzen können, um Ressourcen nur dann sicher zu erstellen, wenn sie benötigt werden. Dies bedeutet, dass Sie eine Instanz eines Pinsels in einem ResourceDictionary erstellen können und dann später von anderen Teilen der UI-Definitionen auf diese Pinselressource verweisen und nur die Kosten für das Erstellen von Kompositionsressourcen bezahlen, wenn der Pinsel tatsächlich verwendet wird.

Außerdem empfiehlt es sich, Kompositionsressourcen zu löschen, wenn sie nicht mehr verwendet werden. Die OnDisconnected-Methode wird aufgerufen, wenn eine Pinselinstanz nicht mehr an einer beliebigen Stelle auf dem Bildschirm verwendet wird, sodass Sie OnDisconnected außer Kraft setzen können, um Ressourcen sicher zu löschen. Wenn der Pinsel später erneut verwendet wird, nachdem die Verbindung getrennt wurde, wird "OnConnected" erneut aufgerufen.

Konstruktoren

Name Beschreibung
XamlCompositionBrushBase()

Stellt das Initialisierungsverhalten der Basisklasse für abgeleitete XamlCompositionBrushBase-Klassen bereit.

Eigenschaften

Name Beschreibung
CompositionBrush

Ruft den CompositionBrush ab, der von diesem XAML-Pinsel verwendet wird, oder legt diesen fest.

Dispatcher

Gibt immer in einer Windows App SDK-App zurück null . Verwenden Sie stattdessen DispatcherQueue .

(Geerbt von DependencyObject)
DispatcherQueue

Ruft ab DispatcherQueue , dem dieses Objekt zugeordnet ist. Dies DispatcherQueue stellt eine Einrichtung dar, die auf den DependencyObject UI-Thread zugreifen kann, auch wenn der Code von einem Nicht-UI-Thread initiiert wird.

(Geerbt von DependencyObject)
FallbackColor

Die farbe, die für das Rendern verwendet werden soll, falls der CompositionBrush nicht gerendert werden kann.

FallbackColorProperty

Identifies the FallbackColor dependency property.

Opacity

Dient zum Abrufen oder Festlegen des Grads der Deckkraft eines Pinsels.

(Geerbt von Brush)
RelativeTransform

Dient zum Abrufen oder Festlegen der Transformation, die mit relativen Koordinaten auf den Pinsel angewendet wird.

(Geerbt von Brush)
Transform

Dient zum Abrufen oder Festlegen der Transformation, die auf den Pinsel angewendet wird.

(Geerbt von Brush)

Methoden

Name Beschreibung
ClearValue(DependencyProperty)

Löscht den lokalen Wert einer Abhängigkeitseigenschaft.

(Geerbt von DependencyObject)
GetAnimationBaseValue(DependencyProperty)

Gibt einen Basiswert zurück, der für eine Abhängigkeitseigenschaft eingerichtet wurde, was in Fällen angewendet wird, in denen eine Animation nicht aktiv ist.

(Geerbt von DependencyObject)
GetValue(DependencyProperty)

Gibt den aktuellen effektiven Wert einer Abhängigkeitseigenschaft aus einem DependencyObject zurück.

(Geerbt von DependencyObject)
OnConnected()

Wird aufgerufen, wenn ein Pinsel zum ersten Mal auf dem Bildschirm zum Zeichnen eines Elements verwendet wird.

Wenn sie in einer abgeleiteten Klasse implementiert wird, können Sie eine CompositionBrush-Instanz erstellen und für das Framework bereitstellen, indem Sie die CompositionBrush-Eigenschaft festlegen.

OnDisconnected wird aufgerufen, wenn der Pinsel nicht mehr zum Zeichnen von Elementen verwendet wird.

OnDisconnected()

Wird aufgerufen, wenn der Pinsel nicht mehr zum Zeichnen von Elementen verwendet wird.

Bei der Implementierung in einer abgeleiteten Klasse können Sie die Kompostierungsbürste und andere Kompositionsressourcen sicher verwerfen.

OnConnected wird erneut aufgerufen, wenn der Pinsel später zum Zeichnen von Elementen verwendet wird, nachdem die Verbindung getrennt wurde.

PopulatePropertyInfo(String, AnimationPropertyInfo)

Definiert eine Eigenschaft, die animiert werden kann.

(Geerbt von Brush)
PopulatePropertyInfoOverride(String, AnimationPropertyInfo)

Wenn eine abgeleitete Klasse überschrieben wird, wird eine Eigenschaft definiert, die animiert werden kann.

(Geerbt von Brush)
ReadLocalValue(DependencyProperty)

Gibt den lokalen Wert einer Abhängigkeitseigenschaft zurück, wenn ein lokaler Wert festgelegt wird.

(Geerbt von DependencyObject)
RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback)

Registriert eine Benachrichtigungsfunktion, um Änderungen an einer bestimmten DependencyProperty für diese DependencyObject-Instanz zu überwachen.

(Geerbt von DependencyObject)
SetValue(DependencyProperty, Object)

Legt den lokalen Wert einer Abhängigkeitseigenschaft für ein DependencyObject fest.

(Geerbt von DependencyObject)
UnregisterPropertyChangedCallback(DependencyProperty, Int64)

Bricht eine Änderungsbenachrichtigung ab, die zuvor durch Aufrufen von RegisterPropertyChangedCallback registriert wurde.

(Geerbt von DependencyObject)

Gilt für:

Weitere Informationen