带切换按钮的菜单

Menu with ToggleButtons

我想创建 window,当左侧面板中是菜单(带有切换按钮)并且右侧面板中是视图时。当我点击切换按钮时,可见视图和另一个视图将被隐藏。但是我的代码不顾自己打开视图。 这是我的代码:

<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;
        }
    }

我想,在循环中将 IsChecked 设置为 false 会导致此问题,因为如果您定义了任何 UnChecked 并在那里设置了“_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;
                }
            }
        }
    }

这是我的解决方案:

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

我设计了一个自定义 window chrome、弹出菜单和切换按钮。当切换按钮 IsCheced 属性 设置为 true 时,弹出菜单会以漂亮的动画打开,当切换按钮关闭时,弹出菜单会关闭。

  1. 显示状态 flyout menu is open

  2. 隐藏状态 flyout menu is closed