wpf:自定义窗口投影

时间:2010-08-21 22:42:29

标签: wpf

我正在使用自定义窗口处理c#wpf应用程序(allowtransparency = true,resize = none,window style = none)。

现在我想添加类似于zune pc软件的投影。我读到了这个,所包含的drophadoweffect并没有涵盖我窗户的所有角度,据说它会扼杀性能。

我想像这样实现它:我在布局网格中添加一个边距,我在最大化应用程序时以编程方式删除。

添加可应用于网格的投影的最佳方法是什么,这不会影响性能并在所有方向上投下阴影?

4 个答案:

答案 0 :(得分:10)

我尝试了这里发布的解决方案,但没有一个让我接近我想要的最终结果(见下面的截图)。所以我尝试了几个不同的东西,并在这里发布我的解决方案,以防有人有兴趣实现类似的东西。顺便说一句:如果你能改进我的解决方案,请告诉我,因为我发现它现在有点多余了。

Window with blue drop shadow effect

现在可以使用驱动此效果的代码:

<Window ...
    WindowStyle="None" AllowsTransparency="True" Background="Transparent"
    ...>

    <Border>
        <Border.Effect>
            // opacity does not need to be specified but it looks cooler when you do
            <DropShadowEffect BlurRadius="20" ShadowDepth="0" Opacity="0.8" 
                Color="Blue" />
        </Border.Effect>

        // make sure the value for Grid Margin is the same as DropShadowEffect 
        // BlurRadius
        <Grid Background="White" Margin="20">

            // I tried setting borderthickness and borderbrush to the previous 
            // <Border> element but instead of the border being shown right after  
            // the grid and before the drop shadow, it would show after the drop 
            // shadow making the overall effect very ugly
            <Border BorderThickness="1" BorderBrush="Black">
                // now you can specify whatever you want to display in the window
                <Grid>
                    ....
                </Grid>
            </Border>
        </Grid>
</Window>

答案 1 :(得分:4)

DropShadowEffect没有“杀死性能”...它是使用硬件加速渲染的,并且在窗口上渲染投影对于当前的GPU来说并不是什么大问题。你可能会混淆DropShadowBitmapEffect,它是软件渲染的。无论如何,所有BitmapEffects在3.5 SP1中已经过时,在4.0中根本不起作用,现在只能使用Effects

答案 2 :(得分:4)

方向-75,ShadowDepth为2,BlurRadius为27对我有帮助。

最好的方法是使用混合来做这些。

HTH

答案 3 :(得分:2)

建立Princes的代码,我想粘贴最终产品。

<Window x:Class="RDNScoreboard.Views.InitialWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="InitialWindow" Height="300" Width="300"
    WindowStyle="None"  
AllowsTransparency="True" Background="Transparent"
   BorderThickness="3"  >
<Border>
    <Border.Effect>
        <DropShadowEffect BlurRadius="27" Color="Black" Opacity="0.8" ShadowDepth="2" Direction="-75" />
    </Border.Effect>
    <Grid Background="White"  >
    </Grid>
</Border>