我有两种类型的窗口: Main 和 Child 。当我移动main时,所有子窗口也必须移动。我的所有窗口都有样式None
,所以我使用DragMove
。对于移动孩子,我使用 Main 的LocationChange
。如果我开始快速移动主窗口,孩子会有一些延迟移动。我的窗户彼此粘在一起,所以当快速移动主窗口时,会出现一些间隙。
我用这个问题
Move two WPF windows at once?
如何减少这种差距?
一些代码:
private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
StickyWindow.ParentWndStartMove(this);
this.DragMove();
}
这里我移动所有孩子
public static void ParentWndMove(Window parentWindow)
{
for (int i = 0; i < windowsToMove.Length; i++)
{
if (windowsToMove[i])
{
windows[i].Top += -(parentWindowPosition.Y - parentWindow.Top);
windows[i].Left += -(parentWindowPosition.X - parentWindow.Left);
}
}
parentWindowPosition.X = parentWindow.Left;
parentWindowPosition.Y = parentWindow.Top;
}
答案 0 :(得分:1)
我将根据你的代码片段 parentWindowPosition 做出假设 是一个结构或类,其X和Y初始化为MainWindow的Left和Top值。
如果是这种情况,那么只需要在MouseLeftButtonDown处理程序中执行的操作就是调用DragMove()
private void MainWindow_OnMouseLeftButtonDown(object sender,
MouseButtonEventArgs e)
{
DragMove();
}
在MainWindow的LocationChanged事件中注册处理程序。
LocationChanged += MainWindow_OnLocationChanged;
调用ParentWndMove()方法
private void MainWindow_OnLocationChanged(object sender, EventArgs e)
{
ParentWndMove(sender as Window)
}
这个代码可以在我的系统上运行,无论我拖动主窗口的速度有多快,窗口位置永远不会失去同步。
注意:您发布的ParentWndMove()方法存在一些编译时错误。我发布了一个固定版本供参考
public static void ParentWndMove(Window parentWindow)
{
for (int i = 0; i < windowsToMove.Length; i++)
{
if (windowsToMove[i] != null)
{
windowsToMove[i].Top += -(parentWindowPosition.Y - parentWindow.Top);
windowsToMove[i].Left += -(parentWindowPosition.X - parentWindow.Left);
}
}
parentWindowPosition.X = parentWindow.Left;
parentWindowPosition.Y = parentWindow.Top;
}
答案 1 :(得分:0)
这是我做的:
我首先将Parent的Instance设置为子窗口的所有者,(通过在ParentWindow类public static ParentWindow instance;
中设置实例然后instance = this;
来创建实例):
public ChildWindow()
{
Owner = ParentWindow.instance;
InitializeComponent();
}
然后我在Parent Class中添加一个事件处理程序,以便在Parent移动时触发:
public ParentWindow()
{
InitializeComponent();
LocationChanged += new EventHandler(Window_LocationChanged);
}
现在我循环遍历ParentWindow所有的窗口以重置其边距:
private void Window_LocationChanged(object sender, EventArgs e)
{
foreach (Window win in this.OwnedWindows)
{
win.Top = this.Top + ((this.ActualHeight - win.ActualHeight) / 2);
win.Left = this.Left + ((this.ActualWidth - win.ActualWidth) / 2);
}
}