有的情况下,为了避免模态窗口弹出时无法操作别的窗口,会对个别窗口使用新的线程运行。 示例代码: ```cs public static class DispatcherBuilder { public static Dispatcher Build() { Dispatcher dispatcher = null; var manualResetEvent = new ManualResetEvent(false); var thread = new Thread(() => { dispatcher = Dispatcher.CurrentDispatcher; var synchronizationContext = new DispatcherSynchronizationContext(dispatcher); SynchronizationContext.SetSynchronizationContext(synchronizationContext); manualResetEvent.Set(); try { Dispatcher.Run(); } catch { // ignore } }, maxStackSize: 1); thread.Priority = ThreadPriority.Normal; thread.SetApartmentState(ApartmentState.STA); thread.IsBackground = true; thread.Start(); manualResetEvent.WaitOne(); manualResetEvent.Dispose(); return dispatcher; } } ``` ```cs private void ButtonBase_OnClick(object sender, RoutedEventArgs e) { var dispatcher = DispatcherBuilder.Build(); dispatcher.InvokeAsync(() => { try { MainWindow mainWindow = new MainWindow(); mainWindow.Show(); } catch (Exception ex) { MessageBox.Show(ex.Message); } }); } ``` 使用HC库以后,这种情况会报线程错误:  WPF原生风格没有这个问题。 示例代码(threadtest分支):https://github.com/cuiliang/HandyControl/tree/threadtest
Activity
lwqwag commentedon Jan 22, 2021
使用hc后我也遇到同样的问题
GF-Huang commentedon Jan 22, 2021
建议代码用这种形式包起来,没有着色很难看。
NaBian commentedon Jan 26, 2021
先尝试一下这里的解决方案 access-to-styles-from-several-ui-threads
cuiliang commentedon Jan 29, 2021
@NaBian
这里的方案(使用一个线程,模拟ShowDialog)我也在使用,有个问题:子窗体关闭的时候,父窗体有些时候会被最小化。
多线程的场景主要是有一些用户自定义的c#脚本,把它们当作一个独立的程序运行,这种情况下放在新的线程里比较合适一点。
NaBian commentedon Jan 31, 2021
原因其实知道,是因为window在初始化的时候会去app.xaml中寻找默认样式,这将导致跨线程,所以报错了,但是还没有时间尝试该如何解决
NaBian commentedon Jun 20, 2021
需要使用子线程打开的窗口需要独立的样式资源,使用以下代码可解决多线程报错问题:
cuiliang commentedon Jun 20, 2021
@NaBian 感谢~ 今天找到了一个使用await的方式避免多线程。
https://stackoverflow.com/a/25601933/3335415
再加上一些禁用父窗口的处理,大概可以模拟模态的效果。 就是不知道会不会有别的问题,等发布版本以后看看有没有反馈😂
fixed HandyOrg#632