Добавить несколько элементов в область призмы - PullRequest
3 голосов
/ 29 августа 2011

Я использую Prism с лентой Microsoft WPF, и все работает довольно хорошо, но у меня проблема с контекстными вкладками. Я определяю контекстные вкладки в моем Shell.xaml:

<Ribbon:Ribbon.ContextualTabGroups>
    <Ribbon:RibbonContextualTabGroup Header="CTG1" Visibility="Visible" Background="Red" />
    <Ribbon:RibbonContextualTabGroup Header="CTG2" Visibility="Visible" Background="Blue" />
    <Ribbon:RibbonContextualTabGroup Header="CTG3" Visibility="Visible" Background="Purple" />
    <Ribbon:RibbonContextualTabGroup Header="CTG4" Visibility="Visible" Background="Green" />
    <Ribbon:RibbonContextualTabGroup Header="CTG5" Visibility="Visible" Background="Orange" />
    <Ribbon:RibbonContextualTabGroup Header="CTG6" Visibility="Visible" Background="Violet" />
</Ribbon:Ribbon.ContextualTabGroups>

Таким образом, в моих модулях я могу ссылаться на эти контекстные группы вкладок, и это прекрасно работает. Но я хотел бы определить контекстные группы в модулях. Я думал об определении региона:

<Ribbon:Ribbon.ContextualTabGroups x:Name="RibbonContextualTabs" prism:RegionManager.RegionName="RibbonContextualTabs" />

И тогда в моем модуле у меня будет UserControl, который унаследует RibbonContextualTabGroup для каждого и зарегистрирует их в регионе ... Есть ли способ просто определить usercontrol с некоторыми ContextualTabGroups и добавить их в целом? Например:

<Ribbon:RibbonContextualTabContainer x:Class="Views.ContextualTabsView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:Ribbon="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary">
    <Ribbon:RibbonContextualTabGroup Header="CTG1" Visibility="Visible" Background="Red" />
    <Ribbon:RibbonContextualTabGroup Header="CTG2" Visibility="Visible" Background="Blue" />
    <Ribbon:RibbonContextualTabGroup Header="CTG3" Visibility="Visible" Background="Purple" />
</Ribbon:RibbonContextualTabContainer>

как ContextualTabsView.xaml и в моем модуле сделать

_regionManager.RegisterViewWithRegion("RibbonContextualTabs", typeof (ContextualTabsView));

Не знаю, дал ли я понять, чего пытаюсь добиться, но я был бы признателен за любую помощь.

Спасибо.

1 Ответ

2 голосов
/ 31 августа 2011

Некоторое время назад я столкнулся с той же проблемой (но я использовал панель ленты Teleriks).Я не мог найти способ добавить вкладки из модулей или менее из XAML.

То, что я сделал, было такой услугой:

public class RibbonService
{
    public PrioritySet<RibbonTab> Tabs { get; private set; }
    public PrioritySet<object> QuickAccess { get; private set; }
    public PrioritySet<ContextualGroup> ContextualGroup { get; private set; }
}

это предложение имеет следующую структуру:

diagram for the clases above

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

Теперь, еслиподобный сервис зарегистрирован на вашей платформе, затем из модулей вы можете добавить вкладки.Помните, что вашему проекту оболочки необходимо получить RibbonService, а затем привязать коллекцию элементов к свойству Tabs - обратите внимание, что PrioritySet реализует INotifyCollectionChanged, поэтому, если лента привязана, ее элементы будут обновляться автоматически.

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

_ribbonService.Tabs.Add(new RibbonButton(){Header = "Button", Icon = new Uri("icon.png")})

В моем приложении у меня есть вкладки> Группы> Кнопки, поэтому каждый модуль имеет полный контроль над лентой,Также обратите внимание, что из модулей вы можете добавить все элементы, которые вам нужны, но модуль не может удалить элемент с ленты, если у него есть ссылка на него или тот, который его создал.

...