如何取消选择其他 AppBarToggleButton UWP

fan*_*dro 1 c# xaml uwp

我正在做一个 UWP 项目,我正在使用 CommandBar。在我的命令栏中,我有多个AppBarToggleButton,当我单击其中一个时,我不想AppBarToggleButton取消选择另一个。有没有办法做到这一点?

这是一个简单的代码:

<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>
Run Code Online (Sandbox Code Playgroud)

Jus*_* XL 6

您只需要x:Name您的按钮并在单击另一个按钮时手动设置IsCheckedFalse

private void AppBarButton1_Click(object sender, RoutedEventArgs e)
{
    AppBarButton2.IsChecked = false;
}
Run Code Online (Sandbox Code Playgroud)

更新

纯 XAML 解决方案将使用绑定。请注意,您将需要一个InvertedBooleanConverterhere。

IsChecked="{x:Bind Toggle1.IsChecked, Converter={StaticResource InvertedBooleanConverter}, Mode=TwoWay}"
Run Code Online (Sandbox Code Playgroud)

奖金

我真的不喜欢绑定方法,所以这里有一个使用行为构建的纯 XAML 解决方案。请注意,您需要首先从 Nuget 包管理器安装 XAML 行为 -

Install-Package Microsoft.Xaml.Behaviors.Uwp.Managed -Version 2.0.0
Run Code Online (Sandbox Code Playgroud)

AutoDeselectToggleButtonBehavior下面的这种行为基本上会在加载后获取所有AppBarToggleButtons 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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

就位后,只需将其附加到您CommandBar的以下内容 -

<CommandBar>
    <Interactivity:Interaction.Behaviors>
        <local:AutoDeselectToggleButtonBehavior />
    </Interactivity:Interaction.Behaviors>
Run Code Online (Sandbox Code Playgroud)

清洁和可重复使用。:)