突出显示正在拖动的TreeView项目

编程入门 行业动态 更新时间:2024-10-25 23:38:00
本文介绍了突出显示正在拖动的TreeView项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

在我的应用程序中,我有一个允许拖放的TreeView。我有所有的功能工作正常,但是当拖动时,我很难突出显示一个TreeViewItem。这是我的treeview项目的风格。拖动时IsMouseOver触发器不起作用,因为拖动似乎阻止其他鼠标事件。任何人都可以帮助我在拖动时在我的树视图项目上触发相同的边框更改?

In my application, I have a TreeView that allows drag/drop. I have all the functionality working fine, however I am having difficulty highlighting a TreeViewItem when it is dragged over. Here is my style for my treeview item. The IsMouseOver trigger does not work while dragging, because dragging seems to block other mouse events. Can anyone help me trigger the same border changes on my treeview item while dragging?

<Style x:Key="TreeViewItemStyle" TargetType="{x:Type TreeViewItem}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type TreeViewItem}"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition MinWidth="19" Width="Auto"/> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition/> </Grid.RowDefinitions> <ToggleButton x:Name="PART_Expander" Style="{StaticResource ExpandCollapseToggleStyle}" IsChecked="{Binding Path=IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" ClickMode="Press" /> <Border x:Name="OuterBorder" Grid.Column="1" SnapsToDevicePixels="True" BorderThickness="1" CornerRadius="3" BorderBrush="Transparent" Background="Transparent" > <Border x:Name="InnerBorder" SnapsToDevicePixels="True" BorderThickness="1" CornerRadius="2" BorderBrush="Transparent" Background="Transparent" > <ContentPresenter x:Name="PART_Content" ContentSource="Header" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" /> </Border> </Border> <ItemsPresenter x:Name="PART_ItemsHost" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" /> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" SourceName="OuterBorder" Value="True"> <Setter TargetName="OuterBorder" Property="BorderBrush" Value="Blue" /> <Setter TargetName="OuterBorder" Property="Background" Value="Red" /> <Setter TargetName="InnerBorder" Property="BorderBrush" Value="White" /> </Trigger> <MultiTrigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>

推荐答案

我正在使用附带的属性,然后在我的xaml文件中使用该属性来更改树视图项的背景颜色:

I'm using an attached property for this, and then use that property in my xaml file to change the background color of the tree view item:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Input; namespace SKNotes.Utilities { /// <summary> /// Implements an attached property used for styling TreeViewItems when /// they're a possible drop target. /// </summary> public static class TreeViewDropHighlighter { #region private variables /// <summary> /// the TreeViewItem that is the current drop target /// </summary> private static TreeViewItem _currentItem = null; /// <summary> /// Indicates whether the current TreeViewItem is a possible /// drop target /// </summary> private static bool _dropPossible; #endregion #region IsPossibleDropTarget /// <summary> /// Property key (since this is a read-only DP) for the IsPossibleDropTarget property. /// </summary> private static readonly DependencyPropertyKey IsPossibleDropTargetKey = DependencyProperty.RegisterAttachedReadOnly( "IsPossibleDropTarget", typeof( bool ), typeof( TreeViewDropHighlighter ), new FrameworkPropertyMetadata( null, new CoerceValueCallback( CalculateIsPossibleDropTarget ) ) ); /// <summary> /// Dependency Property IsPossibleDropTarget. /// Is true if the TreeViewItem is a possible drop target (i.e., if it would receive /// the OnDrop event if the mouse button is released right now). /// </summary> public static readonly DependencyProperty IsPossibleDropTargetProperty = IsPossibleDropTargetKey.DependencyProperty; /// <summary> /// Getter for IsPossibleDropTarget /// </summary> public static bool GetIsPossibleDropTarget( DependencyObject obj ) { return (bool)obj.GetValue( IsPossibleDropTargetProperty ); } /// <summary> /// Coercion method which calculates the IsPossibleDropTarget property. /// </summary> private static object CalculateIsPossibleDropTarget( DependencyObject item, object value ) { if ( ( item == _currentItem ) && ( _dropPossible ) ) return true; else return false; } #endregion /// <summary> /// Initializes the <see cref="TreeViewDropHighlighter"/> class. /// </summary> static TreeViewDropHighlighter( ) { // Get all drag enter/leave events for TreeViewItem. EventManager.RegisterClassHandler( typeof( TreeViewItem ), TreeViewItem.PreviewDragEnterEvent, new DragEventHandler( OnDragEvent ), true ); EventManager.RegisterClassHandler( typeof( TreeViewItem ), TreeViewItem.PreviewDragLeaveEvent, new DragEventHandler( OnDragLeave ), true ); EventManager.RegisterClassHandler( typeof( TreeViewItem ), TreeViewItem.PreviewDragOverEvent, new DragEventHandler( OnDragEvent ), true ); } #region event handlers /// <summary> /// Called when an item is dragged over the TreeViewItem. /// </summary> /// <param name="sender">The sender.</param> /// <param name="args">The <see cref="System.Windows.DragEventArgs"/> instance containing the event data.</param> static void OnDragEvent( object sender, DragEventArgs args ) { lock ( IsPossibleDropTargetProperty ) { _dropPossible = false; if ( _currentItem != null ) { // Tell the item that previously had the mouse that it no longer does. DependencyObject oldItem = _currentItem; _currentItem = null; oldItem.InvalidateProperty( IsPossibleDropTargetProperty ); } if ( args.Effects != DragDropEffects.None ) { _dropPossible = true; } TreeViewItem tvi = sender as TreeViewItem; if ( tvi != null ) { _currentItem = tvi; // Tell that item to re-calculate the IsPossibleDropTarget property _currentItem.InvalidateProperty( IsPossibleDropTargetProperty ); } } } /// <summary> /// Called when the drag cursor leaves the TreeViewItem /// </summary> /// <param name="sender">The sender.</param> /// <param name="args">The <see cref="System.Windows.DragEventArgs"/> instance containing the event data.</param> static void OnDragLeave( object sender, DragEventArgs args ) { lock ( IsPossibleDropTargetProperty ) { _dropPossible = false; if ( _currentItem != null ) { // Tell the item that previously had the mouse that it no longer does. DependencyObject oldItem = _currentItem; _currentItem = null; oldItem.InvalidateProperty( IsPossibleDropTargetProperty ); } TreeViewItem tvi = sender as TreeViewItem; if ( tvi != null ) { _currentItem = tvi; tvi.InvalidateProperty( IsPossibleDropTargetProperty ); } } } #endregion } }

然后在xaml文件中:

and then in the xaml file:

<TreeView.ItemContainerStyle> <Style TargetType="{x:Type TreeViewItem}"> <Setter Property="FontWeight" Value="Normal" /> <Style.Triggers> <Trigger Property="utils:TreeViewDropHighlighter.IsPossibleDropTarget" Value="True"> <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" /> </Trigger> </Style.Triggers> </Style> </TreeView.ItemContainerStyle>

更多推荐

突出显示正在拖动的TreeView项目

本文发布于:2023-10-31 01:39:55,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1544610.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:拖动   项目   TreeView

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!