0

我正在尝试为效果所附加的控件应用背景。

首先,我制作了为 UWP 中具有填充或背景属性的控件应用背景的效果。但问题是很多控件在 UWP 中呈现给 FrameworkElement。并且 FrameworkElement 没有 Background 属性。在 VisualElementRenderer Xamarin 表单中,解决了在内容后面应用背景层的问题,但这是一种效果。有什么方法可以为附加的效果应用背景吗?我正在应用 AcrylicBrush 所以它必须直接分配给控件。

我之前写的代码:

try
{
   Control.GetType().GetProperty("Background").SetValue(Control, brush);
}
catch
{
   Control.GetType().GetProperty("Fill").SetValue(Control, brush);
}
4

1 回答 1

0

我正在应用 AcrylicBrush 所以它必须直接分配给控件。

您可以使用compositor将亚克力应用于SpriteVisual. 在我们有Acrylic API之前,我们使用Win2D制作GaussianBlurEffect。获取UIElement,并将其用于. 然后设置为喜欢以下。UIElementCompositorCompositorCreateSpriteVisualGaussianBlurEffecthostSprite.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();
}

在此处输入图像描述

于 2018-08-10T05:30:03.653 回答