1

我被空域问题困住了。我的 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 中。

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

4

2 回答 2

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

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

于 2012-09-26T07:30:04.090 回答
-2

不幸的是,您不能在 WindowsFormsHost 上显示任何 WPF 内容。我自己花了很长时间与这个怪癖作斗争,直到我最终放弃并重新调整 UI 以使覆盖层不必位于 WinForms 组件之上。

于 2012-09-25T12:49:15.270 回答