KevinBui
KevinBui

Reputation: 1129

How to move control in panel by mouse

I can not move the border control while the mouse is outside the border cotnrol

<Window
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication2"
  x:Class="WpfApplication2.MainWindow"
  x:Name="Window"
  Title="Window1"
  Width="346.5" Height="215" WindowStyle="SingleBorderWindow" >

    <Grid Name="stack" >

        <Border x:Name="btn" Width="50" Height="20" VerticalAlignment="Top" BorderThickness="1" BorderBrush="Black" Background="#FFF50000"
                MouseMove="btn_MouseMove" MouseDown="btn_MouseDown" MouseUp="btn_MouseUp"  />
    </Grid>
</Window> 

Code behind

bool state = false;
Point prePoint;

private void btn_MouseMove(object sender, MouseEventArgs e)
{
    if (state)
    {
        Point p = e.GetPosition(this);
        Point p2 = e.GetPosition(btn);
        btn.Margin = new Thickness(0, p.Y - p2.Y + p.Y - prePoint.Y, 0, 0);
        prePoint = e.GetPosition(this);
    }
}
private void btn_MouseDown(object sender, MouseButtonEventArgs e)
{
    if (sender == btn)
    {
        prePoint = e.GetPosition(this);
        state = true;
    }
}

private void btn_MouseUp(object sender, MouseButtonEventArgs e)
{
    state = false;
}

Upvotes: 1

Views: 2146

Answers (2)

Code0987
Code0987

Reputation: 2618

Just Capture the mouse when it is inside the border and release it after task is completed, else it will stick. OR acc. to your code it might be like this ->

bool state = false;
Point prePoint;

private void btn_MouseMove(object sender, MouseEventArgs e)
{
if (state)
{
    Point p = e.GetPosition(this);
    Point p2 = e.GetPosition(btn);
    btn.Margin = new Thickness(0, p.Y - p2.Y + p.Y - prePoint.Y, 0, 0);
    prePoint = e.GetPosition(this);
    // Capture Mouse here ! as far as i think. !!!
    Mouse.Capture(this.ColorPlane, CaptureMode.Element);
}
else
{
    // Release Mouse here ! as far as i think. !!!
    Mouse.Capture(null);
}
}

Upvotes: 0

Renatas M.
Renatas M.

Reputation: 11820

Because mouse move event fires when mouse is in border control. I think you need add mouse move event for window not for border control

Upvotes: 1

Related Questions