带切换按钮的菜单
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 时,弹出菜单会以漂亮的动画打开,当切换按钮关闭时,弹出菜单会关闭。
显示状态
flyout menu is open
隐藏状态
flyout menu is closed
我想创建 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 时,弹出菜单会以漂亮的动画打开,当切换按钮关闭时,弹出菜单会关闭。
显示状态 flyout menu is open
隐藏状态 flyout menu is closed