在 UWP 中动态调整阴影大小

Posted

技术标签:

【中文标题】在 UWP 中动态调整阴影大小【英文标题】:Dynamically resizing shadow in UWP 【发布时间】:2022-01-10 05:34:04 【问题描述】:

我正在为 GridView 项目添加阴影。下面的代码可以做到这一点,但是我的 GridView 项目可以根据窗口大小调整大小。并且阴影不会随之调整大小。我明白为什么不这样做,因为我只是在阴影上设置了一个静态大小,但我不知道如何使阴影与它后面的网格一起调整大小。

这是我的代码:

private void Item_Loaded(object sender, RoutedEventArgs e)

    var root = (UIElement)sender;
    InitializeShadowAnimation(root, FindVisualChild<Canvas>(root));


private void InitializeShadowAnimation(UIElement root, UIElement shadowHost)

    var rootVisual = ElementCompositionPreview.GetElementVisual(root);
    var shadowHostVisual = ElementCompositionPreview.GetElementVisual(shadowHost);
    var compositor = shadowHostVisual.Compositor;

    var shadow = compositor.CreateDropShadow();
    shadow.BlurRadius = 35f;
    shadow.Offset = new Vector3(15, 15, 5);

    var shadowVisual = compositor.CreateSpriteVisual();
    shadowVisual.Shadow = shadow;

    var size = new Vector2(0, 0);

    if (root is FrameworkElement element)
    
        size = new Vector2((float)element.ActualWidth - 50, (float)element.ActualHeight - 50);
    

    shadowVisual.Size = size;

    ElementCompositionPreview.SetElementChildVisual(shadowHost, shadowVisual);

这里是数据模板对应的xaml代码:

<DataTemplate x:Key="CardViewItemTemplate" x:DataType="data:MyData">

    <Grid x:Name="MainGrid" Loaded="Item_Loaded" Tag="Binding" >

        <Canvas x:Name="ShadowContainer"/>
        
    </Grid>
    
</DataTemplate>

提前致谢。

【问题讨论】:

【参考方案1】:

虽然可能不是最优雅的解决方案,但我的解决方案是为 size changed 事件添加一个方法并重置阴影。

private void Item_SizeChanged(object sender, SizeChangedEventArgs e)

    var root = (UIElement)sender;
    UIElement shadowHost = FindVisualChild<Canvas>(root);
    var shadowVisual = ElementCompositionPreview.GetElementChildVisual(shadowHost);

    if (shadowVisual == null)
    
        return;
    

    var size = new Vector2(0, 0);

    if (root is FrameworkElement element)
    
        size = new Vector2((float)element.ActualWidth - 50, (float)element.ActualHeight - 50);
    

    shadowVisual.Size = size;

【讨论】:

以上是关于在 UWP 中动态调整阴影大小的主要内容,如果未能解决你的问题,请参考以下文章

UWP Button添加圆角阴影

HTML/CSS - 阴影图像调整大小

UWP Button添加圆角阴影

C# UWP Toolkit DropShadowPanel 内阴影

[UWP]使用GetAlphaMask和ContainerVisual制作长阴影

ue5阴影透明度调节