2014-10-31 2 views
0

Я пытаюсь заставить триггер IsMouseOver работать на datatemplate. По какой-то причине он не стреляет. Я также попробовал http://www.wpfmentor.com/2009/01/how-to-debug-triggers-using-trigger.html, но я ничего не вижу в трассировке. Вот код: заWPF: триггер IsMouseOver не работает для datatemplate

<Window x:Class="FirstSImpleDataApp.Window4" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Window4" Height="300" Width="300"> 
    <Window.Resources> 
    <ResourceDictionary> 
      <DataTemplate x:Key="tmptemplate"> 
       <Border x:Name="brd" BorderBrush="Black" BorderThickness="2"> 
        <TextBlock x:Name="txt">my text box</TextBlock> 
       </Border> 
       <DataTemplate.Triggers> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter TargetName="txt" Property="Background" Value="Red"></Setter> 
         <Setter TargetName="txt" Property="Foreground" Value="Green"></Setter> 
         <Setter TargetName="brd" Property="Background" Value="Green"></Setter> 
        </Trigger> 
       </DataTemplate.Triggers> 
      </DataTemplate> 



     </ResourceDictionary> 
    </Window.Resources> 
    <Canvas x:Name="can" Loaded="can_Loaded"> 

    </Canvas> 
</Window> 

Код::

XAML

public partial class Window4 : Window 
    { 
     public Window4() 
     { 
      InitializeComponent(); 
     } 

     private void can_Loaded(object sender, RoutedEventArgs e) 
     { 
      var tmp = this.TryFindResource("tmptemplate") as DataTemplate; 
      var obj = (FrameworkElement)tmp.LoadContent(); 
      can.Children.Add(obj); 
     } 
    } 

Любая помощь приветствуется!

ответ

1

Ваши триггеры действительно работают нормально. Проблема заключается в том, как вы создаете экземпляр шаблона и добавляете его в свой Canvas программно.

Применить шаблон непосредственно в Xaml, чтобы увидеть его работу:

<Canvas x:Name="can"> 
    <ContentControl ContentTemplate="{StaticResource tmptemplate}" /> 
</Canvas> 

Если вы хотите, чтобы применить его программно применить шаблон к ContentControl или ContentPresenter и поместите его в Canvas вместо:

private void can_Loaded(object sender, RoutedEventArgs e) 
{ 
    var tmp = this.TryFindResource("tmptemplate") as DataTemplate; 
    can.Children.Add(new ContentPresenter { ContentTemplate = tmp }); 
} 
+0

Ну просто попробовал это с помощью простой кнопки (ее ContentTemplate установлен на этот шаблон), поведение немного отличается, что может и не быть тем, чего хочет OP. Триггер запускается только при наведении курсора на внутреннюю границу, чтобы граница не растягивалась, чтобы заполнить кнопку. Поэтому, если OP хочет, чтобы парящая кнопка запускала триггер, это, конечно, не работает по желанию, если не может быть какой-то настройки для него. –

+0

Пробовал это, но не работает. – May

+0

@Mike, я не могу это сделать в xaml, потому что в реальном проекте я создаю много этих объектов и размещаю их на холсте. И они динамичны, поэтому мне нужно создать их в xaml. – May

0

Вот альтернатива, использующая триггеры стиля. Граница остается черной, но с зеленым краем от TextBlock.

  <Style TargetType="TextBlock"> 
       <Style.Triggers> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter Property="Background" Value="Red"/> 
         <Setter Property="Foreground" Value="Green"/> 
         <Setter Property="Margin" Value="2"/> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 

      <Style TargetType="Border"> 
       <Style.Triggers> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter Property="Background" Value="Green"/> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 

      <Border BorderThickness="1" BorderBrush="Black"> 
       <TextBlock Text="My Text Block"/> 
      </Border> 
+0

Я хотел бы избежать необходимости добавлять триггеры стиля. Есть ли другой способ? – May