XamlCompositionBrushBase Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
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
- 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 |
| DispatcherQueue |
Ruft ab |
| 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) |