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

时间:2012-06-26 09:21:29

标签: c# .net wpf interop hwndsource

我正在使用以下代码:

protected override void OnSourceInitialized(EventArgs e)
{
...
....
HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
...
...
}

在某些系统中,“source”值为null,我无法找到原因......

3 个答案:

答案 0 :(得分:7)

我认为您可能需要等到呈现UI,直到您尝试分配Hwnd。尝试将其放在Window.Loaded的事件处理程序中。

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

答案 1 :(得分:6)

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

var helper = new WindowInteropHelper(this);
var hwndSource = HwndSource.FromHwnd(helper.EnsureHandle());

答案 2 :(得分:4)

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();
}