1
我在UserControl中有一個TreeView,它可以滾動+縮放和拖動。 (由於樹視圖確實非常大),由於滾動/縮放/拖動用戶控件聽WPF將DependencyProperty綁定到另一個DependencyProperty
- OnScrollViewerScrollChanged
- OnMouseLeftButtonUp
- OnMouseLeftButtonUp
- OnPreviewMouseWheel
- OnMouseLeftButtonDown在
- 的OnMouseMove
TreeViewItems無法接收任何鼠標輸入。因此,我爲TreeViewItem創建了一個DependencyProperty,所謂的IsMouseHover。如果鼠標進入或離開TreeViewItem,那DP就會在true和false之間切換。
ScrollZoomDrag UserControl也有一個DP,即所謂的「Active」,它訂閱或取消訂閱上面提到的所有事件。
現在我想將TreeViewItem的「IsMouseHover」綁定到ScrollZoomDrag的Control「Active」DP。
<controls:ScrollDragZoomControl>
<controls:OrgTreeView ItemsSource="{Binding Root}">
<controls:OrgTreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children, Mode=TwoWay}">
<controls:VisualElement DataContext="{Binding}">
<Style TargetType="controls:ScrollDragZoomControl">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=controls:VisualElement}, Path=IsMouseHover}" Value="True">
<Setter Property="Active" Value="False" />
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=controls:VisualElement}, Path=IsMouseHover}" Value="False">
<Setter Property="Active" Value="True" />
</DataTrigger>
</Style.Triggers>
</Style>
</controls:VisualElement>
</HierarchicalDataTemplate>
</controls:OrgTreeView.ItemTemplate>
</controls:OrgTreeView>
</controls:ScrollDragZoomControl>
使用上面的解決方案,ScrollZoomDrag的DP「Active」根本不會被切換。我錯過了什麼,或者有更好的方法嗎?
UPDATE
ScrollZoomDrag.xaml.cs
public static readonly DependencyProperty ActiveProperty = DependencyProperty.Register("Active", typeof(bool), typeof(ScrollDragZoomControl), new PropertyMetadata(true, new PropertyChangedCallback(ActiveChanged)));
public bool Active
{
get { return (bool)GetValue(ActiveProperty); }
set { SetValue(ActiveProperty, value); }
}
public static void ActiveChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
ScrollDragZoomControl scrollDragZoomControl = (ScrollDragZoomControl)obj;
if ((bool)args.NewValue)
scrollDragZoomControl.StartListen();
else scrollDragZoomControl.StopListen();
}
VisualElement.xaml.cs
public static readonly DependencyProperty IsMouseHoverProperty = DependencyProperty.Register("IsMouseHover", typeof(bool), typeof(VisualElement), new PropertyMetadata(false));
public VisualElement()
{
InitializeComponent();
MouseEnter += VisualElement_MouseEnter;
MouseLeave += VisualElement_MouseLeave;
}
public bool IsMouseHover
{
get { return (bool)GetValue(IsMouseHoverProperty); }
set { SetValue(IsMouseHoverProperty, value); }
}
private void VisualElement_MouseLeave(object sender, MouseEventArgs e)
{
IsMouseHover = false;
}
private void VisualElement_MouseEnter(object sender, MouseEventArgs e)
{
IsMouseHover = true;
}
方法2:(也不起作用)
<controls:ScrollDragZoomControl>
<controls:ScrollDragZoomControl.Style>
<Style TargetType="controls:ScrollDragZoomControl">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=controls:VisualElement}, Path=IsMouseHover}" Value="True">
<Setter Property="Active" Value="False" />
</DataTrigger>
</Style.Triggers>
</Style>
</controls:ScrollDragZoomControl.Style>
<controls:OrgTreeView ItemsSource="{Binding Root}"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<controls:OrgTreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children, Mode=TwoWay}">
<controls:VisualElement DataContext="{Binding}">
</controls:VisualElement>
</HierarchicalDataTemplate>
</controls:OrgTreeView.ItemTemplate>
</controls:OrgTreeView>
</controls:ScrollDragZoomControl>
當前'