原文: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.的更多相关文章

  1. Ajax请求过程中显示“进度”的简单实现

    Ajax在Web应用中使用得越来越频繁.在进行Ajax调用过程中一般都具有这样的做法:显示一个GIF图片动画表明后台正在工作,同时阻止用户操作本页面(比如Ajax请求通过某个按钮触发,用户不能频繁点击 ...

  2. C++ CEF 浏览器中显示 Tooltip(标签中的 title 属性)

    在 Windows 中将 CEF 集成到 C++ 客户端以后,默认是无法显示 tooltip 的,比如图片标签中的 title 属性. 实现的方式其实很简单,按下面的步骤操作就可以: 创建一个文本文件 ...

  3. css3实现loading效果--当页面加载过程中显示Loading的进度条,全部加载完成之后进度条消失

    一个页面等图片资源全部加载完成,会需要很长时间,用户体验会很差,所以我们需要loading来掩盖这个漫长的过程! emmm,定时器?写个定时器还要清除,万一造成内存泄露?定时器之间还会互相影响,呼呼呼 ...

  4. 在程序加载过程中显示ProgressDialog 对话框

    private ProgressDialog mProgressDlg = null; @Override protected void onCreate(Bundle savedInstanceSt ...

  5. WPF Slider Tickbar 中显示数值

    class CustomTickBar : TickBar { protected override void OnRender(System.Windows.Media.DrawingContext ...

  6. 在安装mysql数据库的过程中,显示msvcp100.dll丢失?则么办?

    方案一:重装操作系统为windows10专业版 方案二:问题: 解答: 报错原因是VC运行库不全或者没有安装导致,百度搜索VC集合下载安装, 链接:https://pan.baidu.com/s/1U ...

  7. 在Installshield的安装进度中显示自己设置的信息

    原文:在Installshield的安装进度中显示自己设置的信息 以Installscript msi project为例,在installshield所制作的安装包安装过程中显示安装进度的,就在On ...

  8. VS编程,编辑WPF过程中,点击设计器中界面某一控件,在XAML中高亮突出显示相应的控件代码的设置方法。

    原文:VS编程,编辑WPF过程中,点击设计器中界面某一控件,在XAML中高亮突出显示相应的控件代码的设置方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net ...

  9. Android ListView滑动过程中图片显示重复错乱闪烁问题解决

    最新内容建议直接访问原文:Android ListView滑动过程中图片显示重复错乱闪烁问题解决 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及L ...

随机推荐

  1. thinkphp入口文件

    ThinkPHP采用单一入口模式进行项目部署和访问,无论完成什么功能,一个应用都有一个统一(但不一定是唯一)的入口. 应该说,所有应用都是从入口文件开始的,并且不同应用的入口文件是类似的. 入口文件定 ...

  2. 在electron-vue项目中使用element-ui

    1.安装element-ui npm install element-ui -S 2.在main.js中 import ElementUI from 'element-ui'import 'eleme ...

  3. P1613 跑路(倍增)

    P1613 跑路(倍增) 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十 ...

  4. PaperWeekly 第五期------从Word2Vec到FastText

    PaperWeekly 第五期------从Word2Vec到FastText 张俊 10 个月前 引 Word2Vec从提出至今,已经成为了深度学习在自然语言处理中的基础部件,大大小小.形形色色的D ...

  5. APIHOOK

    #include <stdio.h> #include <windows.h> #include <Dbghelp.h> #pragma comment(lib,& ...

  6. bash数组总结

    bash数组操作 bash支持两种数组,一种是索引数组,一种是关联数组 索引数组 数组的值类型是任意的,索引也未必一定要连续,当做列表理解更好 下面总结下索引数组,即列表: 1. 声明 declare ...

  7. HDU1556-Color the ball-前缀和/线段树/树状数组

    N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色.但 ...

  8. linux 下 CDH4.5编译

    1.安装JDK JDK:我这里 安装的是jdk1.6.0_23 1.1:给文件执行的权限chmod u+x jdk-6u23-linux-x64.bin 1.2: ./jdk-6u23-linux-x ...

  9. Java多线程中提到的原子性和可见性、有序性

    1.原子性(Atomicity)   原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行. 如果一个操作时原子性的,那么多线程并发的情况下,就不会出 ...

  10. uoj21 【UR #1】缩进优化

    题目 题意简介明了,需要找到一个\(T\),最小化 \[\sum_{i=1}^n\left \lfloor \frac{a_i}{T} \right \rfloor+\sum_{i=1}^na_i\% ...