2012-06-28 2 views
1

Я пытаюсь выработать ControlTemplate.Triggers в стиле ниже, и я не понял, как найти названные свойства Ellipse и Path.BInding из шаблона в стиле

Например, если IsMouseOver, измените фон эллипса. Что такое хороший способ найти Ellipse, чтобы я мог установить свойство Fill так, как я настроил этот стиль? Есть ли лучший способ выложить его?

Cheers,
Berryl

<Style x:Key="CloseCrossToggleButtonStyle" TargetType="{x:Type ToggleButton}"> 

<Setter Property="ContentTemplate"> 
    <Setter.Value> 
     <DataTemplate> 

      <Grid Background="Transparent"> 

       <!-- The background of the button, as an ellipse. --> 
       <Ellipse x:Name="theEllipse" /> 

       <!-- A path that renders a cross. --> 
       <Path x:Name="theCross"... 

      </Grid> 

     </DataTemplate> 
    </Setter.Value> 
</Setter> 

<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type ToggleButton}"> 
      <ContentPresenter x:Name="theContent"/> 
      <ControlTemplate.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter Property="Ellipse.Fill" Value="{StaticResource HoverBackgroundBrush}" /> 
        <Setter Property="Path.Stroke" Value="{StaticResource HoverForegroundBrush}"/> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 

нормально, работая

<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type ToggleButton}"> 
      <Grid Background="Transparent"> 
       <!-- The background of the button, as an ellipse. --> 
       <Ellipse x:Name="theEllipse" /> 
       <!-- A path that renders a cross. --> 
       <Path x:Name="theCross" 
         ... 
       </Path> 

      </Grid> 
      <ControlTemplate.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter TargetName="theEllipse" Property="Fill" Value="{StaticResource HoverBackgroundBrush}" /> 
        <Setter TargetName="theCross" Property="Stroke" Value="{StaticResource HoverForegroundBrush}"/> 
       </Trigger> 
       <Trigger Property="IsEnabled" Value="false"> 
        <Setter Property="Visibility" Value="Collapsed"/> 
       </Trigger> 
       <Trigger Property="IsPressed" Value="true"> 
        <Setter TargetName="theEllipse" Property="Fill" Value="{StaticResource PressedBackgroundBrush}" /> 
        <Setter TargetName="theEllipse" Property="Stroke" Value="{StaticResource PressedBorderBrush}" /> 
        <Setter TargetName="theCross" Property="Stroke" Value="{StaticResource PressedForegroundBrush}"/> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 

ответ

1

В ControlTemplate.Triggers вы можете управлять только элементы управления, которые находятся внутри ContentTemplate, вы не имеете доступа к элементов ContentTemplate из шаблона.

Вы можете сделать, как мой пример ниже (я меняю изображение кнопки ...):

<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type Button}"> 
      <Grid Width="{TemplateBinding Width}" Height="{TemplateBinding Height}"> 
       <Image x:Name="imgBackground" Source="{StaticResource UpArrowImageNormal}" Stretch="None"/> 
      </Grid> 
      <ControlTemplate.Triggers> 
       <Trigger Property="IsPressed" Value="True"> 
        <Setter TargetName="imgBackground" 
          Property="Source" Value="{StaticResource UpArrowImageIsPressed}"/> 
       </Trigger> 
       <Trigger Property="IsEnabled" Value="False"> 
        <Setter TargetName="imgBackground" Property="Source" Value="{StaticResource UpArrowImageDisabled}"/> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 

К сожалению, я не знаю о том, чтобы применить триггера шаблон данных. Я считаю, что он может применяться только триггер в ContentPresenter ...

Correction, кажется, что вы можете использовать это (образец):

<Button x:Name="btnTest" Height="23" Width="75" HorizontalAlignment="Left" VerticalAlignment="Top" VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch"> 
      <Button.ContentTemplate> 
       <DataTemplate> 
        <Rectangle x:Name="t" Fill="Azure" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/> 
        <DataTemplate.Triggers> 
         <Trigger Property="IsMouseOver" Value="True"> 
          <Setter TargetName="t" Property="Fill" Value="Black"/> 
         </Trigger> 
        </DataTemplate.Triggers> 
       </DataTemplate> 
      </Button.ContentTemplate> 
     </Button> 
+0

был кусок я не получал - положить, что был моим DataTemplate в ControlTemplate вместо ContentPresenter. Неудивительно, что это требует некоторой практики! Ну хорошо, Strawberry Fields Forever ... (см. Исправленный код тоже). ура – Berryl

Смежные вопросы