【问题标题】:Caliburn.Micro, multiple ActiveItem from UserControl and Conductor.OneActiveCaliburn.Micro,来自 UserControl 和 Conductor.OneActive 的多个 ActiveItem
【发布时间】:2018-07-26 19:22:53
【问题描述】:

我有一个问题,但在统计中我会描述你我在问什么。

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

<ContentControl x:Name="ActiveItem_1"/>

<ContentControl x:Name="ActiveItem_2"/>

<ContentControl x:Name="ActiveItem_3"/>

<ContentControl x:Name="ActiveItem_4"/>

我选择通过Buttons显示哪个UserControl

所以我只想同时打开一个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 更复杂

感谢您的建议!

【问题讨论】:

    标签: c# wpf mvvm caliburn.micro


    【解决方案1】:

    如果我理解正确的话,您希望拥有 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 就会根据您的视图调整大小(或者您可以将所有视图设计为相同大小)。

    【讨论】:

    • 有道理。我会在几天后(夏季时间)检查它,如果它有效,我会给你一个反馈。如果它不起作用,我将一次在一个用户控件上工作。它会更优雅(几个 UserControls 对我来说看起来更容易,我们不需要更改一个用户控件的大小或位置)
    猜你喜欢
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 2016-07-02
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多