如何使用CaliburnMicro将控件加载到Shell的不同ContentControls中?

8
默认情况下,当您使用“ActivateItem(new Control());”时,您的控件会加载到一个名为ActiveItem的ContentControl中。如果我在页面上有多个内容控件,如何将控件加载到它们中,同时保留能够将控件加载到活动项控件的默认功能呢?
例如,我想将登录控件加载到登录ContentControl中,当用户成功登录后,我希望将一个新的控件加载到ActiveItem ContentControl中。
提前感谢。
3个回答

7
如果与UI绑定的ViewModel包含与内容控件名称匹配的属性,则该内容控件视图自动解析为由此属性支持的视图,前提是该属性本身是ViewModel类型,并已在Ioc容器中注册。例如:
<ContentControl x:Name="LoginStatus"></ContentControl>

如果主ViewModel中有一个名为LoginStatus的属性(LoginStatus属性本身是一个ViewModel),那么内容控件会正确地呈现相应的视图。

4
这是一个老问题,但如果有人遇到相同的问题,这是我的解决方案:
  1. 你的主窗口必须从Caliburn.Micro.Conductor<Screen>.Collection.AllActive继承,它包含两个(甚至更多)用户控件;
  2. 你的用户控件必须从Caliburn.Micro.Screen继承;
  3. 你还必须记住命名规则。如果你在视图中使用MenuUC作为ContentControl的名称,请在ViewModel中创建一个名为MenuUC的属性;
  4. 像我在构造函数中一样初始化你的用户控件;
  5. 现在你可以在代码中任何地方使用ActivateItem(MenuUC)DeactivateItem(MenuUC)。Caliburn.Micro会自动检测你想要使用哪一个。

XAML视图代码示例:

<Window x:Class="YourProject.Views.YourView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="YourViewTitle" Width="900" Height="480">

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="4*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!-- Menu Side Bar -->
        <ContentControl Grid.Row="0" Grid.Column="0" x:Name="MenuUC" />

        <!-- Panel -->
        <Border Grid.Column="1" Grid.RowSpan="2" BorderThickness="1,0,0,0" BorderBrush="#FF707070" >
            <ContentControl x:Name="PanelUC" />
        </Border>
    </Grid>
</Window>

示例C# ViewModel代码:

class YourViewModel : Conductor<Screen>.Collection.AllActive
{
    // Menu Side Bar
    private MenuUCViewModel _menuUC;
    public MenuUCViewModel MenuUC
    {
        get { return _menuUC; }
        set { _menuUC = value; NotifyOfPropertyChange(() => MenuUC); }
    }

    // Panel
    private Screen _panelUC;
    public Screen PanelUC
    {
        get { return _panelUC; }
        set { _panelUC = value; NotifyOfPropertyChange(() => PanelUC); }
    }

    // Constructor
    public YourViewModel()
    {
        MenuUC = new MenuUCViewModel();
        ActivateItem(MenuUC);

        PanelUC = new FirstPanelUCViewModel();
        ActivateItem(PanelUC);
    }

    // Some method that changes PanelUC (previously FirstPanelUCViewModel) to SecondPanelUCViewModel
    public void ChangePanels()
    {
        DeactivateItem(PanelUC);
        PanelUC = new SecondPanelUCViewModel();
        ActivateItem(PanelUC);
    }
}

在上面的例子中,ChangePanels() 作为一种将新的用户控件加载到您的 ContentControl 中的方法。
还可以阅读这个问题,它可能会进一步帮助您。

0
你应该看一下屏幕导体。请点击这里查看。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接