Почему ItemsControl показывает представление, а ContentControl ничего не показывает?
У меня есть приложение на основе Prism.
Это моя оболочка:
<Window x:Class="AvarioCRM3.ShellV2"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cal="http://www.codeplex.com/CompositeWPF" >
<DockPanel LastChildFill="True">
<Border
Padding="10"
DockPanel.Dock="Top"
Background="#ddd">
<DockPanel>
<ItemsControl
Name="MainNavigationPanel"
cal:RegionManager.RegionName="MainNavigationPanel"
DockPanel.Dock="Top"/>
</DockPanel>
</Border>
</DockPanel>
</Window>
В моем MenuModule я добавляю вид на регион, и он показывает нормально:
public void Initialize()
{
MainNavigationPresenter mainNavigationPresenter = this.container.Resolve<MainNavigationPresenter>();
IRegion mainRegion = this.regionManager.Regions["MainNavigationPanel"];
mainRegion.Add(new TestView());
}
Проблема в том, что я не хочу ItemsControl в моей оболочке, я хочу ContentControl, но когда я использую ContentControl, он ничего не показывает.
Почему ItemsControl показывает мои представления, а ContentControl ничего не показывает?
3 ответа
В отличие от ItemsControl с ContentControl, вам также необходимо активировать представление, как только вы добавили его, чтобы сделать его видимым.
MainNavigationPresenter mainNavigationPresenter = this.container.Resolve<MainNavigationPresenter>();
IRegion mainRegion = this.regionManager.Regions["MainNavigationPanel"];
TestView view = new TestView()
mainRegion.Add(view);
mainRegion.Activate(view);
Может ли это быть потому, что ContentControl будет отображать только один дочерний элемент, тогда как ItemsControl имеет несколько дочерних элементов?
Я не работал с Prism, но API предполагает, что у IRegion должно быть несколько детей. Если вы используете ContentControl, то, когда я делаю следующее, немного двусмысленно:
IRegion mainRegion = this.regionManager.Regions["MainNavigationPanel"];
mainRegion.Add(new TestView());
mainRegion.Add(new SecondTestView());
Я заметил, что вы делаете это в Initialize. Может быть слишком рано? Вы пытались использовать регистрацию, а не инъекцию своего взгляда, чтобы увидеть, изменилось ли это что-нибудь?
regionManager.RegisterViewWithRegion("MainNavigationPanel", typeof(TestView));
Это не решит вашу проблему, однако докажет, что проблема пытается что-то добавить до того, как ваш регион будет фактически доступен. RegisterViewWithRegion будет задерживать создание и отображение представления, пока регион не станет доступным.