【问题标题】:WPF how to stop DropShadowEffect to propagate to child?WPF 如何阻止 DropShadowEffect 传播给孩子?
【发布时间】:2019-09-22 16:07:48
【问题描述】:

我有一个无边框窗口,以 Border 作为根节点,Canvas 作为子节点。 画布用于通过 MouseMove 绘制折线。 边框有一个 DropShadowEffect,这会导致在 Canvas 上绘制的性能显着下降。 我已经看到其他一些帖子建议将边框和画布放在 2 个单独的网格中,但这不适用于我的情况,因为如果我将边框放在网格中,我会失去窗口周围的阴影效果。

还有其他方法可以阻止 Effect 的传播吗?

这是 xaml 代码:

<Window x:Class="Test.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:Test"
    mc:Ignorable="d"
    Title="Test"
    Height="600" Width="1000"
    Background="{x:Null}"
    BorderThickness="0"
    BorderBrush="Black" 
    AllowsTransparency="True"
    WindowStyle="None">

<WindowChrome.WindowChrome>
    <WindowChrome
    CaptionHeight="0"
    ResizeBorderThickness="5,5,20,20"/>
</WindowChrome.WindowChrome>

<Border x:Name="borderShadow" Margin="0,0,15,15" BorderThickness="2,1" BorderBrush="Black" Background="#FF355870">
    <Border.Effect>
        <DropShadowEffect Color="Black"
                      Direction="315"
                      BlurRadius="15"
                      ShadowDepth="10"/>
    </Border.Effect>

    <Grid Background="#FF355870">
        <Canvas x:Name="canvasBoard" Background="#00000000" MouseMove="canvasBoard_MouseMove" MouseDown="canvasBoard_MouseDown" MouseUp="canvasBoard_MouseUp"/>
    </Grid>
</Border>
</Window>

【问题讨论】:

  • 该效果将应用于它所应用到的控件内的任何东西。网格将剪辑效果。画布需要在您应用该效果的任何地方之外。它不会剪辑。并且窗口是一个内容控件,所以它只能有一个根控件。你可能是最好的画布。将边框放在其中并将其设置为 hittestvisible false 以便您的所有事件都能正常工作。
  • @Andy 谢谢你的回答!不幸的是,我不能按照您的建议做,因为真正的应用程序将具有其他网格和带有边距和填充的控件,并且画布将位于其他网格之一中,因此如果我将具有效果的边框放在 Canvas 内,它将不适用Window 的阴影,但包含 Canvas 的网格。有没有办法告诉画布不要使用父级的效果?
  • 你无法避免将效果应用到子控件。

标签: c# wpf dropshadoweffect


【解决方案1】:

您可以通过这种方式将 Border 单独放在 Grid 中:

<Grid>
<Border x:Name="borderShadow" Margin="0,0,15,15" BorderThickness="2,1" BorderBrush="Black" Background="#FF355870">
    <Border.Effect>
        <DropShadowEffect Color="Black"
                      Direction="315"
                      BlurRadius="15"
                      ShadowDepth="10"/>
    </Border.Effect>
</Border>
<Grid Background="#FF355870">
    <Canvas x:Name="canvasBoard" Background="#00000000" MouseMove="canvasBoard_MouseMove" MouseDown="canvasBoard_MouseDown" MouseUp="canvasBoard_MouseUp"/>
</Grid>
</Grid>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 2012-02-27
    • 2017-06-15
    • 1970-01-01
    • 2021-10-18
    • 2021-10-29
    • 2011-04-17
    相关资源
    最近更新 更多