Триггеры стиля WPF: использование контекстного меню в сетке переменной ширины - PullRequest
1 голос
/ 24 марта 2020

Мое приложение имеет боковую панель. Эта боковая панель обычно сворачивается (ширина 20 пикселей), но когда я наводю курсор мыши на боковую панель, она расширяется (600 пикселей). Это устанавливается в WPF с помощью свойства «IsMouseOver» в сетке

<Grid VerticalAlignment="Stretch" HorizontalAlignment="Left" Margin="5 30" Name="GridCollapsible">
 <Grid.Style>
  <Style TargetType="{x:Type Grid}">
   <Style.Triggers>
    <Trigger Property="IsMouseOver" Value="True">
     <Setter Property="Width" Value="600"/>
    </Trigger>
    <Trigger Property="IsMouseOver" Value="False">
     <Setter Property="Width" Value="20"/>
    </Trigger>
   </Style.Triggers>
  </Style>
 </Grid.Style> 
 ...

Одним из элементов, который является дочерним элементом этой сетки, является ListView. Это ListView имеет ContextMenu

<ListView Name="TodayCalendarListBox" Margin="0 10 0 0" FontSize="16" HorizontalContentAlignment="Stretch" DockPanel.Dock="Top">
 <ListView.ContextMenu>
  <ContextMenu>
   <MenuItem Header="Completed" Click="CompletedMenuItem_Click"/>
   <MenuItem Header="Missed" Click="MissedMenuItem_Click"/>
  </ContextMenu>
 </ListView.ContextMenu>
...

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

У меня есть в настоящее время пытались подписаться на события ContextMenuOpening и ContextMenuClosing в DockPanel, который является родительским контейнером для ListView

<DockPanel Margin="8" ContextMenuOpening="ContextMenu_ContextMenuOpening" ContextMenuClosing="ContextMenu_ContextMenuClosing">
        private void ContextMenu_ContextMenuOpening(object sender, ContextMenuEventArgs e)
        {
            GridCollapsible.Width = 600;
        }

        private void ContextMenu_ContextMenuClosing(object sender, ContextMenuEventArgs e)
        {
            GridCollapsible.Width = 20;
        }

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

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

Есть ли более аккуратное и элегантное решение для этого?

Изображение ситуации (без наведения мыши -> для наведения мыши и контекстного меню) для наглядности.

enter image description here

1 Ответ

1 голос
/ 24 марта 2020

Вместо того, чтобы устанавливать для свойства локальное значение, вызовите GridCollapsible.SetValue(Grid.WidthProperty, 600.0) в ContextMenu_ContextMenuOpening, а затем очистите значение, вызвав GridCollapsible.ClearValue(Grid.WidthProperty) в ContextMenu_ContextMenuClosing.

...