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();
}
Другие вопросы по тегам