如何取消选择其他AppBarToggleButton UWP

时间:2017-06-22 09:33:39

标签: c# xaml uwp

我正在做一个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>

1 个答案:

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

清洁并可重复使用。 :)