WPF:在没有自定义镶边的无边框窗口上投影

时间:2011-05-11 14:43:03

标签: wpf dropshadow window-chrome

我在使用WindowStyle = None和ResizeMode = NoResize的WPF窗口上挣扎。在窗口内容上使用DropShadow效果有什么好的选择吗?我在Shell Integration Library中尝试过WindowChrome,但是当ResizeMode = NoResize时它没有显示任何“Chrome”。

如果有可能以某种方式在窗口边框之外绘制一个wpf-drop-shadow,那么它可能是一个解决方案。如果我在窗口内绘制阴影,我会得到一个不同的行为,然后标准,例如将鼠标光标移动到阴影上。执行此操作时,我的窗口中应该没有命中测试,单击此区域应激活后面的窗口等。

Zune似乎正在绘制自己的阴影,因为它看起来不像标准的Chrome阴影。但它的表现就像一个正常的投影,就像它不捕获鼠标事件一样。我不知道他们是怎么做到的。

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>

4 个答案:

答案 0 :(得分:3)

我看到了这一点,因为我试图完成同样的事情。看看我提出的解决方案

Maximum custom window loses drop shadow effect

使用我的解决方案,您仍然可以调整表单

答案 1 :(得分:1)

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

    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>

答案 2 :(得分: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>

答案 3 :(得分:-2)

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