Кнопка WPF в ContextMenu нуждается в StaysOpenOnClick
Я использую ContextMenu с кнопками в нем. Всякий раз, когда нажимается специальная кнопка, я хочу, чтобы ContextMenu был закрыт. Я видел возможность для MenuItem, который называется "StaysOpenOnClick".. это работает отлично.
Это то, что мне нужно для кнопки. Особенно было бы неплохо иметь решение только на XAML, если кто-то может помочь!
Заранее спасибо.
2 ответа
Вы можете закрыть ContextMenu, анимировав его свойство IsOpen, используя BooleanAnimationUsingKeyFrames. Это решение только для XAML:
<Grid Background="Yellow" Width="50" Height="50">
<Grid.Resources>
<Storyboard x:Key="sb">
<BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen">
<DiscreteBooleanKeyFrame KeyTime="0" Value="False" />
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</Grid.Resources>
<Grid.ContextMenu>
<ContextMenu x:Name="contextMenu">
<MenuItem>
<MenuItem.Header>
<Button Content="TheButton" Click="OnButtonClick" />
</MenuItem.Header>
</MenuItem>
<ContextMenu.Triggers>
<EventTrigger RoutedEvent="ButtonBase.Click">
<BeginStoryboard Storyboard="{StaticResource sb}" />
</EventTrigger>
</ContextMenu.Triggers>
</ContextMenu>
</Grid.ContextMenu>
</Grid>
Это решение работает, но ContextMenu теперь закрывается для всех кнопок в моем ContextMenu. Я просто хотел, чтобы он был закрыт только одной кнопкой под названием "Настройки".
В этом случае вы можете установить для свойства SourceName EventTrigger значение x:Name кнопки "Настройки":
<Grid Background="Yellow" Width="50" Height="50">
<Grid.Resources>
<Storyboard x:Key="sb">
<BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen">
<DiscreteBooleanKeyFrame KeyTime="0" Value="False" />
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</Grid.Resources>
<Grid.ContextMenu>
<ContextMenu x:Name="contextMenu">
<MenuItem>
<MenuItem.Header>
<Button Content="Settings" x:Name="settingsButton" />
</MenuItem.Header>
</MenuItem>
<MenuItem>
<MenuItem.Header>
<Button Content="About" />
</MenuItem.Header>
</MenuItem>
<ContextMenu.Triggers>
<EventTrigger RoutedEvent="ButtonBase.Click" SourceName="settingsButton">
<BeginStoryboard Storyboard="{StaticResource sb}" />
</EventTrigger>
</ContextMenu.Triggers>
</ContextMenu>
</Grid.ContextMenu>
</Grid>
Я не совсем уверен, что вы ищете, но вот контекстное меню с кнопкой:
<TextBlock
Text="Hello, world!">
<TextBlock.ContextMenu>
<ContextMenu x:Name="contextMenu">
<MenuItem>
<MenuItem.Header>
<Button Content="MyButton" Click="OnMenuButtonClick" />
</MenuItem.Header>
</MenuItem>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
Если вы обработаете нажатие кнопки следующим образом, оно закроет контекстное меню:
private void OnMenuButtonClick(object sender, RoutedEventArgs e)
{
contextMenu.IsOpen = false;
}
(Однако решение не только для XAML.)