首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF窗口隐藏后使用ShowDialog方法出现白屏

WPF窗口隐藏后使用ShowDialog方法出现白屏
EN

Stack Overflow用户
提问于 2018-01-10 23:49:26
回答 1查看 1.1K关注 0票数 1

我正在为Autodesk Revit开发一个插件,我已经使用XAML和C#创建了一个WPF窗口,如图像1所示。附加模块的用户需要在我的窗口和Revit之间切换,并且我的窗口需要保持其状态。

由于它是模式对话框,因此在打开我的窗口之前,用户无法与Revit进行交互。因此,在这种情况下,我使用隐藏而不是关闭窗口。当用户再次需要它时,插件使用ShowDialog再次显示窗口。

但问题是,当我再次显示窗口时,它显示为白色(没有控件可见),如图像2所示。一旦我调整了窗口的大小,所有的控件都会显示出来,并且窗口开始正常工作。

图1:

图2:

代码语言:javascript
复制
public partial class NavigationWindow : Window, INotifyPropertyChanged
{
...
}

使用此代码来显示,

代码语言:javascript
复制
NavigationWindow navigationWindow = new NavigationWindow(); 
navigationWindow.ShowDialog ();

为了隐藏窗口,我使用了,

代码语言:javascript
复制
Application.Current.Dispatcher.Invoke (() =>
{
    this.Visibility = System.Windows.Visibility.Hidden;
});

对如何解决这个问题有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2018-01-11 12:07:46

我建议使用无模式窗口。这是在与Revit交互时保持窗口打开的正确方法。解决这个问题的方法是使用IdleEventExternalEvent。下面是一个包含空闲事件的简单场景。只需将window.ShowDialog()切换为window.Show(),这将使其成为无模式的。

首先,您需要向IExternalApplication添加一个空闲事件队列和处理程序,如下所示:

代码语言:javascript
复制
public class AppCommand : IExternalApplication
{
    private static Queue<Action<UIApplication>> Tasks;
    public Result OnStartup(UIControlledApplication application)
    {
        Tasks = new Queue<Action<UIApplication>>();
        application.Idling += OnIdling;

        return Result.Succeeded;
    }
    private static void OnIdling(object sender, IdlingEventArgs e)
    {
        var app = (UIApplication)sender;
        lock (Tasks)
        {
            if (Tasks.Count <= 0) return;

            var task = Tasks.Dequeue();
            task(app);
        }
    }
    public static void EnqueueTask(Action<UIApplication> task)
    {
        lock (Tasks)
        {
            Tasks.Enqueue(task);
        }
    }
}

因此,当Revit不执行任何操作时,将触发空闲事件。这是从另一个线程(UI)与Revit进行交互的最佳时机。因此,当您处于无模式对话框中并希望将任务发送到Revit时,只需使用EnquuqTask实用程序将任务放入队列中,然后Revit在空闲时将触发空闲事件,将任务从队列中移出并执行。这可确保您不会执行Revit作用域之外的任何操作,并使您可以使窗口保持无模式状态,以便在窗口打开时与Revit进行交互。

下面是如何从任何位置向队列中添加任务:

代码语言:javascript
复制
EnqueueTask(app =>
{
    //do something
    //use app object to interact with Revit
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48191214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档