渲染“后面”的窗口镀铬控制盒

时间:2013-02-27 01:32:13

标签: .net wpf .net-4.5 window-chrome

我有一种风格可以移除通常的窗口铬合金,并将其替换为气动效果玻璃(底部的代码)。

如果你看一下指示的线条,我使用黑盒子使玻璃变暗但保持半透明(我使用白色盒子的例子用于类似的目的)。我遇到的问题是黑匣子出现在控制箱上方。带有和没有黑匣子的窗口的屏幕截图...

enter image description here enter image description here

(包括记事本以供参考)。我想让窗户变暗但是这会使我的当前方法无法控制。此外,请注意悬停在X上方的红色光在我的形状外是如何明亮但在其内部是暗的。

所以,我的具体问题是......我怎样才能让控件盒呈现在"背景"之上?层

更一般地说,感觉必须有更好的方法来做到这一点?我倾向于不喜欢尝试模仿太多边缘情况。

我想要实现的是一个窗口(*如果它现在正在工作):

  • 黑暗(不太正常)
  • 通常3个控制按钮(如果没有,可能会工作)
  • 可调整大小*
  • 使用标题栏区域拖拽*
  • 半透明*
  • 否"控制"铬和我的窗口之间的边界*

我只提到洗衣清单,这样您才能知道我需要对任何解决方案做些什么。我使用的是.Net 4.5,这意味着System.Shell.ChromeWindow包含在框架中,但似乎与我能找到的每个教程中提到的旧版本略有不同。

有人可以指出我正确的方向吗?

<Application.Resources>
    <BitmapImage x:Key="MainIcon"
                 UriSource="./Resources/MainIcon.png" />
    <Style x:Key="Chromeless"
           TargetType="{x:Type Window}">
        <Setter Property="WindowChrome.WindowChrome">
            <Setter.Value>
                <WindowChrome GlassFrameThickness="-1"
                              ResizeBorderThickness="4"
                              CaptionHeight="36" />
            </Setter.Value>
        </Setter>
        <!--pack://application:,,,/Resources/Search.png-->
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Window}">
                    <Grid>
                        <!-- This is the ContentPresenter that displays the window content. -->
                        <Border Margin="0,40,0,25">
                            <ContentPresenter Content="{TemplateBinding Content}" />
                        </Border>

                        <!--This is the transparent white rectangle that goes behind the window content.-->
                        <!-- Window Border Content -->
<!-- HERE ---->             <Border Margin="0"
                                BorderBrush="Gray"
                                BorderThickness="0,1,0,1"
                                Grid.ZIndex="-1">
                            <Rectangle Fill="Black"
                                       Opacity="0.5" />
                        </Border>
                        <!-- System Button -->
                        <Button VerticalAlignment="Top"
                                HorizontalAlignment="Left"
                                Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}"
                                WindowChrome.IsHitTestVisibleInChrome="True"
                                Command="{x:Static SystemCommands.ShowSystemMenuCommand}"
                                CommandParameter="{Binding ElementName=LibraryWindow}"
                                BorderThickness="0">
                            <Image Source="{StaticResource MainIcon}"
                                   Width="64"
                                   Height="64"
                                   WindowChrome.IsHitTestVisibleInChrome="True"
                                   />

                        </Button>
                        <!-- Window Title -->
                        <TextBlock VerticalAlignment="Top"
                                   TextAlignment="Left"
                                   FontSize="15"
                                   Padding="40,8,0,0"
                                   Foreground="White"
                                   Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Title}" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

</Application.Resources>

1 个答案:

答案 0 :(得分:1)

根据我的理解,你试图通过在所有东西上面渲染一个大的黑色矩形来使整个玻璃区域变暗,但是你希望窗口控制按钮不受影响。遗憾的是,这种方法不起作用,因为如果你使用自定义窗口镀铬,那么你无法有选择地决定在玻璃顶部或底部渲染的内容;它总是呈现在最顶层。据我所知,唯一的方法就是重新实现按钮,因为它们是半透明的,所以无论你改变航空玻璃的颜色还是只使用一个矩形,按钮都将是影响。这在Windows 10中尤为明显;如果更改航空玻璃颜色,按钮的背景也会改变,但在Windows 8,7和vista中也是如此。我想如果您使用的是Windows XP,那么您可以更改窗口框架的颜色,但除此之外,使用默认按钮确实无法实现。