Вопрос

У меня возникают трудности при попытке получить очень простой сценарий, работающий с PRISM 2.0 для WPF.Я хочу, чтобы основной рабочей областью моего приложения был TabControl.Каждый раз, когда я добавляю представление, я хочу, чтобы оно отображалось в виде TabItem на TabControl.

Звучит просто, не так ли?

Мой регион, который находится в моей оболочке.XAML выглядит следующим образом:

<Controls:TabControl 
    Name="MainRegion" 
    cal:RegionManager.RegionName="{x:Static Infrastructure:RegionNames.TabRegion}"
    ItemContainerStyle="{StaticResource ShellTabItemStyle}" />

Стиль: ShellTabItemStyle выглядит примерно так:

<Style x:Key="ShellTabItemStyle" TargetType="{x:Type TabItem}">
    <Setter Property="Header" Value="{Binding Content.DataContext.HeaderInfo, RelativeSource={RelativeSource Self}}" />
</Style>

Это должно установить Header из числа TabItem к тому HeaderInfo собственность на DataContext из этого вида.(Я почерпнул эту идею из эта статья) Тот DataContext на мой взгляд, это очень простой Presenter который имеет HeaderInfo собственность на нем:

public string HeaderInfo = "The Header Text";

На мой взгляд, это простой пользовательский элемент управления WPF, который выглядит следующим образом:

  <StackPanel>
    <TextBox Text="Hello World" Name="MyTextBox"></TextBox>
    <Image Source="..SomeImage.PNG" Name="MyImage"></Image>
  </StackPanel>

Пока все идет так хорошо.Если я добавлю представление в регион, я получу элемент управления tab и получу вкладку с текстом, заданным как "Текст заголовка".Моя проблема в том, что на вкладке абсолютно не отображается контент.Мой взгляд содержит простой Image и еще TextBox, но ни один из них не появляется в TabItem.Если я выхожу из машины и оглядываюсь по сторонам, то никакого изображения в поле зрения нет.

Чего мне здесь не хватает - есть ли более простой способ?

Это было полезно?

Решение

Мне не удалось получить ни одного из предложенных ответов для работы. Обширный поиск в Google тоже не помог. В течение выходных я немного размышлял над этой проблемой, и чем больше я думал об этом, тем больше мне приходило в голову, что в этом подходе немного запаха кода . Вы внедряете представление в свой регион вкладок ... происходит что-то волшебное и добавляется вкладка ... вы должны добавить непонятное динамическое связывание к некоторому стилю XAML, хранящемуся где-то в файле, и это может или не может установить текст заголовка , Если какой-то один элемент этого будет немного ошибочным, вы не получите ошибку, но она просто не будет работать.

На мой взгляд, это и хрупко (то есть очень легко сломать) и довольно непроницаемо, если у вас нет глубокого понимания ПРИЗМЫ, модели и XAML. К счастью, есть гораздо более приятный и простой способ сделать это:

Просто создайте представление с именем TabRegionView , которое содержит только пустой TabControl. Вы, вероятно, хотите добавить это в свой Shell.xaml. Создайте событие с именем InjectTabView , которое имеет полезную нагрузку типа UserControl, и подпишитесь на это событие в вашем элементе управления TabRegionView . Когда событие запускается в TabRegionView , вы создаете TabItem вручную и добавляете представление к TabItem следующим образом:

public void TabAdded(UserControl view)
{
    var item = new TabItem();
    item.Content = view;
    item.IsSelected = true;
    item.Header = "Header Text";
    mainTab.Items.Add(item);
}

Когда вы хотите отобразить представление как новую вкладку, ваш код выглядит примерно так:

    var view = new View(params);
    _eventAggregator.GetEvent<InjectTabViewEvent>()
        .Publish(view);

Это будет получено TabRegionView , и представление будет добавлено в качестве новой вкладки. Вы можете легко обернуть View в жгуте некоторого типа, который содержит текст заголовка, изображение и bool, чтобы указать, нужно ли автоматически выбирать вкладку.

ИМХО, у этой техники есть двойные преимущества: она дает вам прямой контроль над тем, что происходит, и за ней гораздо легче следовать.

Мне было бы очень интересно узнать мнение по этому поводу у любого PRISM officianados.

Другие советы

Если вы используете RegionManager, вам необходимо активировать вид. Вероятно, есть некоторый фрагмент кода, в котором вы добавляете представление в регион, вам просто нужно сообщить этому региону, чтобы активировать его.

public void AddViewToRegion(IRegion region, object view)
{
     region.Add(view);
     region.Activate(view);
}

Это кажется глупым, но вы получаете поведение, которое видите, если не делаете этого. Я нашел это немного разочаровывающим, но это было достаточно легко исправить. Поведение становится еще более странным, когда вы добавляете несколько вкладок, если вы по крайней мере не активируете первое добавленное представление.

Насколько я понимаю, если вы этого не сделаете, представление никогда не станет частью визуального дерева (это побочный эффект того факта, что TabControl деактивирует (удаляет из визуального дерева), когда вкладка не ' t "впереди". Это хорошо для определенных операций, но делает такие вещи немного странными.

Несколько случайных мыслей:

  • попробуйте удалить стиль из TabControl
  • проверьте визуальное дерево с помощью Вынюхивать инструмент.Вы должны увидеть свой TabItem с UserControl view в разделе TabControl.Далее вы можете проверить, что не так с этим UserControl и его дочерними элементами (содержимым вашего представления).Вероятно, они по какой-то причине скрыты.
  • еще одна вещь, над которой стоит подумать - RegionAdapter.Региональные адаптеры отвечают за адаптацию представлений регионов для размещения UIControl.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top