【发布时间】:2023-03-13 08:01:01
【问题描述】:
我基本上是在编写一个简单的浮动面板,它的位置可以通过拖动其标题栏(它本身就是一个网格)来更改。但我无法让它工作! MouseEventArgs.GetPosition 似乎返回了错误的点。我在这里想念什么?
public class FloatingPanel : Grid
{
Grid gridTitle;
bool dragging = false;
Point lastPos;
public FloatingPanel(UserControl gadget)
{
this.MouseMove += FloatingPanel_MouseMove;
gridTitle = new Grid();
gridTitle.Height = 25;
gridTitle.VerticalAlignment = System.Windows.VerticalAlignment.Top;
gridTitle.Background = Brushes.Cyan;
gridTitle.MouseLeftButtonDown += gridTitle_MouseLeftButtonDown;
gridTitle.MouseLeftButtonUp += gridTitle_MouseLeftButtonUp;
this.Children.Add(gridTitle);
this.Height = gadget.Height + 25;
this.Width = gadget.Width;
gadget.VerticalAlignment = System.Windows.VerticalAlignment.Bottom;
this.Children.Add(gadget);
}
void gridTitle_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
dragging = false;
}
void gridTitle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
lastPos = Mouse.GetPosition(this);
dragging = true;
}
void FloatingPanel_MouseMove(object sender, MouseEventArgs e)
{
if(dragging)
{
Vector delta = e.GetPosition(this) - lastPos;
this.Margin = new Thickness(this.Margin.Left + delta.X, this.Margin.Top + delta.Y, this.Margin.Right, this.Margin.Bottom);
lastPos = e.GetPosition(this);
}
}
}
我也尝试过使用System.Windows.Forms.Cursor.Position 和System.Windows.Forms.Control.MousePosition 来给出屏幕上的位置。但是没有运气。
解决方案:通过 3 次修改解决了这个问题(正如 Sphinxxx 指出的那样):
- 使用MouseEventArgs.GetPosition(null) 代替MouseEventArgs.GetPosition(this)
- 使用Mouse.Capture(gridTitle) 和Mouse.Capture(null) 在mousedown 和mouseup 事件中捕获和释放鼠标
- 设置网格的水平和垂直对齐方式。 (这对我来说似乎很奇怪。为什么 nod 设置对齐会导致问题?)
【问题讨论】:
标签: c# wpf .net-4.0 mousemove mouse-position