Добавление новых элементов в ленту WPF через код - PullRequest
4 голосов
/ 10 апреля 2009

Я использую ленту Office WPF, и у меня есть представление содержимого, которое я хотел бы добавить новые элементы на ленту, когда это представление станет активным. У меня есть код, который добавляет новую RibbonCommand, а также новую RibbonButton в группу, которую я хочу, но ничего не происходит, когда я добавляю ее. Однако, если я добавлю новую группу с помощью кнопки, она будет работать нормально и будет привязана правильно. Есть ли какой-нибудь способ заставить его обновить, что мне не хватает? Я пробовал UpdateLayout (), и он тоже не работает. Я действительно хотел бы попытаться избежать перестройки всех групп каждый раз, когда меняется представление.

Работает:

public void InjectItems(IView view)
{
var ribbonCommands = ProcessRibbonCommands(view.GetViewModel().Tasks, view.GetType());
var group = new RibbonGroup();
group.Command = new RibbonCommand() { LabelTitle = "Group Test" };            

foreach (RibbonCommand command in ribbonCommands)
{
    shell.MainRibbon.Resources.Add(command.Name, command);
    group.Controls.Add(new RibbonButton { Command = command });
}

shell.MainRibbon.SelectedTab.Groups.Add(group);
}

Не работает:

public void InjectItems(IView view)
{
var ribbonCommands = ProcessRibbonCommands(view.GetViewModel().Tasks, view.GetType());
var group = shell.MainRibbon.SelectedTab.Groups[0]; //I have a default group, will fix later

foreach (RibbonCommand command in ribbonCommands)
{
    shell.MainRibbon.Resources.Add(command.Name, command);
    group.Controls.Add(new RibbonButton { Command = command });
}
}

Ответы [ 2 ]

9 голосов
/ 25 сентября 2009

Я предполагаю, что вы используете Microsoft Ribbon CTP с сайта OfficeUI.

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

из документа:

Элементы управления, отображаемые в группе, НЕ ДОЛЖНЫ изменяться в результате выбора. Если элемент управления не активен, управление ДОЛЖНО быть серым, а не удаленным из группы. Это обеспечивает более предсказуемое опыт и предотвращает изменение и отвлечение пользователей от расположения элементов управления на ленте.

это, как говорится, звучит так, как будто контекстная вкладка - именно то, что вы ищете. Их можно отключить и включить, но фактическое содержимое вкладки не изменится.

Это код для создания контекстной вкладки в XAML:

<!--Context Groups-->
        <r:Ribbon.ContextualTabGroups>
            <!--Piece Contextual Group-->
            <r:RibbonContextualTabGroup x:Name="grpPieceContext" Label="Piece Tools">
                <r:RibbonTab Label="Piece Information" Name="tabPieceContextInfo">
                    <r:RibbonGroup Name="grpPieceDetails" Command="{StaticResource PieceInformationGrpCommand}">
                        <r:RibbonLabel x:Name="lblPieceTag"/>
                        <r:RibbonTextBox Name="txtPieceDescription" Command="{StaticResource PieceNameTextboxCommand}" 
                                         TextChanged="txtPieceDescription_TextChanged" MaxLength="32"/>
                        <r:RibbonLabel x:Name="lblPieceLocation"/>
                    </r:RibbonGroup>
                </r:RibbonTab>
            </r:RibbonContextualTabGroup>
        </r:Ribbon.ContextualTabGroups>

Вы можете активировать и деактивировать вкладку с помощью этого кода:

        if (!this.grpPieceContext.IsActive)
        {
            this.grpPieceContext.IsActive = true;
            this.grpPieceContext.Color = Colors.Orange;
        }

где оранжевый - это цвет позади контекстной группы.

Надеюсь, это поможет

1 голос
/ 07 октября 2009

В итоге я просто удалил и заново создал группу и всю вкладку, если это необходимо.

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