我有一个主窗口,用于显示两个可能的视图之一(ConfigView& AnalyzeView):
<Window.Resources>
<DataTemplate DataType="{x:Type vm:ConfigViewModel}">
<v:ConfigView/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:AnalyzeViewModel}">
<v:AnalyzeView/>
</DataTemplate>
</Window.Resources>
<Grid>
<ContentControl Content="{Binding CurrentViewModel}" />
</Grid>
从ConfigView转换到AnalyzeView时,我想先等待AnalyzeView在执行分析操作之前完全显示在主窗口中。我最初在AnalyzeView中为Loaded事件添加了一个EventTrigger,作为开始分析操作的一种方式:
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding LoadedCmd}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
但是,我发现在主窗口中显示AnalyzeView之前会触发此事件。实际上,似乎在Loaded事件之后的某个时间,AnalyzeView不会显示在主窗口中。
是否有任何可以触发的事件,以便只有在主窗口中完全显示AnalyzeView后才能启动分析操作?
编辑: 最终,主要目标可能是在AnalyzeView上显示一个显示分析操作进度的进度条。基本上,用户按下&#34;开始分析&#34;按钮,转换到AnalyzeView并开始分析过程,随时更新进度条。
答案 0 :(得分:0)
所以,看起来你可以 - SO question - 但我很好奇你为什么要这样做。 View应该只是ViewModel中公开属性的呈现。你有什么用处(病态的好奇心)?
修改:根据您更新的问题,我推荐以下内容:
正常加载AnalyzeView,<ProgressBar/>
绑定到ViewModel递增的公开属性(在分析过程中)。这种同步性可以通过事件绑定来实现,并且PropertyChanged.Fody
NuGet包使用[ImplementPropertyChanged]
属性更容易实现。此属性在包的更新版本中重命名,而不是我正在使用的,但通过快速搜索,您应该找到您在那里寻找的内容。在任何情况下,属性都会自动处理触发,因此在ViewModel中更新属性时,View更新的绑定属性也会一样。
如果您想查看使用<ProgressBar/>
的示例,请告诉我。我在某处有一个人。
答案 1 :(得分:0)
我认为您所看到的是,在UI线程完成加载控件后,Loaded事件会触发,但如果您在LoadedCmd中设置了断点,那么您将注意到AnalyzeView未被渲染然而。
这是因为WPF有一个后台渲染线程,即使UI线程已经完成加载,它还没有机会渲染控件。当你的程序遇到断点时,所有线程都被分解,因此看起来好像AnalyzeView从未完成加载。
我建议尝试允许命令执行填充AnalyzeView所需的任何操作,就像你已经在这里布局一样 - 如果他们长时间运行,并且不必是加载到DependencyProperties中,您应该异步运行它们,以便UI线程可以响应输入。
编辑1:关注@ wimpSquad的回答你的评论 - 保持这个MVVM并在保持UI响应的同时显示进度,你肯定会想要查看任务和报告进度。 Stephen Cleary有一篇很好的文章 here。