自定义 WPF 窗口样式 [英] Custom WPF window style

查看:37
本文介绍了自定义 WPF 窗口样式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试制作自定义窗口样式.目标是创建一个模板,我的应用程序中的每个窗口都可以使用该模板.模板包含工具栏、标题和窗口将使用的区域".问题是:当我使用我的样式时,我无法再添加网格和控件.

I'm trying to make a custom window style. The goal is to create a template that migth be used by every window in my application. Template contains the toolbar, title and "the area which will be used by window". The problem is: When I use my style I can no longer add grid and conrols.

应用程序.xaml

<Style x:Key="CustomWindowStyle" TargetType="{x:Type Window}">
  <Setter Property="WindowStyle" Value="None"/>
  <Setter Property="AllowsTransparency" Value="True"/>
  <Setter Property="ResizeMode" Value="NoResize"/>
  <Setter Property="Background" Value="MintCream"/>
  <Setter Property="BorderBrush" Value="#0046E7"/>
  <Setter Property="BorderThickness" Value="2"/>
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type Window}">
        <Grid Background="{TemplateBinding Background}">
          <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition/>
          </Grid.RowDefinitions>
          <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition Width="Auto"/>
          </Grid.ColumnDefinitions>
          <StackPanel Grid.ColumnSpan="2">
            <TextBlock TextAlignment="Center"
                       Margin="0 10 0 0"
                       FontSize="22"
                       FontWeight="DemiBold"
                       Foreground="RoyalBlue"
                       Text="{TemplateBinding Title}"/>
          </StackPanel>
          <StackPanel Grid.Row="0" Grid.Column="1"
                      Orientation="Horizontal"
                      HorizontalAlignment="Stretch"
                      VerticalAlignment="Center"
                      Margin="0 10 15 0">
            <Button Style="{StaticResource MinimizeButtonStyle}"
                    Width="25"
                    Height="22"
                    Margin="0 0 10 0"/>
            <Button Style="{StaticResource CloseButtonStyle}"
                    Width="25"
                    Height="22"/>
          </StackPanel>
        </Grid>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

主窗口.xaml

<Window x:Class="WindowForHW2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WindowForHW2"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525"
    Style="{StaticResource CustomWindowStyle}">
<Grid>
  <Button Width="100" Height="40" Content="Hello"/>
</Grid>

模板有效,但我不能再添加了:

Template Works, but I cannot add smth anymore:

推荐答案

您需要在 WindowContent 处添加一个 ContentPresenter去.试试这个.

You need to add a ContentPresenter where the Content of your Window goes. Try this.

<Style x:Key="CustomWindowStyle" TargetType="{x:Type Window}">
  <Setter Property="WindowStyle" Value="None"/>
  <Setter Property="AllowsTransparency" Value="True"/>
  <Setter Property="ResizeMode" Value="NoResize"/>
  <Setter Property="Background" Value="MintCream"/>
  <Setter Property="BorderBrush" Value="#0046E7"/>
  <Setter Property="BorderThickness" Value="2"/>
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type Window}">
        <Grid Background="{TemplateBinding Background}">
          <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
          </Grid.RowDefinitions>
          <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition Width="Auto"/>
          </Grid.ColumnDefinitions>
          <StackPanel Grid.ColumnSpan="2">
            <TextBlock TextAlignment="Center"
                       Margin="0 10 0 0"
                       FontSize="22"
                       FontWeight="DemiBold"
                       Foreground="RoyalBlue"
                       Text="{TemplateBinding Title}"/>
          </StackPanel>
          <StackPanel Grid.Row="0" Grid.Column="1"
                      Orientation="Horizontal"
                      HorizontalAlignment="Stretch"
                      VerticalAlignment="Center"
                      Margin="0 10 15 0">
            <Button Content="+"
                    Width="25"
                    Height="22"
                    Margin="0 0 10 0"/>
            <Button Content="X"
                    Width="25"
                    Height="22" />
          </StackPanel>
        <!-- here goes the content -->
        <ContentPresenter Grid.Row="1"/>
       </Grid>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

这篇关于自定义 WPF 窗口样式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆