WPF: ссылка на окно из пользовательского элемента управления

2

Я выполнил инструкции Accepted Answer от этого сообщения в отношении создания кода, лежащего за файлом для ресурсного словаря, и он сработал... поэтому теперь я могу прикрепить событий для элементов управления в файле generic.xml.

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

Итак, из кода ресурсного словаря за файлом, есть ли способ сделать ссылку на окно, которое в настоящее время будет размещать этот словарь ресурсов?


[Обновление] (временное решение)

Как простой (но глупый) обходной путь, я в настоящее время сделал следующее:
Поскольку я могу ссылаться на Application.Current.MainWindow по коду Generic.xaml.cs, теперь у меня это есть в Generic.xaml.cs:

private void Border_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{               
    Application.Current.MainWindow.DragMove();
}

И затем я прикрепляю обработчик PreviewMouseLeftButtonDown к каждому Window, который у меня есть, например:

private void Window_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    Application.Current.MainWindow = this;
}

Это, ну, это работает... и пока кто-то не придумает правильный способ, как это сделать, он должен хорошо служить мне.

Теги:
wpf
events

3 ответа

2
Лучший ответ

Я не знаю, как это сделать. Однако, если вы пытаетесь определить Window с учетом определенного ресурса, вы можете использовать RelativeSource:

<SolidColorBrush x:Key="MyBrush" Color="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Converter={StaticResource WindowToColorConverter}"/>

И если вы делаете это из кода, вы можете использовать Window.GetWindow(). Вам просто нужен DependencyObject, размещенный в Window.

0

С архитектурной точки зрения, я бы сказал, вы собираетесь нарушить парадигму. Это может быть плохое решение, предоставляющее ресурсный словарь с понятием пользовательского интерфейса, которое его потребляет, и дает некоторую логику, отличную от предоставления ресурсов.

Вам может понадобиться некоторый адаптер между пользовательским интерфейсом и ресурсным словарем или контроллером, если это действительно необходимо для проводки ресурсного словаря, но вам не нужно вводить какую-либо логику в контейнер ресурсов...

0

Вы можете получить доступ к своему главному окну через

Application.Current.MainWindow

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

  • 0
    Это не текущее окно, это главное окно. Они часто не одно и то же.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню