2

我有一种风格,它去除了通常的窗户镀铬并用航空效果玻璃代替它(代码在底部)。

如果您查看指示的线,我正在使用黑盒来使玻璃变暗但保持半透明(我从中获取的示例使用白盒用于类似目的)。我遇到的问题是黑框出现在控制框上方。带有和不带有黑框的窗口的屏幕截图...

在此处输入图像描述 在此处输入图像描述

(包括记事本供参考)。我想让窗口变暗,但这会使控件无法使用我当前的方法。另外,请注意悬停在我的表格上的红色光芒X在我的表格之外是明亮的,但在里面是黑暗的。

所以,我的具体问题是......如何让控制框呈现在“背景”层之上?

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

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

  • 黑暗(不是真的工作)
  • 通常的 3 个控制按钮(如果不是上述情况,可能会起作用)
  • 可调整大小 *
  • 使用标题栏区域可拖动 *
  • 半透明 *
  • chrome 和我的窗口之间没有“控制”边框 *

我提到那份洗衣单只是为了让你知道我需要用任何解决方案做什么。我正在使用 .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>
4

1 回答 1

1

据我了解,您正试图通过在所有内容之上渲染一个黑色大矩形来使整个玻璃区域变暗,但您希望窗口控制按钮不受影响。遗憾的是,这种方法不起作用,因为如果您使用自定义窗口镶边,那么您将无法有选择地决定在玻璃顶部或下方渲染什么;它将始终呈现在顶部。据我所知,这样做的唯一方法是重新实现按钮,因为它们是半透明的,所以无论您更改航空玻璃的颜色还是仅使用矩形,按钮将始终是做作的。这在 Windows 10 中尤为明显;如果您更改航空玻璃颜色,按钮的背景也会发生变化,但在 windows 8、7 和 vista 中也是如此。

于 2017-03-26T22:27:23.753 回答