これは古い質問ですが、誰かが同じ問題を抱えている場合に備えて、最初からより徹底的に処理する方法をここに投稿します。
- 両方(または3つ以上)のユーザーコントロールを含むメインウィンドウは、
Caliburn.Micro.Conductor<Screen>.Collection.AllActive
;から継承する必要があります。
- ユーザーコントロールは
Caliburn.Micro.Screen
;から継承する必要があります。
- また、命名規則にも留意する必要があります。ビューでContentControlの名前としてMenuUCを使用する場合は、ViewModelでMenuUCという名前のプロパティも作成します。
- コンストラクターで行うように、UserControlを初期化します。
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にロードするメソッドとして機能します。
また、この質問を読んでください、それはさらにあなたを助けるかもしれません。