空域问题:WindowsFormsHost上的弹出内容不会更新

时间:2012-09-25 12:38:13

标签: c# wpf

我遇到了空域问题。我的WPF应用程序托管了一个winform组件。我想在组件加载和长活动期间显示一个带有“等待”文本的弹出窗口。在这里我遇到了问题:弹出窗口正确显示但是当我处理组件的忙碌事件时,我无法更新弹出内容。这里有一些代码XAML:

<WindowsFormsHost Name="wfh" Grid.Row="1" Grid.Column="0" ></WindowsFormsHost>
<Popup x:Name="Overlay" AllowsTransparency="True" Placement="Center" 
       StaysOpen="True"
       IsOpen="True" 
       PlacementTarget="{Binding RelativeSource={RelativeSource FindAncestor,   AncestorType=Grid, AncestorLevel=1}}">
    <TextBlock Name="tbWait"  Foreground="Red" />
</Popup>

和c#:

myWinformComponent.Event => (s, e) => 
{ 
   tbWait.Text = e.IsBusy ?  "Loading..." : string.Empty;
}

我知道WinForm和WPF的空域问题是什么,但我认为保持弹出窗口始终打开让我显示windowformshost的任何内容。

编辑:我在后面的代码中放置了一些断点,我看到Text属性正确更改。此更改不会显示在UI中。

您有解决方法或解决方案吗? 谢谢你们!

2 个答案:

答案 0 :(得分:0)

根据@HansPassant的评论,我可以用这些行强制重绘:

DispatcherFrame frame = new DispatcherFrame();
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new DispatcherOperationCallback(delegate(object parameter) {
        frame.Continue = false;
        return null;
    }), null);
Dispatcher.PushFrame(frame);

也许这不是最优雅的解决方案,但它是我问题的一个有效补丁。

答案 1 :(得分:-1)

不幸的是,您无法在WindowsFormsHost上显示任何WPF内容。我花了很长时间自己打这个怪癖,直到我最终放弃并重新启动UI,使覆盖不必超过WinForms组件。