在 Xamarin Forms 的 Effect 中为控件应用背景
Applying a background for the control in an Effect in XamarinForms
我正在尝试为效果附加到的控件应用背景。
首先,我制作的效果是为 UWP 中具有填充或背景属性的控件应用背景。
但问题是 UWP 中有很多控件渲染到 FrameworkElement。并且 FrameworkElement 没有背景 属性 。
在 VisualElementRenderer 中,Xamarin 表单解决了这个问题,在内容后面应用了一个背景层,但这是一种效果。
有什么方法可以为附加的效果应用背景吗?
我正在应用 AcrylicBrush 所以它必须直接分配给控件。
我之前写的代码:
try
{
Control.GetType().GetProperty("Background").SetValue(Control, brush);
}
catch
{
Control.GetType().GetProperty("Fill").SetValue(Control, brush);
}
I'm appplying an AcrylicBrush So it must be assigned to the Control directly.
您可以使用 compositor
将 Acrylic 应用于 SpriteVisual
。我们使用 Win2D to make GaussianBlurEffect
for UIElement
before we have Acrylic API。得到UIElement的Compositor
,用这个Compositor
到CreateSpriteVisual
。然后将 GaussianBlurEffect
设置为 hostSprite.Brush
,如下所示。
Compositor _compositor;
SpriteVisual _hostSprite;
private void applyAcrylicAccent(Panel panel)
{
_compositor = ElementCompositionPreview.GetElementVisual(panel).Compositor;
_hostSprite = _compositor.CreateSpriteVisual();
_hostSprite.Size = new Vector2((float)panel.ActualWidth, (float)panel.ActualHeight);
var backdrop = _compositor.CreateHostBackdropBrush();
// Use a Win2D blur affect applied to a CompositionBackdropBrush.
var graphicsEffect = new GaussianBlurEffect
{
Name = "Blur",
BlurAmount = 100f,
Source = new CompositionEffectSourceParameter("backdrop")
};
var effectFactory = Window.Current.Compositor.CreateEffectFactory(graphicsEffect, new[] { "Blur.BlurAmount" });
var effectBrush = effectFactory.CreateBrush();
effectBrush.SetSourceParameter("backdrop", backdrop);
_hostSprite.Brush = effectBrush;
ElementCompositionPreview.SetElementChildVisual(panel, _hostSprite);
}
并使用 applyAcrylicAccent(RootLayout) 调用它。您还需要处理 SizeChanged
事件:
private void LayoutRoot_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (_hostSprite != null)
_hostSprite.Size = e.NewSize.ToVector2();
}
我正在尝试为效果附加到的控件应用背景。
首先,我制作的效果是为 UWP 中具有填充或背景属性的控件应用背景。 但问题是 UWP 中有很多控件渲染到 FrameworkElement。并且 FrameworkElement 没有背景 属性 。 在 VisualElementRenderer 中,Xamarin 表单解决了这个问题,在内容后面应用了一个背景层,但这是一种效果。 有什么方法可以为附加的效果应用背景吗? 我正在应用 AcrylicBrush 所以它必须直接分配给控件。
我之前写的代码:
try
{
Control.GetType().GetProperty("Background").SetValue(Control, brush);
}
catch
{
Control.GetType().GetProperty("Fill").SetValue(Control, brush);
}
I'm appplying an AcrylicBrush So it must be assigned to the Control directly.
您可以使用 compositor
将 Acrylic 应用于 SpriteVisual
。我们使用 Win2D to make GaussianBlurEffect
for UIElement
before we have Acrylic API。得到UIElement的Compositor
,用这个Compositor
到CreateSpriteVisual
。然后将 GaussianBlurEffect
设置为 hostSprite.Brush
,如下所示。
Compositor _compositor;
SpriteVisual _hostSprite;
private void applyAcrylicAccent(Panel panel)
{
_compositor = ElementCompositionPreview.GetElementVisual(panel).Compositor;
_hostSprite = _compositor.CreateSpriteVisual();
_hostSprite.Size = new Vector2((float)panel.ActualWidth, (float)panel.ActualHeight);
var backdrop = _compositor.CreateHostBackdropBrush();
// Use a Win2D blur affect applied to a CompositionBackdropBrush.
var graphicsEffect = new GaussianBlurEffect
{
Name = "Blur",
BlurAmount = 100f,
Source = new CompositionEffectSourceParameter("backdrop")
};
var effectFactory = Window.Current.Compositor.CreateEffectFactory(graphicsEffect, new[] { "Blur.BlurAmount" });
var effectBrush = effectFactory.CreateBrush();
effectBrush.SetSourceParameter("backdrop", backdrop);
_hostSprite.Brush = effectBrush;
ElementCompositionPreview.SetElementChildVisual(panel, _hostSprite);
}
并使用 applyAcrylicAccent(RootLayout) 调用它。您还需要处理 SizeChanged
事件:
private void LayoutRoot_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (_hostSprite != null)
_hostSprite.Size = e.NewSize.ToVector2();
}