WPF ControlTemplate触发器

时间:2015-08-16 22:35:35

标签: wpf

全部, 我正在尝试为窗口设置模板。我想要的是根据窗口的状态改变边距和边框厚度。我试图使用Trigger来做,但是当我运行应用程序时,触发器不会触发。我的问题是,当窗口状态发生变化时,如何触发触发器?

我的XAML是(我删除了大部分代码以保持发布简单):

<Window x:Class="WpfApplication1.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:WpfApplication1" Background="#FFE8E8E8"
        Style="{DynamicResource ChromeWindowStyle}"
        mc:Ignorable="d" 
        Title="BaseWindow" Width="500" Height="300">

    <WindowChrome.WindowChrome>
        <WindowChrome ResizeBorderThickness="6" CaptionHeight="0" GlassFrameThickness="0" />
    </WindowChrome.WindowChrome>

    <Window.Resources>
        <Style x:Key="ChromeWindowStyle" TargetType="{x:Type Window}">
            <Setter Property="Foreground" Value="Black"/>
            <Setter Property="Background" Value="#FFE8E8E8"/>
            <Setter Property="WindowStyle" Value="None" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Window}">
                        <Border x:Name="MainBorder" Background="White" BorderBrush="Gray" BorderThickness="1">
                            <DockPanel LastChildFill="True">
                                <Border Height="30" DockPanel.Dock="Top">
                                    <DockPanel LastChildFill="False">
                                        <TextBlock Text="Heading" DockPanel.Dock="Left" VerticalAlignment="Center" />
                                        <Button x:Name="CloseButton" Content="Close" DockPanel.Dock="Right" />
                                        <Button x:Name="MaximizeButton" Content="Max" DockPanel.Dock="Right" />
                                        <Button x:Name="MinButton" Content="Min" DockPanel.Dock="Right"/>
                                    </DockPanel>
                                </Border>
                                <AdornerDecorator DockPanel.Dock="Bottom">
                                    <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}"
                                                  Content="{TemplateBinding Content}"
                                                  ContentStringFormat="{TemplateBinding ContentStringFormat}"/>
                                </AdornerDecorator>
                            </DockPanel>
                        </Border>



                        <!--This piece wont trigger - start -->
                        <ControlTemplate.Triggers>
                            <Trigger Property="WindowState" Value="Normal">
                                <Setter Property="Margin" Value="8" />
                                <Setter Property="BorderThickness" Value="1" />
                            </Trigger>
                            <Trigger Property="WindowState" Value="Maximized">
                                <Setter Property="Margin" Value="8" />
                                <Setter Property="BorderThickness" Value="0" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                        <!--This piece wont trigger - end -->



                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>

    <Grid>

    </Grid>
</Window>

1 个答案:

答案 0 :(得分:0)

您的ControlTemplate.Triggers正在尝试在ControlTemplate本身上设置属性,而其本身并不是可视元素。他们需要明确指定Border控件的名称:

<ControlTemplate.Triggers>
    <Trigger Property="WindowState" Value="Normal">
        <Setter TargetName="MainBorder" Property="Margin" Value="8" />
        <Setter TargetName="MainBorder" Property="BorderThickness" Value="1" />
    </Trigger>
    <Trigger Property="WindowState" Value="Maximized">
        <Setter TargetName="MainBorder" Property="Margin" Value="8" />
        <Setter TargetName="MainBorder" Property="BorderThickness" Value="0" />
    </Trigger>
</ControlTemplate.Triggers>
编辑:哦,好吧,我还在4.5.1,也许这是新的行为?在那种情况下,我会采用另一种方式,即将DataTriggers放在边界控件本身上:

    <Style x:Key="ChromeWindowStyle" TargetType="{x:Type Window}">
        <Setter Property="Foreground" Value="Black"/>
        <Setter Property="WindowStyle" Value="None" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Window}">
                    <Border BorderBrush="Gray">
                        <Border.Style>
                            <Style TargetType="{x:Type Border}">
                                <Setter Property="Margin" Value="8" />
                                <Setter Property="BorderThickness" Value="1" />
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=WindowState}" Value="Maximized">
                                        <Setter Property="Margin" Value="8" />
                                        <Setter Property="BorderThickness" Value="0" />
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </Border.Style>

                        <DockPanel LastChildFill="True">
                            <Border Height="30" DockPanel.Dock="Top">
                                <DockPanel LastChildFill="False">
                                    <TextBlock Text="Heading" DockPanel.Dock="Left" VerticalAlignment="Center" />
                                    <Button x:Name="CloseButton" Content="Close" DockPanel.Dock="Right" />
                                    <Button x:Name="MaximizeButton" Content="Max" DockPanel.Dock="Right" Click="MaximizeButton_Click"/>
                                    <Button x:Name="MinButton" Content="Min" DockPanel.Dock="Right"/>
                                </DockPanel>
                            </Border>
                            <AdornerDecorator DockPanel.Dock="Bottom">
                                <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}"
                                              Content="{TemplateBinding Content}"
                                              ContentStringFormat="{TemplateBinding ContentStringFormat}"/>
                            </AdornerDecorator>
                        </DockPanel>
                    </Border>

                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>