2013-10-29 106 views
0

我有一個用於ToggleButton的大型ControlTemplate。我試圖添加沒有成功的數據觸發器。wpf:將樣式DataTrigger更改爲ControlTemplate DataTrigger

我已經然而manged使用樣式添加它,如下圖所示:

<Window.Resources> 
    <Style x:Key="toggleBtnStyle" TargetType="{x:Type ToggleButton}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=myProperty}" Value="true"> 
       <Setter Property="Content" Value="IS TRUE"/> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Path=myProperty}" Value="false"> 
       <Setter Property="Content" Value="IS FALSE"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 

<ToggleButton Height="34" HorizontalAlignment="Left" x:Name="toggleBroadcast" Click="Button_Click" VerticalAlignment="Top" Width="133" Margin="180,0,0,0" Style="{DynamicResource toggleBtnStyle}"/> 

有沒有辦法把它添加到控制模板?我有下面的控件模板,它是在ToggleButton的IsChecked屬性上觸發的,我試圖將它更改爲上面樣式中的DataTrigger,但沒有成功。

 <ControlTemplate x:Key="ClipBoardButton1" TargetType="{x:Type ToggleButton}"> 
     <Border BorderThickness="1,1,1,1" CornerRadius="1,1,1,1" BorderBrush="Black" Background="Black" > 
      <Grid> 
       <Border x:Name="BorderUp" BorderThickness="1,1,1,1" CornerRadius="1,1,1,1" Background="Blue"/> 
       <Border x:Name="BorderDown" BorderThickness="1,1,1,1" CornerRadius="1,1,1,1" Opacity="0" Background="Aqua"/> 
       <ContentPresenter x:Name="Contents" HorizontalAlignment="Center" VerticalAlignment="Center" Width="Auto" Margin="0,0,0,0"/> 
      </Grid> 
     </Border> 

     <ControlTemplate.Resources> 
      <Storyboard x:Key="ButtonDownTimeLine"> 
       <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="BorderDown" Storyboard.TargetProperty="Opacity"> 
        <SplineDoubleKeyFrame KeyTime="00:00:00.05" Value="1"/> 
       </DoubleAnimationUsingKeyFrames> 
       <ThicknessAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Contents" Storyboard.TargetProperty="Margin"> 
        <SplineThicknessKeyFrame KeyTime="00:00:00.025" Value="0.5,0.5,0,0"/> 
       </ThicknessAnimationUsingKeyFrames> 
      </Storyboard> 
      <Storyboard x:Key="ButtonUpTimeLine"> 
       <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="BorderDown" Storyboard.TargetProperty="Opacity"> 
        <SplineDoubleKeyFrame KeyTime="00:00:00.25" Value="0"/> 
       </DoubleAnimationUsingKeyFrames> 
       <ThicknessAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Contents" Storyboard.TargetProperty="Margin"> 
        <SplineThicknessKeyFrame KeyTime="00:00:00.25" Value="0,0,0,0"/> 
       </ThicknessAnimationUsingKeyFrames> 
      </Storyboard> 
     </ControlTemplate.Resources> 

     <ControlTemplate.Triggers> 
      <Trigger Property="IsChecked" Value="True"> 
       <Trigger.EnterActions> 
        <BeginStoryboard Storyboard="{StaticResource ButtonDownTimeLine}"/> 
       </Trigger.EnterActions> 
       <Trigger.ExitActions> 
        <BeginStoryboard Storyboard="{StaticResource ButtonUpTimeLine}"/> 
       </Trigger.ExitActions> 
      </Trigger> 
     </ControlTemplate.Triggers> 
    </ControlTemplate> 

要明確:

  1. 我想用一個DataTrigger上myProperty的
  2. 具有相同的觸發動作作爲目前操作器isChecked。 (實現故事板)

我已經嘗試了很多不同的東西,並通過搜索這麼多帖子,但無法找到我正在尋找的答案。

任何人都可以告訴我我需要做什麼嗎?

回答

3

我猜,你正在使用一個風格應用此TemplateToggleButton。如果沒有,創建一個默認樣式ToggleButtonTemplate屬性設置爲您ControlTemplate

<Style TargetType="ToggleButton"> 
    <Setter Property="Template" Value="{StaticResource ClipBoardButton1}" /> 
</Style> 

而且,來到你的身邊問題使用DataTriggers,我不會增加DataTriggersControlTemplate,因爲,想想這種情況下,是什麼當你想在屬性名稱不同的不同地方(不是myProperty)使用相同的模板時,會發生?

要達到你想什麼,你可以更新您的TriggerControlTemplate以下:

<Trigger Property="IsChecked" Value="True"> 
    <Setter Property="Content" Value="IS TRUE" /> 
    <Trigger.EnterActions> 
     <BeginStoryboard Storyboard="{StaticResource ButtonDownTimeLine}"/> 
    </Trigger.EnterActions> 
    <Trigger.ExitActions> 
     <BeginStoryboard Storyboard="{StaticResource ButtonUpTimeLine}"/> 
    </Trigger.ExitActions> 
</Trigger> 
<Trigger Property="IsChecked" Value="False"> 
    <Setter Property="Content" Value="IS FALSE"></Setter> 
</Trigger> 

和綁定的ToggleButtonIsChecked屬性爲您myProperty

<ToggleButton Height="34" HorizontalAlignment="Left" 
       x:Name="toggleBroadcast" 
       Click="Button_Click" 
       VerticalAlignment="Top" 
       Width="133" Margin="180,0,0,0" 
       IsChecked="{Binding myProperty}"/> 

UPDATE

替換您r觸發於ControlTemplate附:

<DataTrigger Binding="{Binding myProperty}" Value="True"> 
    <DataTrigger.EnterActions> 
     <BeginStoryboard Storyboard="{StaticResource ButtonDownTimeLine}"/> 
    </DataTrigger.EnterActions> 
    <DataTrigger.ExitActions> 
     <BeginStoryboard Storyboard="{StaticResource ButtonUpTimeLine}"/> 
    </DataTrigger.ExitActions> 
</DataTrigger> 
+0

嗨,多虧了我希望,但myProperty被設置爲IsChecked,但我真的需要IsChecked設置爲myProperty。我需要在ControlTemplate中設置觸發器,當myProperty在代碼後面更改代碼 – Andy

+0

@Andy在ControlTemplate中更新了答案,使其具有'DataTrigger',我測試了這個並且似乎正在工作! – sthotakura

0

您可以在樣式中使用控件模板。如下。我希望這有助於

<Window.Resources> 
    <Style x:Key="toggleBtnStyle" TargetType="{x:Type ToggleButton}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=myProperty}" Value="true"> 
       <Setter Property="Content" Value="IS TRUE"/> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Path=myProperty}" Value="false"> 
       <Setter Property="Content" Value="IS FALSE"/> 
      </DataTrigger> 
     </Style.Triggers> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ToggleButton}"> 
        <Border BorderThickness="1,1,1,1" CornerRadius="1,1,1,1" BorderBrush="Black" Background="Black" > 
         <Grid> 
          <Border x:Name="BorderUp" BorderThickness="1,1,1,1" CornerRadius="1,1,1,1" Background="Blue"/> 
          <Border x:Name="BorderDown" BorderThickness="1,1,1,1" CornerRadius="1,1,1,1" Opacity="0" Background="Aqua"/> 
          <ContentPresenter x:Name="Contents" HorizontalAlignment="Center" VerticalAlignment="Center" Width="Auto" Margin="0,0,0,0"/> 
         </Grid> 
        </Border> 

        <ControlTemplate.Resources> 
         <Storyboard x:Key="ButtonDownTimeLine"> 
          <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="BorderDown" Storyboard.TargetProperty="Opacity"> 
           <SplineDoubleKeyFrame KeyTime="00:00:00.05" Value="1"/> 
          </DoubleAnimationUsingKeyFrames> 
          <ThicknessAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Contents" Storyboard.TargetProperty="Margin"> 
           <SplineThicknessKeyFrame KeyTime="00:00:00.025" Value="0.5,0.5,0,0"/> 
          </ThicknessAnimationUsingKeyFrames> 
         </Storyboard> 
         <Storyboard x:Key="ButtonUpTimeLine"> 
          <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="BorderDown" Storyboard.TargetProperty="Opacity"> 
           <SplineDoubleKeyFrame KeyTime="00:00:00.25" Value="0"/> 
          </DoubleAnimationUsingKeyFrames> 
          <ThicknessAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Contents" Storyboard.TargetProperty="Margin"> 
           <SplineThicknessKeyFrame KeyTime="00:00:00.25" Value="0,0,0,0"/> 
          </ThicknessAnimationUsingKeyFrames> 
         </Storyboard> 
        </ControlTemplate.Resources> 

        <ControlTemplate.Triggers> 
         <Trigger Property="IsChecked" Value="True"> 
          <Trigger.EnterActions> 
           <BeginStoryboard Storyboard="{StaticResource ButtonDownTimeLine}"/> 
          </Trigger.EnterActions> 
          <Trigger.ExitActions> 
           <BeginStoryboard Storyboard="{StaticResource ButtonUpTimeLine}"/> 
          </Trigger.ExitActions> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Window.Resources> 
+0

謝謝,很有意思。但我需要的是ControlTemplate觸發器基於myProperty。所以當myProperty在Storyboard背後的代碼被改變時開始。現在它始終從IsChecked事件開始,我需要它在myProperty更改時啓動。 – Andy