Применение фона для элемента управления в эффекте в XamarinForms

Я пытаюсь применить фон для того элемента управления, к которому прикреплен эффект.

Сначала я создал эффект для применения фона для элементов управления, которые имеют свойства "Заливка" или "Фон" в UWP. Но проблема в том, что множество элементов управления визуализируется в FrameworkElement в UWP. А FrameworkElement не имеет свойства Background. В формах VisualElementRenderer Xamarin эта проблема решается путем применения фонового слоя за содержимым, но это эффект. Есть ли способ применить фон к любому эффекту? Я применяю AcrylicBrush, поэтому он должен быть назначен элементу управления напрямую.

Код, который я написал раньше:

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

1 ответ

Решение

Я применяю AcrylicBrush, поэтому он должен быть назначен элементу управления напрямую.

Вы могли бы использовать compositor нанести акрил на SpriteVisual, Мы используем Win2D, чтобы сделать GaussianBlurEffect за UIElement прежде чем у нас есть Acrylic API. Получить Compositor UIElement, и используйте это 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();
}

Другие вопросы по тегам