views:

19

answers:

1

I have a custom WPF Line, that I whant to change the Style when selecting with mouse.

I tried to use triggers(see code bellow), but this does not work.

Where is the problem? The IsSelected property is changed, but the StrokeThickness does not change at all... (

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

Code:

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;
        }
    }
}
+2  A: 

Try using "<Trigger Property="IsSelected" ...>" instead of a DataTrigger. DataTrigger works on the DataContext for a FrameworkElement. In your case, this means that it will look for the IsSelected property of the control's DataContext. Trigger, on the other hand, works directly on the FrameworkElement itself, and looks for Dependency Properties of the FrameworkElement.

<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>
karmicpuppet
`<Trigger Property="IsSelected" Value="true"> <Setter Property="StrokeThickness" Value="10" /></Trigger>` - the same result...
serhio
Should I add the Tigger node inside the MyLine element rather that in UserControl cancvas Ressources?
serhio
I tried it and it does work. I'm posting my code.
karmicpuppet
! the error was in the... namespace. You used in the XAML "<local:MyLine...", and in my code I used "<my:MyLine..."... apparently <my: redirects to application or stuff... Now, when I changed the namespace is worked!
serhio