繁体   English   中英

WPF:IsMouseOver触发器不适用于数据模板

[英]WPF: IsMouseOver trigger not working for datatemplate

我正在尝试让IsMouseOver触发器适用于datatemplate。 由于某种原因,它没有触发。 我也尝试了http://www.wpfmentor.com/2009/01/how-to-debug-triggers-using-trigger.html,但在跟踪中看不到任何内容。 这是代码:

XAML:

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

后面的代码:

   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);
        }
    }

任何帮助表示赞赏!

您的触发器实际上可以正常工作。 问题在于您如何实例化模板并将其以编程方式添加到Canvas

直接在Xaml中应用模板以查看其工作原理:

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

如果要以编程方式应用它,请将模板应用到ContentControlContentPresenter然后将其放入“ Canvas

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

这是使用样式触发器的替代方法。 边框保持黑色,但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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM