如何在自定义Canvas中访问依赖项属性

问题描述 投票:0回答:2

我创建了一个来自Canvas的自定义Canvas,我声明了一个新的依赖属性“NewMouseOver”,我希望通过触发器中的Setter来影响它。

public class CanvaNetwork : Canvas
{
public CanvaNetwork() { }



public bool NewMouseOver
{
get { return (bool)GetValue(NewMouseOverProperty); }
set { SetValue(NewMouseOverProperty, value); }
}

public static readonly DependencyProperty NewMouseOverProperty =
DependencyProperty.Register("NewMouseOver", typeof(bool), 
typeof(CanvaNetwork), new PropertyMetadata(false));


}

这是我的XAML:

<DataTemplate DataType="{x:Type local:Node}">
    <local:CanvaNetwork x:Name="ItemCanvas_Node" 
                        NewMouseOver="{Binding MyMouseOver}" 
                        Background="Transparent">

        <Path x:Name="Path_NodeProcess"

                Stroke="Green"
                Fill="Gray"
                Stretch="None"
                Data="{Binding  Path =Geometryform}"
                Visibility="{Binding Path=Visibility}">
        </Path>
        <local:CanvaNetwork.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter  Property="NewMouseOver"  Value="True" />
            </Trigger>
        </local:CanvaNetwork.Triggers>
    </local:CanvaNetwork>
</DataTemplate>

hera是我的节点类:

Public Node :DependencyObject
{

 public static readonly DependencyProperty MyMouseOverProperty =
            DependencyProperty.Register("MyMouseOver", typeof(bool), typeof(NodeProcess), new PropertyMetadata(true,new PropertyChangedCallback(On_MyMouseOver)));

        private static void On_MyMouseOver(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            //..some code

        }

        public bool MyMouseOver
        {
            get { return (bool)GetValue(MyMouseOverProperty); }
            set { SetValue(MyMouseOverProperty, value); }
        }



}

我想要的是:1-i有DependencyProperty:NewMouseOver(在原始Canvas类中获取和设置不像IsMouseOver)。 2通过Trigger / Setter访问NewMouseOver并更改NewMouseOver的状态。 3-via XAML:设置绑定betwin:NewMouseOver(在CanvaNetwork中)和MyMouseOver(在Node Class中)4 - 之后我将使用On_MyMouseOver(在Node Class中)和MyMouseOver来制作一些东西。

c# wpf canvas custom-controls
2个回答
0
投票

我想我可以回答有关如何更新canvas对象中的DependencyProperty的问题。

为了测试它,我将为依赖属性定义一个“on changed”方法。您可以在此处放置断点以验证是否已设置依赖项属性。

class CanvaNetwork : Canvas
{
  public CanvaNetwork ( ) { }

  public static readonly DependencyProperty NewMouseOverProperty
                           = DependencyProperty.Register ( "NewMouseOver",
                                                           typeof (bool),
                                                           typeof (CanvaNetwork),
                                                           new PropertyMetadata (false, OnNewMouseOverChanged)) ;

  public bool NewMouseOver
  {
    get { return (bool)GetValue (NewMouseOverProperty); }
    set { SetValue (NewMouseOverProperty, value); }
  }

  public static void OnNewMouseOverChanged ( DependencyObject d, DependencyPropertyChangedEventArgs e )
  {
  }
}

在DataTemplate中,您必须在Style中定义触发器。

<DataTemplate DataType="{x:Type local:Node}">
  <local:CanvaNetwork x:Name="ItemCanvas_Node"
                Background="red" Height="100" Width="100">

    <Path x:Name="Path_NodeProcess"

        Stroke="Green"
        Fill="Gray"
        Stretch="None"
        Data="{Binding  Path =Geometryform}"
        Visibility="{Binding Path=Visibility}">
    </Path>

    <local:CanvaNetwork.Style>
      <Style>
        <Setter  Property="local:CanvaNetwork.NewMouseOver"  Value="False" />
        <Style.Triggers>
          <Trigger  Property="Canvas.IsMouseOver" Value="True">
            <Setter  Property="local:CanvaNetwork.NewMouseOver"  Value="True" />
          </Trigger>
        </Style.Triggers>
      </Style>
    </local:CanvaNetwork.Style>

  </local:CanvaNetwork>
</DataTemplate>

如果在样式中设置了默认属性,则只能使用触发器更新属性。

为此,我删除了你的attritute NewMouseOver =“{Binding MyMouseOver}”。从您的列表中,第1点和第2点可以工作,但删除此属性意味着第3点不起作用。

但是,我认为你可能采取了错误的方法。将MouseOver事件连接到Node类中的命令属性不是更好,如下所述:

How to make MouseOver event in MVVM?

© www.soinside.com 2019 - 2024. All rights reserved.