WPF drag过程中显示ToolTip.

Posted lonelyxmas

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF drag过程中显示ToolTip.相关的知识,希望对你有一定的参考价值。

原文:WPF drag过程中显示ToolTip.

在drag/drop过程中,我们在判断出over的元素上是否可以接受drag的东西之后,通常是通过鼠标的样式简单告诉用户这个元素不接受现在drag的内容,但是用户通常不知道具体的原因,有时候为了增强客户体验,会在over的过程中显示tooltip来告诉用户为什么不能接受drag的东西或者告诉用户over的元素是什么东西,特别是一些绘图或者其他一些复杂的应用软件,这种方式比较广泛。

WPF 给各种控件提供了ToolTip属性,可以通过设置该属性的值来决定鼠标Over到控件的时候要显示什么内容,但是在Drag的过程中却不能触发MouseOver事件,触发的是DragOver事件,那就需要Popup 来实现该效果,下面是根据自己的经验来简单设计了一个Popup控件实现tooltip功能。

1. 在Xaml中增加Popup控件以及进行数据绑定

        <Popup x:Name="toolTip" IsOpen="Binding ShowToolTip, Mode=OneWay" AllowsTransparency="True" 
            Placement="Relative" HorizontalOffset="Binding ToolTipPos.X" VerticalOffset="Binding ToolTipPos.Y">
            <TextBlock Foreground="Red" Text="Binding DragElement.Description"></TextBlock>
        </Popup>


注:在Popup的属性设置中特别注意Placement的属性值,详细信息可以查看MSDN?怎样设置Placement属性

2. 在ViewModel中要注意属性值的计算

        private Point _tooltipPos;
        public Point ToolTipPos
        
            get  return _tooltipPos; 
            set
            
                if (_tooltipPos == value)
                    return;
                if (Math.Abs(_tooltipPos.X - 15 - value.X) > 15 || Math.Abs(_tooltipPos.Y - 15 - value.Y) > 15)
                
                    // why reduce 15? because if position the popup window to current cursor location, 
                    //if mouse moving when drag/drop, the mouse will be on popup window, so the user‘s experience is not good.
                    _tooltipPos = value;
                    _tooltipPos.Offset(15, 15);
                    RaisePropertyChanged("ToolTipPos");
                
            
        


注意ToolTipPos的Set值的设置,实际上value是光标当前的位置,为什么要对改值Offset(15,15)?主要是为了在Popup窗口显示的时候,要保证光标所Over的控件是原来的控件,如果不进行offset,在某些细微移动的过程中可能出现DragOver的对象由原来的控件跟popup窗口之间切换。

        private bool _showToolTip;
        public bool ShowToolTip
        
            get  return _showToolTip; 
            set
            
                if(_showToolTip == value)
                    return;
                _showToolTip = value;
                RaisePropertyChanged("ShowToolTip");
            
        



该属性决定了Popup窗口是否要显示,需要在DragOver事件处理函数中进行设置为True. 在dragover对象的mousemove处理函数中设置该值为false,保证Popup消失。


3. DragOver的过程中获取鼠标的位置,设置Popup窗口的target属性。

            this.toolTip.PlacementTarget = this.SelectedEmployees;
            this.ToolTipPos = e.GetPosition(SelectedEmployees);
            ShowToolTip = true;
注: e 为dragover过程中参数DragEventArgs e, ?在获取鼠标位置的时候不要用Mouse.GetPosition(IInputElement ),因为在drag过程中对鼠标是在DragOver事件中管理的, 用Mouse.GetPosition(IInputElement)不能获得准确的值。

以上是关于WPF drag过程中显示ToolTip.的主要内容,如果未能解决你的问题,请参考以下文章

关于wpf中popup跟随鼠标移动显示

用WPF实现在ListView中的鼠标悬停Tooltip显示

WPF 给DataGridTextColumn统一加上ToolTip

怎样在用C#语句动态实现wpf的tooltip或popup窗口

怎样在用C#语句动态实现wpf的tooltip或popup窗口

[WPF]TextTrimming截断后,ToolTip显示完整信息