C# MVVM中具有动态内容的WPF状态栏

C# MVVM中具有动态内容的WPF状态栏,c#,wpf,mvvm,C#,Wpf,Mvvm,我想创建一种灵活显示状态信息的方法,可能还包括交互式功能,如在出现错误时重试操作。在我看来,这对于当前管理状态栏的主窗口来说太大了 这就是为什么我希望将状态栏作为自己的视图与viewmodel以及负责创建不同状态对象(稍后由viewmodel管理)的模型一起使用。根据生成的代码的大小,我甚至可能只使用viewmodel来合并模型和viewmodel,尽管目前我不愿意让应用程序的其他部分直接访问viewmodel 我的问题是:使用viewmodel在自己的视图中移动状态栏的最佳方式是什么 我正在考

我想创建一种灵活显示状态信息的方法,可能还包括交互式功能,如在出现错误时重试操作。在我看来,这对于当前管理状态栏的主窗口来说太大了

这就是为什么我希望将状态栏作为自己的视图与viewmodel以及负责创建不同状态对象(稍后由viewmodel管理)的模型一起使用。根据生成的代码的大小,我甚至可能只使用viewmodel来合并模型和viewmodel,尽管目前我不愿意让应用程序的其他部分直接访问viewmodel

我的问题是:使用viewmodel在自己的视图中移动状态栏的最佳方式是什么

我正在考虑在MainWindow.xaml中使用一个内容控件,该控件获取带有数据绑定的viewmodel,并将视图与位于Window.Resources中的DataTemplate相关联(目前我显示的所有viewmodels都是这样)。我不知道的是,这是否像我希望的那样有效。由于我是WPF新手,我不确定使用ContentControl显示状态栏是否有任何影响。
另一个想法是创建一个usercontrol,或者如果它不起作用,甚至是Statusbar的派生也不起作用,如果ContentControl不起作用


由于方法完全不同,我想在开始之前得到一些提示,以避免以后重构一切。

这将是XAML作为用户控件的状态

<UserControl x:Class="UserControls.UCFooter"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d"
             d:DesignHeight="24" d:DesignWidth="600">
    <Grid>
        <StatusBar HorizontalAlignment="Stretch">
            <StatusBarItem  Width="120">
                <TextBlock>Status:</TextBlock>
            </StatusBarItem>
            <StatusBarItem HorizontalAlignment="Stretch">
                <TextBlock x:Name="XTBStatus" >Ready</TextBlock>
            </StatusBarItem>
            <StatusBarItem HorizontalAlignment="Right">
                <ProgressBar x:Name="XPB" Width="100" Height="10"></ProgressBar>
            </StatusBarItem>
        </StatusBar>
    </Grid>
</UserControl>

地位:
准备好的
这将是一个主窗口,它使用内容控件来交换视图

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:UserControls="clr-namespace:UserControls"  
        x:Class="Display"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        
        <Grid.RowDefinitions>
            <RowDefinition Height="24" />
            <RowDefinition Height="*" />
            <RowDefinition Height="24" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width ="200" />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <UserControls:UCTitle  Grid.ColumnSpan="2" />
        <ContentControl x:Name="XCCMAIN"  Grid.Row="1" Grid.Column="1">
            <UserControls:UCMain />
        </ContentControl>
        <UserControls:UCNav  Margin="5,0,5,0" Grid.Row="1" />
        <UserControls:UCFooter  Grid.Row="2" Grid.ColumnSpan="2" />
    </Grid>
</Window>

有标题、导航、主区域和页脚区域。在主窗口中使用此设计,只需确保适当的区域具有所需的内容,即可轻松地交换视图。请注意,我没有将页脚放入内容控件中,但这是更好的方法,如UCMain示例所示。要交换该部分中的视图,请注意名称为x:name=“XCCMAIN”,这允许代码隐藏中的代码表示XCCMAIN.Content=MyNewUserControl。或者,如果使用binding,只需将binding属性设置为新视图


此图显示了顶部的标题区域(跨越所有grid.columns)、左侧的导航区域(grid.Row=1)、中间的主区域(grid.Row=1、grid.column=1)和底部跨越所有网格列的状态区域。(grid.row=2)

我通常在主窗口中创建内容控制区域,一个用于标题,一个用于导航,一个用于主内容,一个用于状态栏。然后,这些区域中的每个区域都可以有自己的自定义用户控件,该控件允许您根据特定的用户事件交换内容。状态控件用户控件很有意义。那么在ContentControl中使用状态栏不会产生令人讨厌的视觉副作用吗?完美-我对此不太确定,因为在容器中放置一个相对“特殊”的控件(如状态栏)对我来说是第一次,没有底片这样做。Prism就是这样做的,并且能够注入不同的视图。请随意创建一个简短的答案,这样如果没有其他人对我有任何进一步的提示,我可以接受它