在您的代码中,您已经从控件的 Compositor 创建了一个SpriteVisual 并配置了SpriteVisual 的阴影,但是您没有将这个名为shadowVisual 的SpriteVisual 设置为视觉树的一个孩子,这样您就看不到要应用的阴影。您可以将以下代码放在代码块的末尾。
...
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 更改为0.3f 以使阴影更清晰。
---更新---
是的,您可以在 MainContent 后面放置一个特殊元素,然后从该元素创建阴影以在 Main 内容后面制作阴影。 GetAlphaMask 方法应该可以,这里有一个例子,你可以试试。
xaml:
<Grid Loaded="Grid_Loaded">
<!-- Canvas to create shadow-->
<Canvas Name="canvas"/>
<TextBlock x:Name="textBlcok" Text="this is text blcok for test shadow"/>
</Grid>
后面的代码:
private void Grid_Loaded(object sender, RoutedEventArgs e)
{
//The canvas is the element to create shadow
var compositor = ElementCompositionPreview.GetElementVisual(canvas).Compositor;
var dropShadow = compositor.CreateDropShadow();
dropShadow.Color = Colors.Green;
dropShadow.BlurRadius = 8;
dropShadow.Opacity = 20.0f;
dropShadow.Offset = new Vector3(2.5F, 2.5F, 0);
//The textBlock is the main content
var mask = textBlcok.GetAlphaMask();
dropShadow.Mask = mask;
var spriteVisual = compositor.CreateSpriteVisual();
spriteVisual.Size = new Vector2((float)canvas.ActualWidth, (float)canvas.ActualHeight);
spriteVisual.Shadow = dropShadow;
ElementCompositionPreview.SetElementChildVisual(canvas, spriteVisual);
}