2017-01-02 14 views
0

Я хотел бы создать окно, когда в левой панели находится меню (с кнопками переключения), а на правой панели - виды. Когда я нажимаю кнопку переключения, видимый вид и другие виды будут скрыты. Но мой код действительно открывает представление, несмотря на то, что он сам. Это мой код:Меню с ToggleButtons

<StackPanel Grid.Column="0"> 
    <ToggleButton Name="Button1" Checked="MenuItem_Checked"> 
    <ToggleButton Name="Button2" Checked="MenuItem_Checked"> 
</StackPanel> 
<administration:View1 Grid.Column="1" 
           Visibility="{Binding ElementName=Button1, Path=IsChecked, UpdateSourceTrigger=PropertyChanged, 
           Converter={StaticResource BooleanToVisibilityConverter}}"/> 
<administration:View2 Grid.Column="1" 
           Visibility="{Binding ElementName=Button2, Path=IsChecked, UpdateSourceTrigger=PropertyChanged, 
           Converter={StaticResource BooleanToVisibilityConverter}}"/> 

Код За:

private void MenuItem_Checked(object sender, RoutedEventArgs e) 
    { 
     var el = sender as ToggleButton; 
     if (Equals(_current, el)) 
      return; 
     _current = el; 
     foreach (var menuChild in Menu.Children) 
     { 
      ToggleButton button = menuChild as ToggleButton; 
      if (button == null) continue; 
      if (!Equals(button, _current)) 
       button.IsChecked = false; 
     } 
    } 

ответ

1

Th это мое решение:

<View1.Resources> 
    <Style TargetType="View1"> 
       <Setter Property="Visibility" Value="Hidden"/> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding ElementName=Button1, Path=IsChecked, UpdateSourceTrigger=PropertyChanged}" Value="True"> 
         <Setter Property="Visibility" Value="Visible"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
</View1.Resources> 
2

я предполагаю, установка IsChecked как ложное в цикле вызывает эту проблему, потому что если у вас есть какие непроверенные определены и установить «_current» там, во время второй итерации _current может держать непроверенную ToggleButton, поставить точку останова и проверить для себя, вы можете избежать этого, в том числе флаг, как показано ниже,

bool internalChange = false; 
    private void MenuItem_Checked(object sender, RoutedEventArgs e) 
    { 
     if (!internalChange) 
     { 
      var el = sender as ToggleButton; 
      if (Equals(_current, el)) 
       return; 
      _current = el; 
      foreach (var menuChild in Menu.Children) 
      { 
       ToggleButton button = menuChild as ToggleButton; 
       if (button == null) 
        continue; 
       if (!Equals(button, _current)) 
       { 
        internalChange = true; 
        button.IsChecked = false; 
        internalChange = false; 
       } 
      } 
     } 
    } 
1

Я разработал пользовательское окно хром, выпадающее меню и кнопку переключения. при переключении кнопки IsCheced свойство установлено в true, всплывающее меню открыто с приятной анимацией и при выключенном вылете закрыто.

  1. Показать Государственный flyout menu is open

  2. Скрыть государственный flyout menu is closed