我正在做一个UWP项目,我正在使用CommandBar。
在我的命令栏中,我有多个AppBarToggleButton
,当我点击其中一个时,我不希望其他AppBarToggleButton
取消选择。
有没有选择呢?
这是一个symple代码:
<CommandBar>
<AppBarToggleButton Icon="Shuffle" Label="Shuffle" Click="AppBarButton_Click" />
<AppBarToggleButton Icon="RepeatAll" Label="Repeat" Click="AppBarButton_Click"/>
<CommandBar.Content>
<TextBlock Text="Now playing..." Margin="12,14"/>
</CommandBar.Content>
答案 0 :(得分:4)
只需点击其他按钮,您只需x:Name
按钮并手动将IsChecked
设置为False
。
private void AppBarButton1_Click(object sender, RoutedEventArgs e)
{
AppBarButton2.IsChecked = false;
}
纯XAML解决方案将使用绑定。请注意,您需要InvertedBooleanConverter
。
IsChecked="{x:Bind Toggle1.IsChecked, Converter={StaticResource InvertedBooleanConverter}, Mode=TwoWay}"
我真的不喜欢绑定方法,所以这里是一个用行为构建的纯XAML解决方案。请注意,您需要首先从Nuget包管理器安装XAML行为 -
Install-Package Microsoft.Xaml.Behaviors.Uwp.Managed -Version 2.0.0
下面的AutoDeselectToggleButtonBehavior
行为基本上会在AppBarToggleButton
加载后获得所有CommandBar
,订阅所有Click
个事件,在处理程序中,只需取消选择除了点击之外的所有其他切换。
public class AutoDeselectToggleButtonBehavior : Behavior<CommandBar>
{
private IEnumerable<AppBarToggleButton> _toggleButtons;
protected override void OnAttached()
{
AssociatedObject.Loaded += OnLoaded;
base.OnAttached();
}
protected override void OnDetaching()
{
foreach (var toggle in _toggleButtons)
{
toggle.Click -= OnToggleClick;
}
AssociatedObject.Loaded -= OnLoaded;
base.OnDetaching();
}
private void OnLoaded(object sender, RoutedEventArgs e)
{
// Children extension method:
// https://github.com/JustinXinLiu/Continuity/blob/master/Continuity/Extensions/UtilExtensions.cs#L25
_toggleButtons = AssociatedObject.Children().OfType<AppBarToggleButton>();
foreach (var toggle in _toggleButtons)
{
toggle.Click += OnToggleClick;
}
}
private void OnToggleClick(object sender, RoutedEventArgs e)
{
var clickedToggle = (AppBarToggleButton)sender;
foreach (var toggle in _toggleButtons)
{
if (toggle != clickedToggle)
{
toggle.IsChecked = false;
}
}
}
}
一旦到位,只需将其附加到CommandBar
,如下所示 -
<CommandBar>
<Interactivity:Interaction.Behaviors>
<local:AutoDeselectToggleButtonBehavior />
</Interactivity:Interaction.Behaviors>
清洁并可重复使用。 :)