Создание ленты Контекстуальные таблицы показывают, когда лента сведена к минимуму

103
8

Ниже приведен сценарий:

Когда лента не минимизирована, показ вкладки, связанной с RibbonContextualTabGroup отлично работает, как показано на следующем RibbonContextualTabGroup экрана.

Normal Ribbon

Когда лента сведена к минимуму, показ вкладки, связанной с RibbonContextualTabGroup показывает вкладки, но не заголовок контекстной вкладки, как видно на следующем снимке экрана.

Minimized Ribbon

Если лента сведена к минимуму, но всплывающее окно открыто, показывая вкладку, связанную с RibbonContextualTabGroup отлично работает, как видно на следующем RibbonContextualTabGroup экрана. (Всплывающее окно не видно, но так я создал сценарий.)

Minimized Ribbon w/Open Popup

У WebMatrix также есть эта проблема, поэтому я предполагаю, что разработчики Microsoft намеренно закодированы в этой функции. Однако в Windows 8/Office 2013 контекстные группы вкладок всегда отображаются независимо от состояния ленты.

Я использую.NET RibbonControlsLibrary от Microsoft, поэтому у меня есть доступ ко всему исходному коду. Как я могу изменить код, чтобы постоянно показывать группы контекстных вкладок независимо от состояния ленты?

спросил(а) 2021-01-14T01:56:39+03:00 1 неделя назад
1
Решение
61

Да, очень хорошо, большое спасибо, Минг!

Есть ли способ использовать RibbonContextualTabGroupItemsControl.cs без копирования и переопределения всех относящихся к ленте-классов-источников?

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

Существует триггер, который обрабатывает свойство IsMinimized ленты:

<Trigger Property="IsMinimized" Value="True">
<Setter Property="Content" TargetName="mainItemsPresenterHost" Value="{x:Null}"/>
<Setter Property="Visibility" TargetName="mainItemsPresenterHost" Value="Collapsed"/>
<Setter Property="Content" TargetName="popupItemsPresenterHost" Value="{Binding ElementName=groupsBorder}"/>
<Setter Property="BorderThickness" TargetName="BackgroundBorder" Value="0,0,0,1"/>
</Trigger>

Содержимое mainItemsPresenterHost-control - это граница с именем "groupsBorder", которая содержит все вкладки ленты. Когда свойство IsMinimized изменяется на true, эта граница перемещается во всплывающее приглашение с именем "popupItemsPresenterHost".

Другой триггер обрабатывает свойство IsDropDownOpen:

<Trigger Property="IsDropDownOpen" Value="True">
<Setter Property="BorderThickness" TargetName="BackgroundBorder" Value="0"/>
/Trigger>

Я изменил оба триггера следующим образом:

<Trigger Property="IsMinimized" Value="True">
<!--<Setter Property="Content" TargetName="mainItemsPresenterHost" Value="{x:Null}"/>-->
<!--<Setter Property="Visibility" TargetName="mainItemsPresenterHost" Value="Collapsed"/>-->
<Setter Property="Height" TargetName="mainItemsPresenterHost" Value="0"/>
<!--<Setter Property="Content" TargetName="popupItemsPresenterHost" Value="{Binding ElementName=groupsBorder}"/>-->
<Setter Property="BorderThickness" TargetName="BackgroundBorder" Value="0,0,0,1"/>
</Trigger>

<Trigger Property="IsDropDownOpen" Value="True">
<Setter Property="BorderThickness" TargetName="BackgroundBorder" Value="0,0,0,1"/>
<Setter Property="Content" TargetName="mainItemsPresenterHost" Value="{x:Null}"/>
<Setter Property="Content" TargetName="popupItemsPresenterHost" Value="{Binding ElementName=groupsBorder}"/>
</Trigger>

Обратите внимание, что я заменил установщик свойства видимости элемента mainItemsPresenterHost-control с помощью свойства Height и установил его в '0'.

ответил(а) 2021-01-14T01:56:39+03:00 1 неделя назад
61

У меня такая же проблема, и я нашел это обходное решение.

Переопределите метод OnApplyTemplate в окне, которому принадлежит лента, чтобы получить RibbonContextualTabGroupItemsControl и установить внутреннее поле:

Установите для свойства IsMinimized - значение true, прежде чем устанавливать видимость для контекстной группы на видимую, затем вызовите UpdateLayout из RibbonContextualTabGroupItemsControl и сбросьте свойство IsMinimized-Property ленты на false:

Код

...
RibbonContextualTabGroupItemsControl _ribbonContextualTabGroupItemsControl;
...

public override void OnApplyTemplate()
{
base.OnApplyTemplate();
Ribbon ribbon = this.ribbon;
ribbon.ApplyTemplate();
this._ribbonContextualTabGroupItemsControl = ribbon.Template.FindName("PART_ContextualTabGroupItemsControl", ribbon) as RibbonContextualTabGroupItemsControl;
}

...

void toggleRibbonContextualGroupVisibility()
{
if(this.ribbonContextualGroup.Visibility == Visibility.Collapsed)
{
if (this.ribbon.IsMinimized)
{
this.ribbon.IsMinimized = false;
this.ribbonContextualGroup.Visibility = Visibility.Visible;
this._ribbonContextualTabGroupItemsControl.UpdateLayout();
this.ribbon.IsMinimized = true;
}
else
{
this.ribbonContextualGroup.Visibility = Visibility.Visible;
}
}
else
{
this.ribbonContextualGroup.Visibility = Visibility.Collapsed;
}
}

...

Я также попытался переопределить класс RibbonContextualTabGroupItemsControl и ленточный стиль без успеха.
Если есть какие-то другие решения, я действительно заинтересован.

ответил(а) 2021-01-14T01:56:39+03:00 1 неделя назад
60

После игры с исходными файлами для RibbonControlsLibrary и просто делая пробную пробную версию hardcore, я нашел следующее решение:

Откройте RibbonContextualTabGroupItemsControl.cs, расположенную в Microsoft/Windows/Controls/Ribbon, разверните Private Methods #region и найдите функцию HasTabs. Код должен выглядеть примерно так:

private bool HasTabs(FrameworkElement container)
{
RibbonContextualTabGroup tabGroupHeader = container as RibbonContextualTabGroup;
if (tabGroupHeader == null ||
!tabGroupHeader.IsVisible)
{
return false;
}

foreach (RibbonTab tab in tabGroupHeader.Tabs)
{
if (tab != null && tab.IsVisible)
{
return true;
}
}
return false;
}

Все, что я добавил, это следующие две строки кода:

if (Ribbon.IsMinimized)
return true;

Теперь функция должна выглядеть так:

private bool HasTabs(FrameworkElement container)
{
RibbonContextualTabGroup tabGroupHeader = container as RibbonContextualTabGroup;
if (tabGroupHeader == null ||
!tabGroupHeader.IsVisible)
{
return false;
}

if (Ribbon.IsMinimized)
return true;

foreach (RibbonTab tab in tabGroupHeader.Tabs)
{
if (tab != null && tab.IsVisible)
{
return true;
}
}
return false;
}

Запустите приложение, и воины теперь отображают контекстные группы вкладок, даже если лента сведена к минимуму.

Обратите внимание, что если у вас нет доступа к исходному коду ленты, то использование zznobody-решения по-прежнему будет работать на пинче.

ответил(а) 2021-01-14T01:56:39+03:00 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема