WPF做了一个小程序,为了好看去掉了系统自带的边框,就是包括了最大化,最小化,关闭按钮的那个蓝色的系统边框,
然后背景用了一张自定义的图片,现在想实现的是手动背景图片时,整个窗体跟随移动,就像手动KMPlayer的界面一样,
于是在这个背景图片的MouseLeftButtonDown,MouseMove,MouseLeftButtonUp三个事件响应方法中做了处理,当检测到鼠标移动就同时把窗口的Left,Top值改变相应的距离,来实现指针拖动窗口的效果。但是实际使用时拖动很不流畅,有残影,请问大家有什么更好的方法么?谢谢。

解决方案 »

  1.   

    windowless 
    this.MouseLeftButtonDown += delegate { DragMove(); };
      

  2.   

    Form 的属性 ,有设置 最大,最小的 显示 和 边框样式的 属性。showMax
    showMin
    broderStyle 有这3个样式的。设置就可以了啊
      

  3.   


    public partial class MainWindow
    {
    // 在类里增加下列定义 
    public const int WM_NCLBUTTONDOWN = 0xA1;
    public const int HT_CAPTION = 0x2;
    [DllImport("user32.dll")] public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
    [DllImport("user32.dll")] public static extern bool ReleaseCapture(); public MainWindow()
    {
    InitializeComponent();

    // 在Window的构造函数里增加下列语句:
    MouseLeftButtonDown += (o, args) =>
    {
    var hwnd = new WindowInteropHelper(this).Handle;
    ReleaseCapture();
    SendMessage(hwnd, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
    };
    }
    }
      

  4.   

    设置了WindowStyle = System.Windows.WindowStyle.None;吗?
            private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
            {
               this.DragMove();
            }调用DragMove方法即可。
      

  5.   

    上面两位大哥的方法 ,第一种直接拦截WIN32消息,第二种是调用DragMove();
    对比了一下最终效果,都比自己处理要好许多,然后实现方法当然是DragMove();最简洁.另外好像查到WindowInteropHelper类在WPF中会有一个隐藏的BUG,所以采用了第一种方法.http://www.cnblogs.com/yilinglai/archive/2007/04/03/698064.html再次谢谢各位的帮助.
      

  6.   

    wpf拖放功能实现
    http://www.cnblogs.com/loveis715/archive/2011/12/05/2277384.html