2015-08-16 90 views
0

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

的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> 

回答

0

你ControlTemplate.Triggers试图在控件模板本身,设置属性,这在 - 和 - 本身不是一个视觉元素。他们需要明确指定的边境控制的名称:

<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> 
+0

编译器会引发2个,用建议的代码编译时错误:targetName属性不能在风格二传手设置和 名称“MainBorder”无法识别。任何想法? –

+0

奇怪,对我来说工作正常,你在什么版本的.NET? –

+0

我正在使用.Net框架4.5.2 –