How do you disable Aero Snap in an application?

前端 未结 11 2310
一向
一向 2020-11-29 09:36

Is it possible to disable the automatic window-docking feature of Windows 7 in a WPF application?

11条回答
  •  感情败类
    2020-11-29 10:15

    I recently needed to do this to a custom, resizable ResizeMode = CanResizeWithGrip WPF window with no window decorations (no title bar and buttons). I used DragMove() to move the window, and when It is maximized by AeroSnap, the window becomes unmovable and hence locked in place.

    I tried Barn Monkey's solution, which partially worked, but it would still show the AeroSnap graphic and resize the app to fullscreen size. I modified it below and now it works as expect: still resizable, but no AeroSnap at all.

    void Window1_MouseDown(object sender, MouseButtonEventArgs e)
    {
        if( e.LeftButton == MouseButtonState.Pressed )
        {
            // this prevents win7 aerosnap
            if( this.ResizeMode != System.Windows.ResizeMode.NoResize )
            {
                this.ResizeMode = System.Windows.ResizeMode.NoResize;
                this.UpdateLayout();
            }
    
            DragMove();
        }
    }
    
    void Window1_MouseUp( object sender, MouseButtonEventArgs e )
    {
        if( this.ResizeMode == System.Windows.ResizeMode.NoResize )
        {
            // restore resize grips
            this.ResizeMode = System.Windows.ResizeMode.CanResizeWithGrip;
            this.UpdateLayout();
        }
    }
    

    EDIT:

    It's been a while since I wrote this, but since people still look at this I'll update it with what I use now. I still use basically the same method for preventing edge snapping and moving my windows, but I now have them packed into custom Behavior<> classes that I can attach to a Window or UserControl. This makes them very easy to use with MVVM (I use Caliburn Micro).

    The behavior classes are:

    /// 
    /// behavior that makes a window/dialog draggable by clicking anywhere 
    /// on it that is not a control (ie, button)
    /// 
    public class DragMoveBehavior : Behavior where T : FrameworkElement
    {
        protected override void OnAttached()
        {
            AssociatedObject.MouseLeftButtonDown += MouseDown;
            base.OnAttached();
        }
    
        protected override void OnDetaching()
        {
            AssociatedObject.MouseLeftButtonDown -= MouseDown;
            base.OnDetaching();
        }
    
        void MouseDown( object sender, EventArgs ea ) => Window.GetWindow( sender as T )?.DragMove();
    }
    
    public class WinDragMoveBehavior : DragMoveBehavior { }
    
    public class UCDragMoveBehavior : DragMoveBehavior { }
    
    /// 
    /// behavior that makes a window/dialog not resizable while clicked.  this prevents
    /// the window from being snapped to the edge of the screen (AeroSnap).  if DragMoveBehavior
    /// is also used, this must be attached first.
    /// 
    /// 
    public class NoSnapBehavior : Behavior where T : FrameworkElement
    {
        ResizeMode lastMode = ResizeMode.NoResize;
        protected override void OnAttached()
        {
            AssociatedObject.MouseLeftButtonDown += MouseDown;
            AssociatedObject.MouseLeftButtonUp += MouseUp;
            base.OnAttached();
        }
    
        protected override void OnDetaching()
        {
            AssociatedObject.MouseLeftButtonDown -= MouseDown;
            AssociatedObject.MouseLeftButtonUp -= MouseUp;
            base.OnDetaching();
        }
    
        /// 
        /// make it so the window can be moved by dragging
        /// 
        void MouseDown( object sender, EventArgs ea )
        {
            var win = Window.GetWindow( sender as T );
            if( win != null && win.ResizeMode != ResizeMode.NoResize )
            {
                lastMode = win.ResizeMode;
                win.ResizeMode = ResizeMode.NoResize;
                win.UpdateLayout();
            }
        }
    
        void MouseUp( object sender, EventArgs ea )
        {
            var win = Window.GetWindow( sender as T );
            if( win != null && win.ResizeMode != lastMode )
            {
                win.ResizeMode = lastMode;
                win.UpdateLayout();
            }
        }
    }
    
    public class WinNoSnapBehavior : NoSnapBehavior { }
    
    public class UCNoSnapBehavior : NoSnapBehavior { }
    

    I then attach them to my dialog box Views with:

    
      
        
        
      
    
      ...
    
    
    

    And it just works!

提交回复
热议问题