Применение фона для элемента управления в эффекте в 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();
}