【问题标题】:Menu with ToggleButtons带有切换按钮的菜单
【发布时间】:2017-01-04 05:55:41
【问题描述】:

我想在左侧面板是菜单(带有切换按钮)和右侧面板是视图时创建窗口。当我单击切换按钮时,视图可见,而另一个视图将被隐藏。但是我的代码尽管他自己也能打开视图。 这是我的代码:

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

【问题讨论】:

    标签: wpf togglebutton


    【解决方案1】:

    我猜,在循环中将 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;
                    }
                }
            }
        }
    

    【讨论】:

      【解决方案2】:

      这是我的解决方案:

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

      【讨论】:

        【解决方案3】:

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

        1. 显示状态 flyout menu is open

        2. 隐藏状态 flyout menu is closed

        【讨论】:

          猜你喜欢
          • 2017-05-21
          • 2018-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多