如何在Windows 10 Creators Update 中正确使用Acrylic Accent (CreateHostBackDropBrush())?
How to use Acrylic Accent (CreateHostBackDropBrush()) in Windows 10 Creators Update correctly?
我想做一些可能有点棘手的事情,因为它是 Win 10 Creators Update 中的一项新功能:我想使用新的 Acrylic Accent 功能在 UWP 应用程序中制作透明 Windows .
我看到微软已经在 Fast Insider Ring 的 Groove 和 Film & TV 中引入它了。
这是我开发的代码,使用 Win Dev Center 中的示例和 Stack Overflow 上的其他一些答案:
public sealed partial class MainPage : Page
{
// Some other things
private void initializeInterface()
{
/// Applying Acrylic Accent
LayoutRoot.Background = null;
GaussianBlurEffect blurEffect = new GaussianBlurEffect()
{
Name = "Blur",
BlurAmount = 5.0f,
BorderMode = EffectBorderMode.Hard,
Optimization = EffectOptimization.Balanced,
Source = new CompositionEffectSourceParameter("source"),
};
LayoutRoot.Background = null;
var rootVisual = ElementCompositionPreview.GetElementVisual(LayoutRoot as UIElement);
var compositor = rootVisual.Compositor;
var factory = compositor.CreateEffectFactory(blurEffect);
var effectBrush = factory.CreateBrush();
// This is the effect I wanted to use, the "Acrylic Accent", as it is called by MS itself.
var backdropBrush = compositor.CreateHostBackdropBrush();
effectBrush.SetSourceParameter("source", backdropBrush);
var blurVisual = compositor.CreateSpriteVisual();
blurVisual.Brush = effectBrush;
ElementCompositionPreview.SetElementChildVisual(LayoutRoot as UIElement, blurVisual);
}
}
其中 LayoutRoot
是用作根面板的 RelativePanel
。
但有些东西不起作用:什么?
我如何将它应用于 UIElement
,例如 Page
或 Panel
?
非常感谢您的帮助,谢谢。
我自己解决了:必须手动指定 SpriteVisual
大小(使其适合 UIElement
目标)和 UIElement 本身的 sizeChanged
事件。
这里是示例代码,我使用了通用的 Panel
class(为了方便地使用 Panel.ActualWidth/ActualHeight
属性...),但是每个 UIElement
是否适合亚克力效果:
private Compositor compositor;
private SpriteVisual hostVisual;
private void applyAcrylicAccent(Panel e)
{
compositor = ElementCompositionPreview.GetElementVisual(e).Compositor;
hostVisual = compositor.CreateSpriteVisual();
hostVisual.Size = new System.Numerics.Vector2((float)e.ActualWidth, (float)e.ActualHeight);
// You can choose which effect you want, it is indifferent
GaussianBlurEffect blurEffect = new GaussianBlurEffect()
{
Name = "Blur",
BlurAmount = 0.0f,
BorderMode = EffectBorderMode.Hard,
Optimization = EffectOptimization.Balanced,
Source = new CompositionEffectSourceParameter("source"),
};
var factory = compositor.CreateEffectFactory(blurEffect, null);
var effectBrush = factory.CreateBrush();
effectBrush.SetSourceParameter("source", compositor.CreateHostBackdropBrush());
hostVisual.Brush = effectBrush;
ElementCompositionPreview.SetElementChildVisual(e, hostVisual);
}
和与目标UIElement
关联的sizeChanged
事件(此处称为LayoutRoot):
private void LayoutRoot_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (hostVisual != null)
{
hostVisual.Size = new System.Numerics.Vector2((float)e.NewSize.Width, (float)e.NewSize.Height);
}
}
尽情享受吧。
;D
这是示例 XAML 代码,以避免在您要应用亚克力装饰时其他视觉元素消失:
<SomePanelSubclass "rootGrid">
<SomePanelSubclassForAcrylic>
<SomePanelSubclass "AcrylicGrid"/>
<!-- Comment: some background is needed in order to make elements more visible -->
<SomeElementWithBackgroundProperty Background="SomeBrush" Canvas.ZIndex="ValueAboveZero"/>
</SomePanelSubclassForAcrylic>
<AllOtherChildrenElements Canvas.ZIndex="ValueAboveZero"/>
</SomePanelSubclass>
您只能将 Acrylic Accent 应用于 "AcrylicGrid"。
请记住:应用了 Acrylic Accents 的 UIElement 的所有子元素都将 "disappear",因此目标 Acrylic UIElement 不能有子元素。
您可以将所有其他 XAML 元素放入一个单独的 IPanel 元素中,以简化 Canvas.ZIndex 事情,以便仅将其应用于面板本身。
显然这只是一个示例片段,因此您可以使用您想要的任何名称重命名这些元素。
希望对您有所帮助。
;)
我想做一些可能有点棘手的事情,因为它是 Win 10 Creators Update 中的一项新功能:我想使用新的 Acrylic Accent 功能在 UWP 应用程序中制作透明 Windows . 我看到微软已经在 Fast Insider Ring 的 Groove 和 Film & TV 中引入它了。
这是我开发的代码,使用 Win Dev Center 中的示例和 Stack Overflow 上的其他一些答案:
public sealed partial class MainPage : Page
{
// Some other things
private void initializeInterface()
{
/// Applying Acrylic Accent
LayoutRoot.Background = null;
GaussianBlurEffect blurEffect = new GaussianBlurEffect()
{
Name = "Blur",
BlurAmount = 5.0f,
BorderMode = EffectBorderMode.Hard,
Optimization = EffectOptimization.Balanced,
Source = new CompositionEffectSourceParameter("source"),
};
LayoutRoot.Background = null;
var rootVisual = ElementCompositionPreview.GetElementVisual(LayoutRoot as UIElement);
var compositor = rootVisual.Compositor;
var factory = compositor.CreateEffectFactory(blurEffect);
var effectBrush = factory.CreateBrush();
// This is the effect I wanted to use, the "Acrylic Accent", as it is called by MS itself.
var backdropBrush = compositor.CreateHostBackdropBrush();
effectBrush.SetSourceParameter("source", backdropBrush);
var blurVisual = compositor.CreateSpriteVisual();
blurVisual.Brush = effectBrush;
ElementCompositionPreview.SetElementChildVisual(LayoutRoot as UIElement, blurVisual);
}
}
其中 LayoutRoot
是用作根面板的 RelativePanel
。
但有些东西不起作用:什么?
我如何将它应用于 UIElement
,例如 Page
或 Panel
?
非常感谢您的帮助,谢谢。
我自己解决了:必须手动指定 SpriteVisual
大小(使其适合 UIElement
目标)和 UIElement 本身的 sizeChanged
事件。
这里是示例代码,我使用了通用的 Panel
class(为了方便地使用 Panel.ActualWidth/ActualHeight
属性...),但是每个 UIElement
是否适合亚克力效果:
private Compositor compositor;
private SpriteVisual hostVisual;
private void applyAcrylicAccent(Panel e)
{
compositor = ElementCompositionPreview.GetElementVisual(e).Compositor;
hostVisual = compositor.CreateSpriteVisual();
hostVisual.Size = new System.Numerics.Vector2((float)e.ActualWidth, (float)e.ActualHeight);
// You can choose which effect you want, it is indifferent
GaussianBlurEffect blurEffect = new GaussianBlurEffect()
{
Name = "Blur",
BlurAmount = 0.0f,
BorderMode = EffectBorderMode.Hard,
Optimization = EffectOptimization.Balanced,
Source = new CompositionEffectSourceParameter("source"),
};
var factory = compositor.CreateEffectFactory(blurEffect, null);
var effectBrush = factory.CreateBrush();
effectBrush.SetSourceParameter("source", compositor.CreateHostBackdropBrush());
hostVisual.Brush = effectBrush;
ElementCompositionPreview.SetElementChildVisual(e, hostVisual);
}
和与目标UIElement
关联的sizeChanged
事件(此处称为LayoutRoot):
private void LayoutRoot_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (hostVisual != null)
{
hostVisual.Size = new System.Numerics.Vector2((float)e.NewSize.Width, (float)e.NewSize.Height);
}
}
尽情享受吧。
;D
这是示例 XAML 代码,以避免在您要应用亚克力装饰时其他视觉元素消失:
<SomePanelSubclass "rootGrid">
<SomePanelSubclassForAcrylic>
<SomePanelSubclass "AcrylicGrid"/>
<!-- Comment: some background is needed in order to make elements more visible -->
<SomeElementWithBackgroundProperty Background="SomeBrush" Canvas.ZIndex="ValueAboveZero"/>
</SomePanelSubclassForAcrylic>
<AllOtherChildrenElements Canvas.ZIndex="ValueAboveZero"/>
</SomePanelSubclass>
您只能将 Acrylic Accent 应用于 "AcrylicGrid"。 请记住:应用了 Acrylic Accents 的 UIElement 的所有子元素都将 "disappear",因此目标 Acrylic UIElement 不能有子元素。
您可以将所有其他 XAML 元素放入一个单独的 IPanel 元素中,以简化 Canvas.ZIndex 事情,以便仅将其应用于面板本身。
显然这只是一个示例片段,因此您可以使用您想要的任何名称重命名这些元素。
希望对您有所帮助。
;)