我正在为Autodesk Revit开发一个插件,我已经使用XAML和C#创建了一个WPF窗口,如图像1所示。附加模块的用户需要在我的窗口和Revit之间切换,并且我的窗口需要保持其状态。
由于它是模式对话框,因此在打开我的窗口之前,用户无法与Revit进行交互。因此,在这种情况下,我使用隐藏而不是关闭窗口。当用户再次需要它时,插件使用ShowDialog再次显示窗口。
但问题是,当我再次显示窗口时,它显示为白色(没有控件可见),如图像2所示。一旦我调整了窗口的大小,所有的控件都会显示出来,并且窗口开始正常工作。
图1:

图2:

public partial class NavigationWindow : Window, INotifyPropertyChanged
{
...
}使用此代码来显示,
NavigationWindow navigationWindow = new NavigationWindow();
navigationWindow.ShowDialog ();为了隐藏窗口,我使用了,
Application.Current.Dispatcher.Invoke (() =>
{
this.Visibility = System.Windows.Visibility.Hidden;
});对如何解决这个问题有什么想法吗?
发布于 2018-01-11 12:07:46
我建议使用无模式窗口。这是在与Revit交互时保持窗口打开的正确方法。解决这个问题的方法是使用IdleEvent或ExternalEvent。下面是一个包含空闲事件的简单场景。只需将window.ShowDialog()切换为window.Show(),这将使其成为无模式的。
首先,您需要向IExternalApplication添加一个空闲事件队列和处理程序,如下所示:
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进行交互。
下面是如何从任何位置向队列中添加任务:
EnqueueTask(app =>
{
//do something
//use app object to interact with Revit
});https://stackoverflow.com/questions/48191214
复制相似问题