Wpf 带有切换按钮的菜单

Wpf 带有切换按钮的菜单,wpf,togglebutton,Wpf,Togglebutton,我想创建窗口时,在左面板是菜单(与切换按钮),在右面板是视图。当我点击切换按钮时,视图和其他视图将被隐藏。但我的代码确实是开放的,尽管他自己。 这是我的代码: <StackPanel Grid.Column="0"> <ToggleButton Name="Button1" Checked="MenuItem_Checked"> <ToggleButton Name="Button2" Checked="MenuItem_Checked">

我想创建窗口时,在左面板是菜单(与切换按钮),在右面板是视图。当我点击切换按钮时,视图和其他视图将被隐藏。但我的代码确实是开放的,尽管他自己。 这是我的代码:

<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}}"/>

我猜,在循环中将IsChecked设置为false会导致这个问题,因为如果您在那里定义了任何未检查的项并设置了“\u current”,在第二次迭代期间\u current可能会按住未检查的切换按钮,在那里放置一个断点并自己检查,您可以通过包含如下标志来避免这个问题

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

我猜,在循环中将IsChecked设置为false会导致这个问题,因为如果您在那里定义了任何未检查的项并设置了“\u current”,在第二次迭代期间\u current可能会按住未检查的切换按钮,在那里放置一个断点并自己检查,您可以通过包含如下标志来避免这个问题

 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>

这是我的解决方案:

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

我设计了一个定制的chrome窗口、弹出式菜单和切换按钮。当“切换按钮”被选中属性设置为“真”时,弹出式菜单将打开,动画效果良好,当切换为“关闭”时弹出式菜单将关闭

  • 显示状态

  • 隐藏状态


  • 我设计了一个定制的chrome窗口,弹出式菜单和切换按钮。当“切换按钮”被选中属性设置为“真”时,弹出式菜单将打开,动画效果良好,当切换为“关闭”时弹出式菜单将关闭

  • 显示状态

  • 隐藏状态