Переместить два окна WPF одновременно? - PullRequest
6 голосов
/ 15 января 2009

Мое главное окно породило дочернее окно, которое расположено сверху, чтобы выглядеть как часть основного. Я хотел бы переместить дочернее окно синхронно с основным, но я не уверен, как это сделать.

Мое главное окно имеет собственную строку заголовка, событие которой MouseLeftButtonDown вызывает эту функцию:

public void DragWindow(object sender, MouseButtonEventArgs args)
{
     DragMove();
     UpdateChildWindowPosition();
}

Это приводит к тому, что выполнение DragMove () в главном окне перемещает главное окно в одиночку, когда я перетаскиваю строку заголовка. UpdateChildWindowPosition () не выполняется, пока я не отпущу мышь, при которой он считывает координаты некоторых элементов и устанавливает позицию дочернего окна - вы видите привязку дочернего окна к местоположению, которое не является желательным.

Как сделать так, чтобы дочернее окно двигалось синхронно с главным окном?

Ответы [ 4 ]

5 голосов
/ 15 января 2009

АХ ХАХ!

В моем главном окне есть событие LocationChanged, которое я привязал к своему UpdateChildWindowPosition (). LocationChange срабатывает, когда (duh) местоположение меняется, поэтому оно непрерывно срабатывает, когда я перемещаю окно, когда DragMove () выполняется в моем DragWindow, опубликованном выше.

4 голосов
/ 15 января 2009

Вы можете использовать свойства Left и Top окна для размещения вторичного окна. Вот пример кода:

В коде MainWindow:

        mDebugWindow.Left = this.Left + this.ActualWidth;
        mDebugWindow.Top = this.Top;

В этом случае mDebugWindow - мое дочернее окно. Этот код говорит ему сидеть с правой стороны главного окна, выровняв верхнюю часть окон.

Надеюсь, это поможет.

0 голосов
/ 18 января 2018

Вот что я сделал:

Сначала я установил Instance of Parent как владельца дочернего окна (создайте экземпляр, установив его в классе MainWindow public static MainWindow instance; затем instance = this;):

public ChildWindow()
{
    Owner = MainWindow.instance;
    InitializeComponent();
}

Затем я добавляю обработчик событий в Родительский класс, чтобы он срабатывал при перемещении Родителя:

public MainWindow()
{
    InitializeComponent();
    LocationChanged += new EventHandler(Window_LocationChanged);
}

Теперь я перебираю все окна, открытые MainWindow, чтобы сбросить их поля:

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);
    }
}
0 голосов
/ 15 января 2009

Можете ли вы предоставить метод DragMove () для дочерней формы? Тогда просто позвонить от родителя?

public void DragWindow(object sender, MouseButtonEventArgs args)
{
     DragMove();
     UpdatePosition();

     childForm.DragMove();
     childForm.UpdatePosition();
}

или если вы просто используете положение мыши, чтобы определить, куда перемещать форму, выполните те же вычисления в текущем методе DragMove () и также измените свойство Form.Location своей дочерней формы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...