【问题标题】:How do I load controls in different ContentControls of a Shell using CaliburnMicro如何使用 CaliburnMicro 在 Shell 的不同 ContentControls 中加载控件
【发布时间】:2011-05-31 09:38:47
【问题描述】:

默认情况下,当您使用“ActivateItem(new Control());”时例如,您的控件被加载到名为 ActiveItem 的 ContentControl 中。 .如果我的页面上有多个内容控件,我将如何将控件加载到它们中,同时保留使用能够将控件加载到活动项目控件的默认功能的能力。

例如,我希望将登录控件加载到 Login ContentControl 中,当用户成功登录时,我希望将新控件加载到 ActiveItem ContentControl 中。

提前感谢。

【问题讨论】:

    标签: c# wpf xaml caliburn.micro contentcontrol


    【解决方案1】:

    如果绑定到 UI 的 ViewModel 包含名称与内容控件匹配的属性。内容控件视图会自动解析该属性支持的视图,前提是该属性本身是 ViewModel 类型并已在 Ioc 容器中注册。例如

    <ContentControl x:Name="LoginStatus"></ContentControl>
    

    如果主 ViewModel 上有一个属性 LoginStatus(LoginStatus 属性本身就是一个 ViewModel)。内容控件将使用适当的视图正确呈现。

    【讨论】:

      【解决方案2】:

      这是一个老问题,但如果有人遇到同样的问题,这是我的解决方案:

      1. 包含两个(甚至两个以上)用户控件的主窗口必须继承自 Caliburn.Micro.Conductor&lt;Screen&gt;.Collection.AllActive
      2. 您的用户控件必须继承自 Caliburn.Micro.Screen
      3. 您还必须牢记命名约定。如果您在 View 中使用 MenuUC 作为 ContentControl 的名称,还要在 ViewModel 中创建一个名为 MenuUC 的属性;
      4. 像我在 Constructor 中一样初始化您的 UserControl;
      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 中的方法。

      另请阅读this question,它可能会对您有所帮助。

      【讨论】:

        【解决方案3】:

        您应该看看屏幕导体。见here

        【讨论】:

          猜你喜欢
          • 2015-05-19
          • 2015-04-03
          • 2020-12-19
          • 2010-09-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-05
          • 2015-10-29
          相关资源
          最近更新 更多