XamlCompositionBrushBase Classe
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Fornece uma classe base usada para criar pincéis XAML que pintam uma área com um CompositionBrush.
public ref class XamlCompositionBrushBase : Brush
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 262144)]
/// [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(Windows.Foundation.UniversalApiContract), 262144)]
[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
- Herança
- Derivado
- Atributos
Requisitos do Windows
Família de dispositivos |
Windows 10 Creators Update (introduzida na 10.0.15063.0)
|
API contract |
Windows.Foundation.UniversalApiContract (introduzida na v4.0)
|
Exemplos
Este exemplo mostra a definição de um pincel personalizado que desenha uma cópia desfocada do que está por trás de um UIElement em que o pincel é aplicado usando um efeito de desfoque Win2D e um CompositionBackdropBrush:
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;
}
}
}
Public NotInheritable Class BackdropBlurBrush
Inherits XamlCompositionBrushBase
Public Shared ReadOnly BlurAmountProperty As DependencyProperty = DependencyProperty.Register(
"BlurAmount",
GetType(Double),
GetType(BackdropBlurBrush),
New PropertyMetadata(0.0, New PropertyChangedCallback(AddressOf OnBlurAmountChanged)
)
)
Public Property BlurAmount As Double
Get
Return DirectCast(GetValue(BlurAmountProperty), Double)
End Get
Set
SetValue(BlurAmountProperty, Value)
End Set
End Property
Private Shared Sub OnBlurAmountChanged(d As DependencyObject, e As DependencyPropertyChangedEventArgs)
Dim brush = DirectCast(d, BackdropBlurBrush)
' Unbox And set a New blur amount if the CompositionBrush exists.
brush.CompositionBrush?.Properties.InsertScalar("Blur.BlurAmount", Convert.ToSingle(DirectCast(e.NewValue, Double)))
End Sub
Protected Overrides Sub OnConnected()
If Me.CompositionBrush Is Nothing Then
Dim backdrop As CompositionBackdropBrush = Window.Current.Compositor.CreateBackdropBrush()
' Use a Win2D blur affect applied to a CompositionBackdropBrush.
Dim graphicsEffect As GaussianBlurEffect = New GaussianBlurEffect()
graphicsEffect.Name = "Blur"
graphicsEffect.BlurAmount = Me.BlurAmount
graphicsEffect.Source = New CompositionEffectSourceParameter("backdrop")
Dim effectFactory As CompositionEffectFactory = Window.Current.Compositor.CreateEffectFactory(graphicsEffect, New String() {"Blur.BlurAmount"})
Dim effectBrush As CompositionEffectBrush = effectFactory.CreateBrush()
effectBrush.SetSourceParameter("backdrop", backdrop)
CompositionBrush = effectBrush
End If
End Sub
Protected Overrides Sub OnDisconnected()
' Dispose of composition resources when no longer in use.
If CompositionBrush IsNot Nothing Then
CompositionBrush.Dispose()
CompositionBrush = Nothing
End If
End Sub
End Class
Para o exemplo de código C++/WinRT abaixo, você precisará adicionar um arquivo Midl File (.idl) ao seu projeto.
// 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;
}
}
O pincel acima pode ser usado como qualquer outro tipo de pincel XAML para pintar UIElements, por exemplo:
Para C++/WinRT, adicione #include "BackdropBlurBrush.h"
também a MainPage.h
.
<Ellipse Width="100" Height="100">
<Ellipse.Fill>
<local:BackdropBlurBrush BlurAmount="10" />
</Ellipse.Fill>
</Ellipse>
Comentários
Você pode usar XamlCompositionBrushBase para criar pincéis personalizados.
Por exemplo, ele pode ser usado para criar um pincel que aplica efeitos a UIElements XAML usando um CompositionEffectBrush ou um SceneLightingEffect que controla as propriedades reflexivas dos elementos ao serem iluminados por um XamlLight ou uma série inteira de efeitos encadeados para produzir algo mais complexo.
Ao criar um pincel, geralmente é uma boa prática atrasar a criação de um CompositionBrush e quaisquer recursos relacionados até que o pincel esteja sendo usado. O método OnConnected é chamado quando um pincel é usado pela primeira vez na tela para pintar um elemento, para que você possa substituir OnConnected para criar recursos com segurança somente quando eles forem necessários. Isso significa que você pode criar uma instância de um pincel em um ResourceDictionary e, em seguida, referenciar esse recurso de pincel posteriormente de outras partes das definições de interface do usuário e pagar apenas o custo de criação de recursos de composição quando o pincel estiver realmente em uso.
Também é uma boa prática descartar recursos de composição quando eles não estão mais em uso. O método OnDisconnected é chamado quando uma instância de pincel não está mais em uso em nenhum lugar na tela, portanto, você pode substituir OnDisconnected para descartar recursos com segurança. Se o pincel for usado novamente depois de ser desconectado, OnConnected será chamado novamente.
Construtores
XamlCompositionBrushBase() |
Fornece o comportamento de inicialização de classe base para classes derivadas de XamlCompositionBrushBase . |
Propriedades
CompositionBrush |
Obtém ou define o CompositionBrush usado por esse pincel XAML. |
Dispatcher |
Obtém o CoreDispatcher ao qual esse objeto está associado. O CoreDispatcher representa uma instalação que pode acessar o DependencyObject no thread da interface do usuário, mesmo que o código seja iniciado por um thread que não seja da interface do usuário. (Herdado de DependencyObject) |
FallbackColor |
A cor a ser usada para renderização caso o CompositionBrush não possa ser renderizado. |
FallbackColorProperty |
Identifica a propriedade de dependência FallbackColor . |
Opacity |
Obtém ou define o grau de opacidade de um Pincel. (Herdado de Brush) |
RelativeTransform |
Obtém ou define a transformação que é aplicada ao pincel, usando coordenadas relativas. (Herdado de Brush) |
Transform |
Obtém ou define a transformação que é aplicada ao pincel. (Herdado de Brush) |
Métodos
ClearValue(DependencyProperty) |
Limpa o valor local de uma propriedade de dependência. (Herdado de DependencyObject) |
GetAnimationBaseValue(DependencyProperty) |
Retorna qualquer valor base estabelecido para uma propriedade de dependência, que se aplicaria nos casos em que uma animação não está ativa. (Herdado de DependencyObject) |
GetValue(DependencyProperty) |
Retorna o valor efetivo atual de uma propriedade de dependência de um DependencyObject. (Herdado de DependencyObject) |
OnConnected() |
Invocado quando um pincel é usado pela primeira vez na tela para pintar um elemento. Quando implementado em uma classe derivada, você pode criar uma instância compositionBrush e fornecê-la à estrutura definindo a propriedade CompositionBrush . OnDisconnected será chamado quando o pincel não estiver mais sendo usado para pintar nenhum elemento. |
OnDisconnected() |
Invocado quando o pincel não está mais sendo usado para pintar elementos. Quando implementado em uma classe derivada, você pode descartar com segurança o pincel de compostagem e outros recursos de composição. OnConnected será chamado novamente se o pincel for usado posteriormente para pintar elementos após ser desconectado. |
PopulatePropertyInfo(String, AnimationPropertyInfo) |
Define uma propriedade que pode ser animada. (Herdado de Brush) |
PopulatePropertyInfoOverride(String, AnimationPropertyInfo) |
Quando substituído em uma classe derivada, define uma propriedade que pode ser animada. (Herdado de Brush) |
ReadLocalValue(DependencyProperty) |
Retorna o valor local de uma propriedade de dependência, se um valor local for definido. (Herdado de DependencyObject) |
RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback) |
Registra uma função de notificação para escutar alterações em uma DependencyProperty específica nessa instância dependencyObject . (Herdado de DependencyObject) |
SetValue(DependencyProperty, Object) |
Define o valor local de uma propriedade de dependência em um DependencyObject. (Herdado de DependencyObject) |
UnregisterPropertyChangedCallback(DependencyProperty, Int64) |
Cancela uma notificação de alteração que foi registrada anteriormente chamando RegisterPropertyChangedCallback. (Herdado de DependencyObject) |