PresentationSource.FromVisual(this) возвращает нулевое значение в WPF
Я использую следующий код для моего:
protected override void OnSourceInitialized(EventArgs e)
{
...
....
HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
...
...
}
В некоторых системах значение "source" оказывается нулевым, и я не могу найти причину, почему...
3 ответа
Я думаю, что вам, возможно, придется подождать, пока пользовательский интерфейс будет отображен, пока вы не попытаетесь назначить Hwnd. Попробуйте вместо этого поместить его в обработчик событий Window.Loaded.
Это случилось со мной раньше, у меня было назначение Hwnd после того, как InitializeComponent() был вызван в конструкторе выделенного кода. Он всегда возвращался к нулю, что может почувствовать, когда я вошел и увидел, что пользовательский интерфейс еще не появился. Я вставил его в обработчик _Loaded и вуаля, пользовательский интерфейс рендерится до того, как нажать эту строку, и внезапно "this" перестало быть нулевым.
Начиная с.Net 4.0, вы можете получить доступ HwndSource
без необходимости сначала показывать окно:
var helper = new WindowInteropHelper(this);
var hwndSource = HwndSource.FromHwnd(helper.EnsureHandle());
Ответ WumpasTamer правильный. Я просто хотел бы добавить пример быстрого кода для тех, кто ищет решение "под ключ". Если вы используете WPF уже тогда window
не обязательно, но если вы используете Winforms и хотите использовать PresentationSource
вам нужно будет использовать это.
void Main()
{
var window = new Window
{
Width = 0,
Height = 0,
WindowStyle = WindowStyle.None,
ShowInTaskbar = false,
ShowActivated = false
};
window.Loaded += a_Loaded;
window.Show();
}
void a_Loaded(object sender, EventArgs e)
{
var s = (Window) sender;
var source = PresentationSource.FromVisual(s);
//...
s.Close();
}