代码之家  ›  专栏  ›  技术社区  ›  serhio

WPF触发器不工作(示例)

  •  1
  • serhio  · 技术社区  · 14 年前

    我有一个自定义的WPF行,我不想改变风格时,用鼠标选择。

    我尝试使用触发器(见下面的代码),但这不起作用。

    IsSelected 属性已更改,但 StrokeThickness 一点也不改变。。。(

    XAML编号:

    <UserControl.Resources>
     <Style TargetType="stops:MyLine" 
      x:Key="MyLineStyleKey" x:Name="MyLineStyleName">
    
      <Style.Triggers>
       <DataTrigger Binding="{Binding Path=IsSelected}" Value="true">
        <Setter Property="StrokeThickness" Value="10" />
       </DataTrigger>
      </Style.Triggers>
     </Style>
    </UserControl.Resources>
    
    <Canvas...
    ...
    <my:MyLine Style="{StaticResource MyLineStyleKey}" x:Name="myLine1" 
     Stroke="Black" X11="10" X22="100" Y11="10" Y22="100"/>
    

    class MyLine : Shape
    {
        public static readonly DependencyProperty X11Property;
        public static readonly DependencyProperty X22Property;
        public static readonly DependencyProperty Y11Property;
        public static readonly DependencyProperty Y22Property;
        public static readonly DependencyProperty IsSelectedProperty;
    
        static MyLine()
        {
            X11Property = DependencyProperty.Register("X11", typeof(double), typeof(MyLine), new FrameworkPropertyMetadata(double.NaN, FrameworkPropertyMetadataOptions.AffectsRender));
            X22Property = DependencyProperty.Register("X22", typeof(double), typeof(MyLine), new FrameworkPropertyMetadata(double.NaN, FrameworkPropertyMetadataOptions.AffectsRender));
            Y11Property = DependencyProperty.Register("Y11", typeof(double), typeof(MyLine), new FrameworkPropertyMetadata(double.NaN, FrameworkPropertyMetadataOptions.AffectsRender));
            Y22Property = DependencyProperty.Register("Y22", typeof(double), typeof(MyLine), new FrameworkPropertyMetadata(double.NaN, FrameworkPropertyMetadataOptions.AffectsRender));
            IsSelectedProperty = DependencyProperty.Register("IsSelected", typeof(bool), typeof(MyLine), new FrameworkPropertyMetadata(false));
        }
    
        public MyLine()
            : base()
        {
            this.PreviewMouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(DirectionLine_PreviewMouseLeftButtonDown);
        }
    
        void DirectionLine_PreviewMouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            this.IsSelected = !this.IsSelected;
        }
    
        [TypeConverter(typeof(LengthConverter))]
        public double X11 { get { return (double)GetValue(X11Property); } set { SetValue(X11Property, value); } }
        [TypeConverter(typeof(LengthConverter))]
        public double X22 { get { return (double)GetValue(X22Property); } set { SetValue(X22Property, value); } }
        [TypeConverter(typeof(LengthConverter))]
        public double Y11 { get { return (double)GetValue(Y11Property); } set { SetValue(Y11Property, value); } }
        [TypeConverter(typeof(LengthConverter))]
        public double Y22 { get { return (double)GetValue(Y22Property); } set { SetValue(Y22Property, value); } }
        [TypeConverter(typeof(BooleanConverter))]
        public bool IsSelected { get { return (bool)GetValue(IsSelectedProperty); } set { SetValue(IsSelectedProperty, value); } }
    
    
        protected override System.Windows.Media.Geometry DefiningGeometry
        {
            get
            {
                var geometryGroup = new GeometryGroup();
                geometryGroup.Children.Add(new LineGeometry(new Point(X11, Y11), new Point(X22, Y22)));
                return geometryGroup;
            }
        }
    }
    
    1 回复  |  直到 14 年前
        1
  •  2
  •   ASanch    14 年前

    尝试使用“ <Trigger Property="IsSelected" ...>

    <UserControl x:Class="StackOverflow.MyUserControl"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:local="clr-namespace:StackOverflow">
        <UserControl.Resources>
            <Style TargetType="local:MyLine" 
      x:Key="MyLineStyleKey" x:Name="MyLineStyleName">
    
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="true">
                        <Setter Property="StrokeThickness" Value="10" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </UserControl.Resources>
        <Canvas>
            <local:MyLine Style="{StaticResource MyLineStyleKey}" x:Name="myLine1" 
    Stroke="Black" X11="10" X22="100" Y11="10" Y22="100"/>
        </Canvas>
    </UserControl>