PresentationSource.FromVisual(this)在WPF中返回null值

Asi*_*itK 8 .net c# wpf interop hwndsource

我正在使用以下代码:

protected override void OnSourceInitialized(EventArgs e)
{
...
....
HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
...
...
}
Run Code Online (Sandbox Code Playgroud)

在某些系统中,"源"值出现为空,我无法找到原因......

Jan*_*sen 8

从.Net 4.0开始,您HwndSource无需先显示窗口即可访问:

var helper = new WindowInteropHelper(this);
var hwndSource = HwndSource.FromHwnd(helper.EnsureHandle());
Run Code Online (Sandbox Code Playgroud)


小智 7

我想你可能要等到UI被渲染,直到你尝试分配Hwnd.尝试将其放在Window.Loaded的事件处理程序中.

这发生在我之前,我在代码隐藏的构造函数中调用InitializeComponent()之后进行了Hwnd赋值.它总是回来null,当我走过去看到用户界面尚未出现时,这可能会感觉到.我将它弹出到_Loaded处理程序中,然后在点击该行之前UI呈现,所有突然的'this'都停止为null.


The*_*Man 5

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();
}
Run Code Online (Sandbox Code Playgroud)