完全显示UserControl后如何执行操作?

时间:2017-11-21 21:15:33

标签: c# wpf mvvm

我有一个主窗口,用于显示两个可能的视图之一(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并开始分析过程,随时更新进度条。

2 个答案:

答案 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

进一步阅读:
WPF Threading Model
Async Loading Of Data