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

时间:2018-08-14 18:45:04

标签: uwp styling dropshadow dropshadoweffect

我不是使用Windows合成API的专家。如何在UWP中的控件或布局或任何可视控件上实现DropShadow,而无需出于某些目的使用DropShadowPanel。附带的示例将很棒。另外,请确保阴影效果在控件的后面并且没有覆盖

2 个答案:

答案 0 :(得分:1)

在您的代码中,您已经从控件的 Compositor 中创建了一个SpriteVisual,并配置了SpriteVisual的阴影,但是您没有设置此{{1} }命名为SpriteVisual作为Visual树的子级,这样您就看不到要应用的阴影。您只需将以下代码放在代码块的末尾即可。

shadowVisual

您的代码将如下所示:

...
ElementCompositionPreview.SetElementChildVisual(Control, shadowVisual);

注意:我将//Control is the control the shadow is applied to. e.g. Button, TextBlock etc. Compositor compositor = ElementCompositionPreview.GetElementVisual(Control).Compositor; var shadowVisual = compositor.CreateSpriteVisual(); var dropShadow = compositor.CreateDropShadow(); shadowVisual.Shadow = dropShadow; //UpdateShadowSize Vector2 newSize = new Vector2(0, 0); if (Control is FrameworkElement contentFE) { newSize = new Vector2((float)contentFE.ActualWidth, (float)contentFE.ActualHeight); //newSize = new Vector2(200, 60); } shadowVisual.Size = newSize; //Some hardcoded values for now dropShadow.BlurRadius = 8; dropShadow.Opacity = 0.3f; dropShadow.Offset = new Vector3(new Vector2(2, 2), 0); dropShadow.Color = Windows.UI.Colors.Black; // Sets a Visual as child of the Control’s visual tree. ElementCompositionPreview.SetElementChildVisual(Control, shadowVisual); 更改为dropShadow.Opacity,以使阴影更清晰。

---更新---

是的,您可以在MainContent后面放置一个特殊元素,然后从该元素创建阴影以在Main内容后面创建阴影。 0.3f方法应该可以使用,下面是一个示例,您可以尝试一下。

xaml:

GetAlphaMask

后面的代码:

<Grid Loaded="Grid_Loaded">
    <!-- Canvas to create shadow-->
    <Canvas Name="canvas"/>
    <TextBlock x:Name="textBlcok" Text="this is text blcok for test shadow"/>
</Grid>

答案 1 :(得分:0)

https://www.microsoft.com/en-us/p/windows-community-toolkit-sample-app/9nblggh4tlcq

此应用程序包含许多控件,可用来构建漂亮的uwp应用程序,它具有一个影子库,您可以查看如何在项目中实现它,并为任何控件提供一个影子