2016-12-12 4 views
1

Я использую ContextMenu с кнопками в нем. Всякий раз, когда нажимается специальная кнопка, я хочу, чтобы ContextMenu был закрыт. Я видел возможность для MenuItem, который называется «StaysOpenOnClick» .. это работает отлично.WPF Button в ContextMenu требуется StaysOpenOnClick

Это то, что мне нужно для кнопки. Особенно XAML-решение было бы неплохо иметь, если кто-нибудь может помочь!

Заранее спасибо.

+0

Что делает ваш XAML взгляд, как сейчас? –

ответ

0

Вы можете закрыть 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 к й: Название «Настройка» Кнопка:

<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> 
+0

. Думаю, вам не нужно событие Click для кнопки. В любом случае это решение работает, но ContextMenu теперь закрывается для всех кнопок в моем ContextMenu. Я просто хотел, чтобы его закрыли только одной кнопкой «Настройки». – user1818797

+0

См. Мой отредактированный ответ. Пожалуйста, не забудьте принять и проголосовать, если это вам поможет :) – mm8

+0

Это работает для меня .. большое спасибо! :) – user1818797

0

Я не совсем уверен, что вы после этого, но здесь есть контекстное меню с помощью кнопки:

<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-единственное решение, хотя.)

+0

, если вы меняете кнопку на кнопку переключения, вы должны иметь возможность привязываться к свойству IsOpen, удаляя код позади – MikeT