我正在检查 0x2518122231343141 库(v 3.5.41019.1)中的 WindowChrome 类。当我尝试创建 System.Windows.Shell 模板时,模板中 Window 元素的边距似乎没有效果:

<Window x:Class="WpfApplication7.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:shell="clr-namespace:Microsoft.Windows.Shell;assembly=Microsoft.Windows.Shell"
        Title="MainWindow" Height="350" Width="525" Style="{DynamicResource WindowStyle1}">
    <Window.Resources>
        <Style x:Key="WindowStyle1" TargetType="{x:Type Window}">
<!-- Here is the WindowChrome.-->
            <Setter Property="shell:WindowChrome.WindowChrome">
                <Setter.Value>
                    <shell:WindowChrome />
                </Setter.Value>
            </Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Window}">
<!-- And here is the Border. Its margin has no effect as far as I can tell.-->
                        <Border Margin="25" Background="Red">
                            <AdornerDecorator>
                                <ContentPresenter/>
                            </AdornerDecorator>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <Grid>

    </Grid>
</Window>

你认为这是什么原因?我想知道,因为我看到有些人使用类似*:
<Border x:Name="WindowBorder" Margin="{Binding Source={x:Static shell:SystemParameters2.Current}, Path=WindowNonClientFrameThickness}" Background="Red">

但由于它在我的测试中没有任何影响,这样做的意义何在?

(*) 它使用的地方之一是 ModernUI 上的 CodePlex 项目。

编辑: 我已经在打开 Aero 的 Windows 7 上对此进行了测试。

编辑 2: 关闭 Aero 时还是一样。

最佳答案

根据 MSDN,WindowChrome



在阅读 MSDN 示例并播放您的代码一段时间后,我注意到您的代码应该类似于 MSDN 示例代码中的以下内容:

<Style x:Key="StandardStyle" TargetType="{x:Type local:MainWindow}">
<Setter Property="shell:WindowChrome.WindowChrome">
    <Setter.Value>
        <shell:WindowChrome />
    </Setter.Value>
</Setter>
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="{x:Type local:MainWindow}">
            <!--Note there is a Grid as the root-->
            <Grid>
                <Border Background="White"
                        Margin="{Binding Source={x:Static shell:SystemParameters2.Current}, Path=WindowNonClientFrameThickness}">
                    <ContentPresenter Content="{TemplateBinding Content}" />
                </Border>
                <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Title}"
                           VerticalAlignment="Top" HorizontalAlignment="Left"
                           Margin="36,8,0,0"/>
                <Image Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Icon}"
                       VerticalAlignment="Top" HorizontalAlignment="Left"
                       Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(shell:WindowChrome.WindowChrome).ResizeBorderThickness}"
                       Width="{Binding Source={x:Static shell:SystemParameters2.Current}, Path=SmallIconSize.Width}"
                       shell:WindowChrome.IsHitTestVisibleInChrome="True"/>
            </Grid>
        </ControlTemplate>
    </Setter.Value>
</Setter>

请注意,有一个 Grid 作为根元素,其中包含一些用于自定义窗口 NC 的元素。

更新:

您可能会在 MSDN 页面的备注中注意到,它包含以下部分:
WindowStyle.NoneWindowChrome
这是自定义 WPF 应用程序窗口外观的两种方法。

但是,将 Window.WindowStyle 属性设置为 WindowStyle.None :



然后引入 WindowChrome 来启用使用 WPF 的 NC 自定义:



所以回到你的问题,你找到的模板应该从 MSDN 示例代码中复制,但错过了真正的根 Grid
边界上的边距是为了给 NC 一些空间。
在 MSDN 示例代码中,ContenPreseter 只包含客户区,而 NC 包含 Border ,窗口标题 TextBlock 和窗口图标 0x2518122431343。

回顾一下,设置 Image 使您可以在 WindowChrome 中自定义窗口的 NC 区域。

注:
.Net 4.5 中的示例 MSDN 示例代码似乎有点过时, Window.Template 现在位于 System.Windows.Shell.WindowChrome 中,因此代码可能如下所示:
<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" Style="{DynamicResource WindowStyle1}" Icon="Icon1.ico">
<Window.Resources>
    <Style x:Key="WindowStyle1" TargetType="{x:Type Window}">
        <Setter Property="WindowChrome.WindowChrome">
            <Setter.Value>
                <WindowChrome />
            </Setter.Value>
        </Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Window}">
                    <Grid>
                        <Border Background="Red"
                        Margin="{Binding Source={x:Static SystemParameters.WindowNonClientFrameThickness}}">
                            <ContentPresenter Content="{TemplateBinding Content}" />
                        </Border>
                        <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Title}"
                           VerticalAlignment="Top" HorizontalAlignment="Left"
                           Margin="36,8,0,0"/>
                        <Image Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Icon}"
                       VerticalAlignment="Top" HorizontalAlignment="Left"
                       Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=WindowChrome.WindowChrome.ResizeBorderThickness}"
                       Width="{Binding Source={x:Static SystemParameters.SmallIconWidth}}"
                       WindowChrome.IsHitTestVisibleInChrome="True"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>
<Grid>
    <Button />
</Grid>

关于c# - Window 模板中的边距与 WindowChrome 一起使用时没有任何影响,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16609696/

10-13 07:39