Я выполнил инструкции 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;
}
Это, ну, это работает... и пока кто-то не придумает правильный способ, как это сделать, он должен хорошо служить мне.
Я не знаю, как это сделать. Однако, если вы пытаетесь определить Window
с учетом определенного ресурса, вы можете использовать RelativeSource
:
<SolidColorBrush x:Key="MyBrush" Color="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Converter={StaticResource WindowToColorConverter}"/>
И если вы делаете это из кода, вы можете использовать Window.GetWindow(). Вам просто нужен DependencyObject
, размещенный в Window
.
С архитектурной точки зрения, я бы сказал, вы собираетесь нарушить парадигму. Это может быть плохое решение, предоставляющее ресурсный словарь с понятием пользовательского интерфейса, которое его потребляет, и дает некоторую логику, отличную от предоставления ресурсов.
Вам может понадобиться некоторый адаптер между пользовательским интерфейсом и ресурсным словарем или контроллером, если это действительно необходимо для проводки ресурсного словаря, но вам не нужно вводить какую-либо логику в контейнер ресурсов...
Вы можете получить доступ к своему главному окну через
Application.Current.MainWindow
Надеюсь, что это поможет