【问题标题】:How to make a silverlight button respond only to mouse如何使silverlight按钮只响应鼠标
【发布时间】:2011-11-21 17:50:53
【问题描述】:

我正在使用一个切换按钮,我希望它只因鼠标点击而改变其状态。默认行为是,如果焦点在按钮上,则用户可以按“空格”或“回车”来“单击”它。我想取消这个,但仍然允许按钮像往常一样响应鼠标点击(通过触发点击事件)。

有什么想法吗?

谢谢

【问题讨论】:

    标签: silverlight events button keyboard


    【解决方案1】:

    您可以将 IsTabStop 属性设置为 false,在这种情况下您将无法聚焦按钮,因此无法响应键盘。

    【讨论】:

    • 谢谢安德鲁,但这不是我想要在这里实现的目标。我确实希望按钮获得焦点,并且我希望用户能够按下回车键,我只是不希望按钮因此被单击。我想给回车键一个不同的行为。问题是,当按下 Enter 或 Space 时,该按钮甚至不会生成 KeyDown 和 KeyUp(它会为所有其他键生成)。
    • 那么我相信唯一的方法是从 Button 类派生,覆盖 OnKeyDown 而不是调用基本实现。 ButtonBase 类覆盖 OnKeyDown|Up 方法并响应那里的键。
    • @AndrewS,对我来说听起来不错。您也可以对 Behavior 执行相同的操作,然后在 XAML 中应用它。
    • 我不确定您将如何处理行为,因为您需要使用派生类。如果 Keyboard.AcceptsReturn 属性是公共的,那就太好了,因为这是 ButtonBase 类用来确定它是否应该吃回车键的内容 - ButtonBase 在其 ctor 中将其设置为 true,但 CheckBox/RadioButton 将其设置回 false。
    • 按钮的 OnKeyDown|Up 在引发实例事件之前被调用,因此它已经被处理。至于 AcceptsReturn 它是 SL 使用的内部 DependencyProperty。我不认为有任何方法可以达到它。就我个人而言,我只会将按钮 IsTabStop 设为 false。因此,单击按钮的唯一方法是使用鼠标。然后,您可以添加一些其他方式(例如快捷方式、菜单等)来通过键盘调用相同的操作,以确保符合 508/可访问性。
    【解决方案2】:

    我尝试了我在 AndrewS 帖子中的常见问题中建议的行为,但发现 KeyDown 事件没有捕获空间或输入事件。如果是空格键或回车键,您可以在更高级别捕获事件并取消它。

    XAML:

    <StackPanel KeyUp="sp_KeyUp">
      <ToggleButton x:Name="toggleButton" content="toggle me" width="120" height="20"/>
    </StackPanel>
    

    代码背后:

    public void sp_KeyUp(object sender, KeyBoardEventArgs e)
    {
      if(e.Key == System.Windows.Input.Key.Enter || e.Key == System.Windows.Input.Key.Space)
      {
        e.Handled = true; // this should cancel the event
      }
    }
    

    【讨论】:

    • 谢谢,已对齐,但 sp_KeyUp 例程是否仅在按钮已捕获并响应按键后才被调用?这意味着取消如果不会阻止按钮获得按键。另外 - 如果按钮捕获事件,为什么容器首先会得到它?它甚至不会冒泡到容器中......还是我错了? :-)
    • 我试过了(在代码中,而不仅仅是我的脑袋),你是对的。我将它与 WPF 中的隧道事件 (PreviewXXX) 混合在一起,您甚至无法在 Silverlight 中执行此操作。感谢您的更正:)。在那次尝试之后,我认为 AndrewS 有正确的答案。
    猜你喜欢
    • 2011-12-06
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多