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 就会根据您的视图调整大小(或者您可以将所有视图设计为相同大小)。
我有一个问题,但在统计中我会向您描述我要问的问题。
我正在使用 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 就会根据您的视图调整大小(或者您可以将所有视图设计为相同大小)。