C# WPF 移动窗口

6
我已经将以下参数添加到我的Window中:
WindowStyle="None"
WindowStartupLocation="CenterScreen"
AllowsTransparency="True"
ResizeMode="NoResize" Background="Transparent" 

现在我无法移动窗口,因此我已经添加了以下代码到我的窗口:

#region Window: Moving

private void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    DragMove();
}

#endregion

此外,我必须说明我的窗口中的XAML代码如下(窗口看起来像多边形):
<Window Title="New Science"
    Height="588" Width="760" MinHeight="360" MinWidth="360"
    WindowStyle="None" WindowStartupLocation="CenterScreen"
    AllowsTransparency="True"
    ResizeMode="NoResize" Background="Transparent"
    xmlns:my="clr-namespace:Bourlesque.Lib.Windows.Media;assembly=Bourlesque.Lib.Windows.Media">
    <Grid>
        <my:UniPolygon DefaultRadiusIn="10" DefaultRadiusOut="10" Fill="#FF92C2F2" Name="m_tPlgOuter" Offset="0" Points="         0;26;;         10;19;10;;         10;0;;         265;0;20;;         290;20;20;;          -60,1;20;3;;         -60,1;5;10;;         -40,1;5;10;;         -40,1;20;2.5;;          -35,1;20;2.5;;         -35,1;5;10;;         -15,1;5;10;;         -15,1;20;3;;          0,1;20;;         0,1;0,1;;         0;0,1;;       " Stretch="None" Stroke="#FF535353" StrokeThickness="0.1" />
    </Grid>
</Window>

我想知道如何在鼠标拖动时改变Window的位置,以及在调整大小时添加什么条件来使控件和其他内容也一起调整大小(我找到了这个调整大小的代码,想知道它是否好用:这里)。
6个回答

13

我使用了MouseDown事件:

<Window .....
     MouseDown="Window_MouseDown"  >

使用这段代码:

  private void Window_MouseDown(object sender, MouseButtonEventArgs e)
  {
     if(e.ChangedButton == MouseButton.Left)
        this.DragMove();
  }

1
这是最干净的方式。 - CareTaker22

4
发现了一个示例:http://cloudstore.blogspot.com.br/2008/06/moving-wpf-window-with-windowstyle-of.html 无论如何,在WinForms中移动窗口,我在一个项目中使用了以下代码,如果您遇到问题可能会有用:
private bool clicado = false;
private Point lm = new Point();
void PnMouseDown(object sender, MouseEventArgs e)
{
    clicado = true;
    this.lm = MousePosition;
}

void PnMouseUp(object sender, MouseEventArgs e)
{
    clicado = false;
}

void PnMouseMove(object sender, MouseEventArgs e)
{
    if(clicado)
    {
        this.Left += (MousePosition.X - this.lm.X);
        this.Top += (MousePosition.Y - this.lm.Y);
        this.lm = MousePosition;
    }
}

4

我尝试了另一种解决方案,它起作用了(虽然不确定是否最正确)

private void GridOfWindow_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        var move = sender as System.Windows.Controls.Grid;
        var win = Window.GetWindow(move);
        win.DragMove();
    }

GridOfWindow是网格的名称。

<Grid x:Name="GridOfWindow" MouseLeftButtonDown="GridOfWindow_MouseLeftButtonDown">

这个主要答案完美地运行,没有任何错误或问题。 - Dev Kevin

3

@Marcio,在WPF中没有Windows.Forms。

我已经让这个版本在WPF中工作(稳定)了。

private bool clicked = false;
private Point lmAbs = new Point();
void PnMouseDown(object sender, System.Windows.Input.MouseEventArgs e)
{
  clicked = true;
  this.lmAbs = e.GetPosition(this);
  this.lmAbs.Y = Convert.ToInt16(this.Top) + this.lmAbs.Y;
  this.lmAbs.X = Convert.ToInt16(this.Left) + this.lmAbs.X;
}

void PnMouseUp(object sender, System.Windows.Input.MouseEventArgs e)
{
  clicked = false;
}

void PnMouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
  if (clicked)
  {
    Point MousePosition = e.GetPosition(this);
    Point MousePositionAbs = new Point();
    MousePositionAbs.X = Convert.ToInt16(this.Left) + MousePosition.X;
    MousePositionAbs.Y = Convert.ToInt16(this.Top) + MousePosition.Y;
    this.Left = this.Left + (MousePositionAbs.X - this.lmAbs.X);
    this.Top = this.Top + (MousePositionAbs.Y - this.lmAbs.Y);
    this.lmAbs = MousePositionAbs;
  }
}

亲切的问候,
Lex

3

代码质量很好,但有错误。它会使您失去控制。

请尝试我的修改:

private bool clicado = false;
private Point lm = new Point();
void PnMouseDown(object sender, System.Windows.Input.MouseEventArgs e)
{
    clicado = true;
    this.lm = System.Windows.Forms.Control.MousePosition;
    this.lm.X = Convert.ToInt16(this.Left) - this.lm.X;
    this.lm.Y = Convert.ToInt16(this.Top) - this.lm.Y;
}

void PnMouseUp(object sender, System.Windows.Input.MouseEventArgs e)
{
    clicado = false;
}

void PnMouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
    if (clicado)
    {
        this.Left = (System.Windows.Forms.Control.MousePosition.X + this.lm.X);
        this.Top = (System.Windows.Forms.Control.MousePosition.Y + this.lm.Y);
    }
}

这会将您的移动杆移动到光标位置。(///▽///)


0

我必须稍微修复上面的一点才能正常工作...现在完美运行!在你的主窗口使用MouseLeftButtonDown。

    private void EnableDrag(object sender, MouseButtonEventArgs e)
    {
        var move = sender as Window;
        if (move != null)
        {
            Window win = Window.GetWindow(move);
            win.DragMove();
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接