使用WindowChrome在WPF窗口上显示默认窗口按钮

时间:2017-05-25 21:22:00

标签: wpf xaml window-chrome

我发现在WPF窗口上使用WindowChrome可以让我在窗口中的任何地方放置内容,这是一个很好的想法。现在我终于可以让标题栏与我的其他应用程序颜色相同。

但是,我仍然喜欢非样式窗口中显示的默认最小化/最大化/关闭按钮。

有什么方法可以使用WindowChrome设置我的Window样式但仍保留默认按钮?

<Style x:Key="MainWindow" TargetType="{x:Type Window}">
    <Setter Property="WindowChrome.WindowChrome">
        <Setter.Value>
            <WindowChrome CaptionHeight="30" ResizeBorderThickness="5" />
        </Setter.Value>
    </Setter>
</Style>

<Window Style="{StaticResource MainWindow}">
    <Grid Background="Black">
        <MyContent />
    </Grid>
</Window>

这会形成一个很大的黑色窗口(太棒了!),但没有任何最小/最大/关闭按钮,因为它们隐藏在Grid后面(不太好)。但是按钮仍然是可点击的,所以它们显然在那里。

2 个答案:

答案 0 :(得分:4)

  

有什么方法可以使用WindowChrome设置我的Window样式但仍保留默认按钮?

不,我不这么认为。您可以将GlassFrameThickness属性设置为0以禁用按钮,然后您将不得不创建自己的自定义属性。您可以参考以下项目中的一些示例:https://wpfwindow.codeplex.com/

如果您需要Window 10样式字幕按钮,可以使用Segoe MDL2 Assets字体系列:

<Style x:Key="CaptionButtonStyle" TargetType="Button">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Grid x:Name="LayoutRoot" Background="Transparent" Width="44" Height="30">
                    <TextBlock x:Name="txt" Text="{TemplateBinding Content}" FontFamily="Segoe MDL2 Assets" FontSize="10" 
                                   Foreground="#999999" HorizontalAlignment="Center" VerticalAlignment="Center"
                                   RenderOptions.ClearTypeHint="Auto" TextOptions.TextRenderingMode="Aliased"  TextOptions.TextFormattingMode="Display"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter TargetName="LayoutRoot" Property="Background" Value="#E5E5E5"/>
                        <Setter TargetName="txt" Property="Foreground" Value="#000000"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style x:Key="MinimizeButtonStyle" TargetType="Button" BasedOn="{StaticResource CaptionButtonStyle}">
    <Setter Property="Content" Value="&#xE949;"/>
</Style>

<Style x:Key="MaximizeButtonStyle" TargetType="Button" BasedOn="{StaticResource CaptionButtonStyle}">
    <Setter Property="Content" Value="&#xE739;"/>
</Style>

<Style x:Key="RestoreButtonStyle" TargetType="Button" BasedOn="{StaticResource CaptionButtonStyle}">
    <Setter Property="Content" Value="&#xE923;"/>
</Style>

答案 1 :(得分:2)

在Windows 10推出之前,您可以在外部$data = Array(["1","2"],["5"]); $result = array_map('intval', array_reduce($data, 'array_merge', array())); print_r($result); 添加Window.Template属性来自定义Margin。就像下面的代码一样。

Border

上面的代码执行以下操作:

  1. 使用<Window.Template> <ControlTemplate TargetType="Window"> <Border Background="#3FFFFFFF"> <AdornerDecorator Margin="8 10 8 8"> <Border> <ContentPresenter/> </Border> </AdornerDecorator> </Border> </ControlTemplate> </Window.Template> <WindowChrome.WindowChrome> <WindowChrome UseAeroCaptionButtons="True" GlassFrameThickness="8 30 8 8"/> </WindowChrome.WindowChrome> 使我们的控件显示在窗口上方没有客户区域。
  2. 避免我们的控件覆盖窗口标题按钮。
  3. 如果您想在标题栏上方显示一些控件,请将其WindowChrome属性设置为负数,例如Margin
  4. 但是在Windows 10之后,尤其是Windows 10 Creators Update,您无法再显示具有可接受窗口样式的Windows默认按钮。它总会显示一个主题边框,丑陋!

    0 -30 0 0

    上面的代码可能适用于早期版本的Windows 10.我的意思是,不像创建者更新那样难看。