2012-07-27 71 views
4

我有一个弹出式控件,我添加了一个拇指,所以我可以拖动它在屏幕上。拇指的DragDelta事件超载与此:WPF拇指DragDelta移动显示器

private static void Thumb_DragDelta(object sender, DragDeltaEventArgs e) 
    { 
     Thumb thumb = (Thumb)sender; 
     Popup popup = thumb.Tag as Popup; 

     if (popup != null) 
     { 
      popup.HorizontalOffset += e.HorizontalChange; 
      popup.VerticalOffset += e.VerticalChange; 
     } 
    } 

拖动完美的作品(我用从这里开始拖动例如:http://www.codeproject.com/Articles/43636/WPF-A-search),除了当弹出到达显示器的结尾和跨越到另一个(双显示器设置)。例如,如果我在左侧显示器上打开弹出窗口,并开始向右拖动,当它的右侧边框接触到显示器的边缘时,它的移动不稳定并开始移动,直到我向右移动并显示在另一侧监控。

我通过这个场景调试,这也是基本上会发生什么数值例如:

At edge of screen: 
HorizontalOffset = 600 
HorizontalChange = 1 

Move Right: 
HorizontalOffset = 601 
HorizontalChange = -800 

HorizontalOffset = -199 
HorizontalChange = 401 

HorizontalOffset = 200 
HorizontalChange = -150 

,同时它移动到另一台显示器这给弹出的这个奇怪的频闪效果;我需要做些什么才能让它在各个显示器上平滑过渡?

+0

弹出窗口重新定位本身,然后到达屏幕边缘。看看这个问题 - http://stackoverflow.com/questions/1652773/make-a-wpf-popup-not-screen-bound。 – Nikolay 2012-07-30 13:56:13

+0

@Nikolay我看了一下这个问题,但我不确定如何实现它;你能否提供更多的信息来了解我需要做些什么来利用所提供的代码?例如,我如何访问HostPopup类? Move()方法在哪里实现? mPreviousDiffX,mPreviousDiffY,mIsMoving,mIsThumbDragging等只是本地的私有变量? – Saggio 2012-07-30 15:54:41

回答

2

我还没有想出如何将弹出窗口解除绑定到屏幕上,但是我能够通过使用Window控件来完成我需要的功能。我制作了WindowStyle.None,因此没有边框,并且使用DragMove()方法的代理重载了MouseLeftButtonDown事件,以便它们可以在屏幕上拖动。这使我可以和弹出窗口的外观和感觉非常相似,但可以在屏幕上拖动而不闪烁。