Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
UWP。如何在不使用DropShadowPanel的情况下在代码中实现DropShadow_Uwp_Styling_Dropshadow_Dropshadoweffect - Fatal编程技术网

UWP。如何在不使用DropShadowPanel的情况下在代码中实现DropShadow

UWP。如何在不使用DropShadowPanel的情况下在代码中实现DropShadow,uwp,styling,dropshadow,dropshadoweffect,Uwp,Styling,Dropshadow,Dropshadoweffect,我不是使用Windows composition API的专家。如何在UWP中的控件、布局或任何视觉控件上实现DropShadow,而无需出于某些目的使用DropShadowPanel。附上一个例子会很棒。另外,请确保阴影效果位于控件后面,并且不会在代码中覆盖它,您已经从控件的合成器创建了一个SpriteVisual,并配置了SpriteVisual的阴影,但是您不能将名为shadowVisual的SpriteVisual设置为可视化树的子级,这样您就看不到要应用的阴影。您可以将以下代码放在代码

我不是使用Windows composition API的专家。如何在UWP中的控件、布局或任何视觉控件上实现DropShadow,而无需出于某些目的使用
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方法。如果删除设置遮罩的代码,您将看到阴影将应用于所有画布范围。