.net 渲染“;“背后”;窗口的镀铬控制框

.net 渲染“;“背后”;窗口的镀铬控制框,.net,wpf,.net-4.5,window-chrome,.net,Wpf,.net 4.5,Window Chrome,我有一个风格,删除了通常的窗口铬,并取代它与空气效果玻璃(代码在底部) 如果你看一下指示的线条,我用一个黑框来加深玻璃,但保持半透明(我从一个白框中拿出来的例子也有类似的用途)。我遇到的问题是,黑匣子出现在控制框上方。有黑匣子和没有黑匣子的窗口截图 (包括记事本以供参考)。我想让窗口更暗,但这会使控件无法使用我目前的方法。另外,请注意,悬浮在X上方的红色光晕在我的表单外部是明亮的,但在表单内部是黑暗的 所以,我的具体问题是。。。如何让控制框在“背景”层上渲染 更一般地说,感觉一定有更好的方法

我有一个风格,删除了通常的窗口铬,并取代它与空气效果玻璃(代码在底部)

如果你看一下指示的线条,我用一个黑框来加深玻璃,但保持半透明(我从一个白框中拿出来的例子也有类似的用途)。我遇到的问题是,黑匣子出现在控制框上方。有黑匣子和没有黑匣子的窗口截图

(包括记事本以供参考)。我想让窗口更暗,但这会使控件无法使用我目前的方法。另外,请注意,悬浮在
X
上方的红色光晕在我的表单外部是明亮的,但在表单内部是黑暗的

所以,我的具体问题是。。。如何让控制框在“背景”层上渲染

更一般地说,感觉一定有更好的方法来做到这一点?我不喜欢尝试模仿太多,因为有太多的边缘案例

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

  • 黑暗(没有真正工作)
  • 常用的3个控制按钮(如果没有上述功能,则可能工作)
  • 可调整大小*
  • 可拖动使用标题栏区域*
  • 半透明的*
  • chrome和我的窗口之间没有“控制”边框*
我提到洗衣单只是为了让你知道我需要如何处理任何解决方案。我使用的是.NET4.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>


据我所知,您正试图通过在所有物体顶部渲染一个大的黑色矩形来使整个玻璃区域变暗,但您希望窗口控制按钮不受影响。可悲的是,这种方法不起作用,因为如果你使用自定义的窗口浏览器,你就不能有选择地决定在玻璃上或玻璃下渲染什么;它将始终在顶部渲染。据我所知,唯一的方法是重新实现按钮,因为它们是半透明的,所以无论你改变空气动力学玻璃的颜色还是仅仅使用矩形,按钮都会受到影响。这在Windows10中尤为明显;如果更改aero glass颜色,按钮的背景也会更改,但在windows 8、7和vista中也是一样的。我想,如果您使用的是Windows XP,那么您可以更改窗口边框的颜色,但如果使用默认按钮,则不太可能更改颜色。

是的,我认为“它不能那样工作”可能是最好的答案。。。遗憾的是,管理WindowChrome需要花费大量精力来模拟股票功能,而不是通过API调用公开股票功能。尽管如此,我还是想到了一些你可以尝试的东西。如果您使用图像处理程序(如Photoshop)创建某种过滤器,该程序在右上角有一个透明部分,您可能会模仿所需的效果。这个问题是,有时当你调整窗口的大小时,它可能会打破过滤器的样子,因为图像总是停留在中间,因此两边会丢失。实际上,现在我想到了,这是不可能创建过滤器的。您所要做的就是在网格中创建两个矩形。使行定义自动和*。然后,使顶部矩形的高度属性为30,并将边距设置为0,0,24,0。然后,对于第二个,只需将其放入。这会给你想要的效果。如果我有时间,我会尝试制作一个示例程序。我为您制作了一个示例程序。另外,我的意思是0,0145,0的边距,因为Windows10。