如何在不设置IsEnabled的情况下防止Toggle按钮被切换?

11 浏览
0 Comments

如何在不设置IsEnabled的情况下防止Toggle按钮被切换?

我有一个ToggleButtons的列表,它们被用作ListBox中的ItemTemplate,类似于这个答案,使用ListBox的MultiSelect模式。然而,我需要确保至少有一个项目始终被选中。

通过在ListBox.SelectionChanged事件中将一个项目添加回到ListBox的SelectedItems集合中,我可以从ListBox获得正确的行为,但是我的ToggleButton仍然会退出切换状态,所以我认为我需要在过程的早期停止它。

我希望在不将最后一个选中的按钮设置为IsEnabled="False"的情况下完成,因为我更喜欢保持启用的视觉样式,而无需重新制作我的按钮模板。有什么想法吗?

0
0 Comments

问题出现的原因是希望阻止用户在不设置IsEnabled属性的情况下切换ToggleButton的状态。解决方法是使用IsHitTestVisible属性来禁止用户取消选择ToggleButton,将其设置为false。然而,用户仍然可以通过使用空格键来切换到控件并切换它。

此外,当用户尝试在锁定状态下切换ToggleButton时,可能希望发出可听的“ding”声。使用IsHitTestVisible属性无法实现这一点。

您可以使用IsTabStop="False"来防止用户通过Tab键切换到按钮。我更喜欢这个解决方案,因为它可以直接在XAML中完成,符合MVVM模式,并且不需要任何自定义代码。如果需要在多个位置应用它,可以使用样式。

0
0 Comments

问题原因:

Toggle按钮默认是可以被切换的,但有时我们希望禁止用户切换它的状态。在不设置IsEnabled属性的情况下,我们需要找到一种方法来阻止Toggle按钮的切换。

解决方法:

我们可以通过重写OnToggle方法来阻止Toggle按钮的切换状态,具体方法如下:

public class LockableToggleButton : ToggleButton
{
    protected override void OnToggle()
    {
        if (!LockToggle)
        {
            base.OnToggle();
        }
    }
    public bool LockToggle
    {
        get { return (bool)GetValue(LockToggleProperty); }
        set { SetValue(LockToggleProperty, value); }
    }
    public static readonly DependencyProperty LockToggleProperty =
        DependencyProperty.Register("LockToggle", typeof(bool), typeof(LockableToggleButton), new UIPropertyMetadata(false));
}

这样,我们创建了一个名为LockableToggleButton的自定义ToggleButton类。在这个类中,我们重写了OnToggle方法,并在切换之前检查了LockToggle属性的值。只有当LockToggle为false时,才调用基类的OnToggle方法,从而实现了阻止Toggle按钮切换状态的功能。

通过使用这个自定义的LockableToggleButton类,我们可以在不设置IsEnabled属性的情况下,阻止Toggle按钮的切换。这种方法简单有效,可以很好地满足我们的需求。

0
0 Comments

使用RadioButton替代ToggleButton可以防止ToggleButton被取消选择而不选择其他选项。可以通过设置RadioButton的样式来使其看起来像ToggleButton:


如果已经为RadioButton设置了样式,可以使用BasedOn属性将其样式设置为ToggleButton的样式。需要注意的是,Visual Studio编辑器在第一种情况下会显示错误,但是编译和运行正常。

0