Как создать контент с возможностью вкладок в WPF / C #? - PullRequest
7 голосов
/ 03 марта 2012

У меня есть TabControl в моем приложении WPF. Я хочу, чтобы мое приложение в основном поддерживало несколько «экземпляров» в рамках одной программы. Например, подумайте о веб-браузерах, они позволяют вам иметь несколько экземпляров веб-сайтов на разных вкладках, я хочу добиться аналогичной функциональности, когда мое приложение содержит несколько экземпляров «суб-приложений».

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что мне приходится копировать и вставлять один и тот же XAML на каждую вкладку, поскольку каждая вкладка имеет одинаковую разметку и пользовательский интерфейс, но разные данные. Другая проблема заключается в том, что мне нужны функциональные возможности для динамического создания этих вкладок.

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

enter image description here

Итак, как мне создать систему с вкладками, в которой интерфейс вкладки остается одинаковым для каждой вкладки, и мне нужно разработать только один интерфейс XAML и продублировать его для каждой вкладки?

Требования:

  • Каждая вкладка имеет одинаковый интерфейс.
  • Каждая вкладка содержит разные данные для элементов пользовательского интерфейса.
  • Как разработчик, я хочу работать с XAML на вкладке только один раз и прямо в Visual Studio.

В идеале мне бы понравился простой простой пример проекта / кода, в котором есть один элемент управления вкладками без стиля, а приложение при запуске динамически создает 2-n вкладок, которые имеют одинаковый пользовательский интерфейс, но с разными данными.

Ответы [ 4 ]

3 голосов
/ 10 марта 2012

Как отмечено в другом ответе, вероятно, есть много способов сделать это, но вот мой простой способ:

Определите шаблон данных, который определяет содержимое каждой вашей идентичной вкладки.Элементы управления в шаблоне данных будут привязаны к модели представления текущей выбранной вкладки.В моем примере я поместил один TextBlock, но вы можете легко расширить его.

, используя этот Xaml:

<Page.DataContext>
    <Samples:TabBindingViewModels />
</Page.DataContext>

<Grid>
    <Grid.Resources>
        <DataTemplate x:Key="ContentTemplate" 
                      DataType="{x:Type Samples:TabBindingViewModel}">
            <TextBlock Text="{Binding Content}"/>
        </DataTemplate>
    </Grid.Resources>
    <TabControl ContentTemplate="{StaticResource ContentTemplate}"  
                DisplayMemberPath="Header" ItemsSource="{Binding Items}" />
</Grid>

и код этой модели представления:

public class TabBindingViewModels
{
    public TabBindingViewModels()
    {
        Items = new ObservableCollection<TabBindingViewModel>
                    {
                        new TabBindingViewModel(1),
                        new TabBindingViewModel(2),
                        new TabBindingViewModel(3),
                    };
    }

    public IEnumerable<TabBindingViewModel> Items { get; private set; }
}

public class TabBindingViewModel
{
    public TabBindingViewModel() : this(0)
    {
    }

    public TabBindingViewModel(int n)
    {
        Header = "I'm the header: " + n.ToString(CultureInfo.InvariantCulture);
        Content = "I'm the content: " + n.ToString(CultureInfo.InvariantCulture);
    }

    public string Header { get; set; }
    public string Content { get; set; }
}

мы получаем:

enter image description here

Мне очень нравится учебник по стилизации вкладки.Вы можете легко поместить более сложный контент в заголовки вкладок, а также в контент.

Вы должны изучить полный шаблон элемента управления вкладками, чтобы понять, как он работает.Используйте Blend или VS11 beta для извлечения шаблона.

Для того, чтобы динамически добавлять / удалять вкладки, теперь все, что вам нужно сделать, это добавить / удалить элементы в ObservableCollection моделей представления.

2 голосов
/ 03 марта 2012

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

Важно понимать, что TabControl является ItemsControl , что означает, что он может содержатьколлекция объектов, таких как UserControls, которые составляют каждый модуль.Таким образом, вы могли бы начать с привязки свойства Items к ObservableCollection {T} некоторых объектов UserControl, которые живут внутри некоторого проекта модуля, который реализует интерфейс, такой как IModule из Prism.Интерфейс определяет начальную точку любого модуля, который можно загрузить на вкладке.Когда запрашиваются модули, вы просто загружаете сборку и добавляете вкладку, которая содержит ссылку на регион, определенный в модуле.

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

1 голос
/ 05 марта 2012

Без дополнительной информации мой подход состоял бы в запуске поставщика MVVM внутри ApplicationDomain для каждого экземпляра или вкладки.Когда вы убьете / закроете вкладку, выгрузите домен приложения.

1 голос
/ 05 марта 2012

Взгляните на Caliburn.Micro для решения на основе MVVM.Точный вопрос, который вы задаете, решается в одном из примеров решений.

http://caliburnmicro.codeplex.com/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...