【问题标题】:C# WPF Move the windowC# WPF 移动窗口
【发布时间】:2013-05-12 14:11:15
【问题描述】:

我已将以下参数添加到我的Window

WindowStyle="None"
WindowStartupLocation="CenterScreen"
AllowsTransparency="True"
ResizeMode="NoResize" Background="Transparent" 

现在我无法移动Window,所以我将以下部分代码添加到我的Window

#region Window: Moving

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

#endregion

我还必须指定我的Window 中的XAML 代码如下(Window 看起来像Polygon):

<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 改变它在鼠标拖动时的位置以及添加什么来调整窗口大小,条件是我将添加的控件和其他东西也会调整大小(我有发现此代码可调整大小,我想知道是否合适here)。

【问题讨论】:

    标签: c# wpf resize window


    【解决方案1】:

    我使用了 MouseDown 事件:

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

    使用此代码:

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

    【讨论】:

    • 这是最干净的方式。
    【解决方案2】:

    找到一个例子: 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;
        }
    }
    

    【讨论】:

      【解决方案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);
          }
      }
      

      它会让你的移动棒对准你的光标。(///▽///)

      【讨论】:

        【解决方案4】:

        @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;
          }
        }
        

        亲切的问候,

        莱克斯

        【讨论】:

          【解决方案5】:

          我已经尝试了另一种解决方案并成功了(但不确定它是否最正确)

          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">
          

          【讨论】:

          • 这工作完美,没有任何错误/问题作为主要答案。
          猜你喜欢
          • 2018-04-28
          • 2017-07-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-27
          • 1970-01-01
          • 1970-01-01
          • 2013-09-04
          相关资源
          最近更新 更多