UWP。如何在不使用DropShadowPanel的情况下在代码中实现DropShadow
我不是使用Windows composition API的专家。如何在UWP中的控件、布局或任何视觉控件上实现DropShadow,而无需出于某些目的使用UWP。如何在不使用DropShadowPanel的情况下在代码中实现DropShadow,uwp,styling,dropshadow,dropshadoweffect,Uwp,Styling,Dropshadow,Dropshadoweffect,我不是使用Windows composition API的专家。如何在UWP中的控件、布局或任何视觉控件上实现DropShadow,而无需出于某些目的使用DropShadowPanel。附上一个例子会很棒。另外,请确保阴影效果位于控件后面,并且不会在代码中覆盖它,您已经从控件的合成器创建了一个SpriteVisual,并配置了SpriteVisual的阴影,但是您不能将名为shadowVisual的SpriteVisual设置为可视化树的子级,这样您就看不到要应用的阴影。您可以将以下代码放在代码
DropShadowPanel
。附上一个例子会很棒。另外,请确保阴影效果位于控件后面,并且不会在代码中覆盖它,您已经从控件的合成器创建了一个SpriteVisual
,并配置了SpriteVisual
的阴影,但是您不能将名为shadowVisual
的SpriteVisual
设置为可视化树的子级,这样您就看不到要应用的阴影。您可以将以下代码放在代码块的末尾
。。。
ElementCompositionPreview.SetElementChildVisual(控件,shadowVisual);
您的代码如下所示:
//控件是应用阴影的控件。e、 g.按钮、文本块等。
Compositor Compositor=ElementCompositionPreview.GetElementVisual(控件).Compositor;
var shadowVisual=compositor.CreateSpriteVisual();
var dropShadow=compositor.CreateDropShadow();
shadowVisual.Shadow=dropShadow;
//UpdateShadowSize
Vector2 newSize=新Vector2(0,0);
if(控件为FrameworkElement contentFE)
{
newSize=newvector2((float)contentFE.ActualWidth,(float)contentFE.ActualHeight);
//newSize=新向量2(200,60);
}
shadowVisual.Size=newSize;
//现在有一些硬编码的值
dropShadow.BlurRadius=8;
dropShadow.Opacity=0.3f;
dropShadow.Offset=newvector3(newvector2(2,2),0);
dropShadow.Color=Windows.UI.Colors.Black;
//将视觉对象设置为控件视觉树的子级。
ElementCompositionPreview.SetElementChildVisual(控件,shadowVisual);
注意:我将dropShadow.Opacity
更改为0.3f
,以使阴影更清晰
---更新---
是的,你可以在主要内容后面放置一个特殊的元素,然后从这个元素创建阴影,使阴影位于主要内容后面GetAlphaMask
方法应该可以工作,这里是一个示例,您可以试一试
xaml:
代码隐藏:
private void Grid\u已加载(对象发送方、路由目标方)
{
//画布是创建阴影的元素
var compositor=ElementCompositionPreview.GetElementVisual(canvas.compositor);
var dropShadow=compositor.CreateDropShadow();
dropShadow.Color=Colors.Green;
dropShadow.BlurRadius=8;
dropShadow.Opacity=20.0f;
dropShadow.Offset=新矢量3(2.5F,2.5F,0);
//文本块是主要内容
var mask=textBlcok.GetAlphaMask();
dropShadow.Mask=Mask;
var spriteVisual=compositor.CreateSpriteVisual();
spriteVisual.Size=newvector2((float)canvas.ActualWidth,(float)canvas.ActualHeight);
spriteVisual.Shadow=dropShadow;
ElementCompositionPreview.SetElementChildVisual(画布、spriteVisual);
}
此应用程序包含许多用于构建漂亮uwp应用程序的控件,它有一个阴影库,您可以看到如何在项目中实现它,并为任何控件提供阴影DropShadowPanel是开源Windows社区工具包的一部分。你可以看看它的源代码,看看它是如何在我写了一段代码,这取决于我对UWP控制机制的理解。这就是块:但是它没有被应用。我的代码中有什么错误吗?我发现了,阴影被应用了,但是我覆盖了元素。因此,我们所做的是一个特殊的元素,名为ShadowElement,位于主内容后面。现在我在主要内容后面应用了阴影,这就是我们想要的。我面临的另一个问题是面具。UWP DropShadowPanel使用GetAlphaMask为形状和文本获取特定类型的阴影。我使用了相同的代码,但它不起作用。我已经用示例代码添加了更新部分,您可以尝试使用GetAlphaMask方法。如果删除设置遮罩的代码,您将看到阴影将应用于所有画布范围。