WPF:如何在无自定义边框的窗口上添加投影效果

4

我在WPF-Windows上使用WindowStyle=None和ResizeMode=NoResize时遇到了投影问题。是否有任何好的替代方法可以在窗口内容上使用DropShadow-effect?我尝试过Shell Integration Library中的WindowChrome,但当ResizeMode=NoResize时没有显示任何“Chrome”。

如果能够在窗口边框外部绘制wpf-drop-shadow,那么可能是一个解决方案。如果我将阴影绘制在窗口内部,则会出现不同于标准行为的情况,例如在移动鼠标光标时。在执行此操作时,我的窗口不应进行命中测试,并且单击此区域应激活后面的窗口等。

Zune似乎绘制了自己的投影,因为它看起来并不像标准Chrome-shadow那样。但它的行为方式就像普通的投影,不会捕获鼠标事件。我想知道他们是如何做到这一点的。

Spotify还有另一种不会捕获鼠标事件的阴影。

我猜这些应用程序完全绘制了自己的WindowChrome,但是如何实现呢?在WPF中是否支持这个功能?

<Window x:Class="ShellIntegrationTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:shell="clr-namespace:Microsoft.Windows.Shell;assembly=Microsoft.Windows.Shell"
        Title="MainWindow" Height="512" Width="384" WindowStyle="None" ResizeMode="NoResize">
  <shell:WindowChrome.WindowChrome>
    <shell:WindowChrome ResizeBorderThickness="5" GlassFrameThickness="-1" CornerRadius="0" CaptionHeight="25" />
  </shell:WindowChrome.WindowChrome>
</Window>

请展示您的XAML,以便我们了解您想要实现什么。 - Emond
3个回答

2

如果窗口设置为不可调整大小且样式为无边框,则此代码将在窗口上显示阴影。

    xmlns:local="clr-namespace:BorderTest" 
    mc:Ignorable="d" WindowStyle="None" ResizeMode="NoResize"
   Title="MainWindow" Height="350" Width="525" AllowsTransparency="True" Background="Transparent">
<Border Margin="10" BorderThickness="1" BorderBrush="Blue">
    <Border.Effect>
        <DropShadowEffect Color="Black"
                          Direction="270"
                          BlurRadius="10"
                          ShadowDepth="3" />
    </Border.Effect>
    <Grid Background="White">

    </Grid>
</Border>


0
如果您将ResizeMode更改为CanResize并将ResizeBorderThickness设置为0,则会得到一个无边框窗口,该窗口无法调整大小,并且可以通过单击投影来激活其后面的窗口。

0
<Window 
    .........
    .........
    .........
    Title="Welcome" Loaded="Window_Loaded" Height="400" Width="400" ResizeMode="NoResize" AllowsTransparency="True" WindowStyle="None" ShowInTaskbar="False" WindowStartupLocation="CenterScreen" Background="Transparent" BorderThickness="0">
<Border Margin="10" CornerRadius="100"
        BorderBrush="Black"
        BorderThickness="1"
        CornerRadius="10">
    <Border.Effect>
        <DropShadowEffect />
    </Border.Effect>

    <Grid> 
     ...
     ...//main design inside windows
     ...
    </Grid>
</Border>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接