XamlCompositionBrushBase クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
CompositionBrush を使用して領域を描画する XAML ブラシを作成するために使用される基本クラスを提供します。
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
- 継承
- 派生
- 属性
Windows の要件
デバイス ファミリ |
Windows 10 Creators Update (10.0.15063.0 で導入)
|
API contract |
Windows.Foundation.UniversalApiContract (v4.0 で導入)
|
例
この例では、 Win2D ブラー効果と CompositionBackdropBrush を使用してブラシが適用される UIElement の背後にあるものについて、ぼけたコピーを描画するカスタム ブラシの定義を示します。
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
以下の C++/WinRT コード例では、 Midl ファイル (.idl) ファイルをプロジェクトに追加する必要があります。
// 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;
}
}
上記のブラシは、他の XAML ブラシの種類と同様に使用して、UIElements を描画できます。次に例を示します。
C++/WinRT の場合は、 も に追加#include "BackdropBlurBrush.h"
しますMainPage.h
。
<Ellipse Width="100" Height="100">
<Ellipse.Fill>
<local:BackdropBlurBrush BlurAmount="10" />
</Ellipse.Fill>
</Ellipse>
注釈
XamlCompositionBrushBase を使用して、カスタム ブラシを作成できます。
たとえば、CompositionEffectBrush を使用して XAML UIElements に効果を適用するブラシを作成したり、XamlLight で照らされたときに要素の反射プロパティを制御する SceneLightingEffect を作成したり、一連の効果を連結してより複雑なものを生成したりできます。
ブラシを作成するときは、通常、ブラシが使用されるまで CompositionBrush と関連リソースの作成を遅らせるのが良い方法です。 OnConnected メソッドは、画面上で初めてブラシを使用して要素を描画するときに呼び出されるため、OnConnected をオーバーライドして、必要なときにのみリソースを安全に作成できます。 つまり、ResourceDictionary でブラシのインスタンスを作成し、後でそのブラシ リソースを UI 定義の他の部分から参照し、ブラシが実際に使用されている場合にのみ合成リソースを作成するコストを支払うことができます。
また、コンポジション リソースが使用されなくなったら破棄することをお勧めします。 OnDisconnected メソッドは、ブラシ インスタンスが画面上のどこにも使用されなくなったときに呼び出されるため、OnDisconnected をオーバーライドしてリソースを安全に破棄できます。 切断後にブラシを後で再度使用すると、 OnConnected が再度呼び出されます。
コンストラクター
XamlCompositionBrushBase() |
XamlCompositionBrushBase 派生クラスの基底クラス初期化動作を提供します。 |
プロパティ
CompositionBrush |
この XAML ブラシで使用される CompositionBrush を取得または設定します。 |
Dispatcher |
このオブジェクトが関連付けられている CoreDispatcher を取得します。 CoreDispatcher は、コードが UI 以外のスレッドによって開始された場合でも、UI スレッド上の DependencyObject にアクセスできる機能を表します。 (継承元 DependencyObject) |
FallbackColor |
CompositionBrush をレンダリングできない場合にレンダリングに使用する色。 |
FallbackColorProperty |
FallbackColor 依存関係プロパティを識別します。 |
Opacity |
Brush の不透明度を取得または設定 します。 (継承元 Brush) |
RelativeTransform |
相対座標を使用して、ブラシに適用される変換を取得または設定します。 (継承元 Brush) |
Transform |
ブラシに適用される変換を取得または設定します。 (継承元 Brush) |