我正在做一个 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)
您只需要x:Name您的按钮并在单击另一个按钮时手动设置IsChecked为False。
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)
清洁和可重复使用。:)
| 归档时间: |
|
| 查看次数: |
396 次 |
| 最近记录: |