Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cant drag and move a WPF Form

Tags:

window

wpf

drag

People also ask

How do I move the grid in WPF?

Just put the grid panel inside a canvas rather than directly into the window - this will then give it X/Y co-ordinates.


I am using a main window to hold pages (creating a navigation style program), and in the code behind of my main window, I inserted this...

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
    base.OnMouseLeftButtonDown(e);

    // Begin dragging the window
    this.DragMove();
}

... and it works like a charm. This is with windowstyle=none. Its nice in the sense that you can click anywhere on the app and move it instead of just being limited to a top bar.


See this question.

Basically you use the Window.DragMove method for this.


In our application we have Windows with WindowStyle set to "none", we implemented the functionality to drag the Window, but only from the header rather than from any point in the Window. We did this by adding a Border as a header, then adding a Thumb to fill the entire Border. We then handle the DragDelta method on the Thumb in the code-behind for the Window.

<Border 
        Name="headerBorder" 
        Width="Auto" 
        Height="50" 
        VerticalAlignment="Top"
        CornerRadius="5,5,0,0" 
        DockPanel.Dock="Top" 
        Background="{StaticResource BackgroundBrush}" 
        BorderThickness="1,1,1,1"
        BorderBrush="{StaticResource BorderBrush}">
        <Grid>
            <Thumb 
                x:Name="headerThumb" 
                Opacity="0" 
                Background="{x:Null}" 
                Foreground="{x:Null}" 
                DragDelta="headerThumb_DragDelta"/>
        </Grid>
    </Border>

Then in the code-behind we have the following event handler...

private void headerThumb_DragDelta(object sender, DragDeltaEventArgs e)
{
    Left = Left + e.HorizontalChange;
    Top = Top + e.VerticalChange;
}

I don't know if this is any better than the other method, it's just the way we did it.


either inside the windows on load function or inside the grid's on load function use a deligate to trigger the DragMove() method on Mouse Click

private void Grid_Loaded(object sender, RoutedEventArgs e)
{
            this.MouseLeftButtonDown += delegate{DragMove();};
}

If you simply add this.DragMove(); and you are using Bing Maps, then you will get some frustrating behavior when trying to pan the map.

Using TabbyCool's answer was a good solution however, you can not drag the window against the top of the screen to maximise it.

My solution was just checking that the position.Y of my click relative to my top bar grid was less than a suitable amount.

 protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
    {
        base.OnMouseLeftButtonDown(e);

        Point pt = e.GetPosition(topBar);

        Debug.WriteLine(pt.Y);

        if (pt.Y < topBar.ActualHeight)
        {
            DragMove();
        }
    }