利用资源字典中的 WindowStyle 并将按钮添加到应用程序中的 ControlPresenter

Make use of WindowStyle from resource dictionary and add Buttons to a ControlPresenter in an application

我使用包含我所有样式、图标等的资源字典。 现在我想添加我自己的标题栏来实现解决方案的标题、我的图像和一个 ContentPresenter。 使用 WindowStyle 时,我想在此 ContentPresenter 中添加特定于应用程序的项目,但我不知道如何继续。

这是我的 WindowStyle。在网格内,您会找到我要填充的 ContentPresenter。

<Style TargetType="{x:Type Window}" x:Key="tkDarkWindowStyle">
        <Setter Property="AllowsTransparency" Value="True"></Setter>
        <Setter Property="Foreground" Value="{StaticResource tkBrandBlueBrush}"></Setter>
        <Setter Property="Background" Value="{StaticResource exQuiteDarkBrush}"></Setter>
        <Setter Property="WindowStyle" Value="None"></Setter>
        <Setter Property="BorderThickness" Value="0"></Setter>
        <Setter Property="BorderBrush" Value="{StaticResource exQuiteDarkBrush}"></Setter>
        <Setter Property="WindowChrome.WindowChrome">
            <Setter.Value>
                <WindowChrome CaptionHeight="80" />
            </Setter.Value>
        </Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Window">
                    <DockPanel LastChildFill="True">
                        <Border Background="{TemplateBinding Background}" DockPanel.Dock="Top" 
                            Height="80" x:Name="titlebar">
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition/>
                                    <ColumnDefinition/>
                                </Grid.ColumnDefinitions>
                                <DockPanel Grid.Column="0">
                                    <Path DockPanel.Dock="Left" Margin="10" Stretch="Uniform" Fill="{TemplateBinding Foreground}" Data="{Binding Source={StaticResource tkPrimaryLogo}}" VerticalAlignment="Center">
                                    </Path>
                                    <Label Content="{TemplateBinding Title}" Foreground="{TemplateBinding Foreground}" Margin="10" DockPanel.Dock="Left" FontSize="26" VerticalAlignment="Center"/>
                                </DockPanel>
                                <ContentPresenter Grid.Column="1"/>

                            </Grid>
                        </Border>
                        <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" 
                            BorderThickness="1" Padding="4">
                            <ContentPresenter/>
                        </Border>
                    </DockPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

我使用了这样的样式并尝试编辑模板并向标题栏添加例如一些按钮。

    <Window.Resources>
        <Style TargetType="{x:Type Window}" x:Key="newWindow"  BasedOn="{StaticResource tkDarkWindowStyle}">
            <!--here add application specific items? -->
        </Style>
    </Window.Resources>

如何在我的应用程序中使用 WindowStyle 并将特定项目添加到我留在标题栏的 space?

因为 Window 只有一个 Content 属性,所以在 ControlTemplate 中包含一个以上的 <ContentPresenter /> 元素是没有意义的。

您可能想要创建一个自定义的 class,它继承自 Window 并添加一个名为 "TitleBarContent" 或其他名称的依赖项 属性。然后,您可以将 ContentControl 添加到绑定到此 属性:

的模板
<ContentControl Content="{TemplateBinding TitleBarContent}" />

您可以像往常一样在样式 setter 中设置依赖项 属性 的值:

<Style TargetType="{x:Type local:YourWindowClass}" x:Key="newWindow"  BasedOn="{StaticResource tkDarkWindowStyle}">
    <Setter Property="TitleBarContent">
        <Setter.Value>
            <TextBlock>title...</TextBlock>
        </Setter.Value>
    </Setter>
</Style>