Caliburn.Micro,来自 UserControl 的多个 ActiveItem 和 Conductor.OneActive

Caliburn.Micro, multiple ActiveItem from UserControl and Conductor.OneActive

我有一个问题,但在统计中我会向您描述我要问的问题。

我正在使用 Caliburn.Micro 框架制作应用程序。我想做的是制作多个 ActiveItem(如 UserControl)但同时显示一个。类似于:

<ContentControl x:Name="ActiveItem_1"/>

<ContentControl x:Name="ActiveItem_2"/>

<ContentControl x:Name="ActiveItem_3"/>

<ContentControl x:Name="ActiveItem_4"/>

我选择UserControl显示Buttons

所以我只想同时打开一个UserControl(我打开一个的时候,第二个不允许打开)。

我的 ViewModel.cs 看起来像这样:

using Caliburn.Micro;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TaskManager.ViewModels
{
    class MainWindowViewModel : Conductor<IScreen>.Collection.OneActive
    {
        public void LoadLoginPage()
        {
            ActivateItem(new LoginViewModel());
        }

        public void LoadTasksPage()
        {
            //And here i have no idea what to do, 
            //how to make another UserControl to be ActiveItem
        }
    }
}

那么,如何将这对用户控件命名或编码为 OneActive?我可以使用一个 UserControl 并更改它的大小和边距,但我认为它会比更改 UserControls

更复杂

感谢指教!

如果我理解正确的话,您希望拥有 4 个内容控件,但同时只有一个包含视图。 IE。您按下按钮 1,内容控件 1 有一个视图,但是当您单击另一个按钮时,内容控件 1 消失,新按钮的内容控件被填充?

您不能使用 ActivateItem,因为 ActivateItem 要求您有一个名为 ActiveItem 的内容控件。

你需要做这样的事情:

Button1ViewModel ActiveItem_1 = null;
Button2ViewModel ActiveItem_2 = null;
Button3ViewModel ActiveItem_3 = null;
Button4ViewModel ActiveItem_4 = null;

public void Button1()
{
    if (ActiveItem_1 == null)
        ActiveItem_1 = new Button1ViewModel();

    if (ActiveItem_2 != null)
    {
        ActiveItem_2.TryClose();
        ActiveItem_2 = null;
    }

    if (ActiveItem_3 != null)
    {
        ActiveItem_3.TryClose();
        ActiveItem_3 = null;
    }

    if (ActiveItem_4 != null)
    {
        ActiveItem_4.TryClose()
        ActiveItem4 = null;
    }
}

对其他按钮执行类似操作,打开每个按钮的正确视图模型并关闭其他按钮。

真的,您应该使用 OneActive 并且只有一个名为 ActiveItem 的内容控件,并在您每次单击其中一个按钮时填充它。只要您没有设置明确的大小,contentcontrol 就会根据您的视图调整大小(或者您可以将所有视图设计为相同大小)。