【问题标题】:Distinguish Between Events Triggered by User Input Vs. Code Behind UWP区分由用户输入触发的事件与。 UWP 背后的代码
【发布时间】:2018-05-25 22:13:19
【问题描述】:

我在 UWP 应用中有一个 CheckBox,由用户和背后的代码操作。当用户检查它时,我确实希望触发 Checked 事件。但是,当后面的代码检查它时(如下所示),我不希望它触发。

checkBoxExample.isChecked = true; //The Checked event should not fire.

我想我会从发件人(对象)或 e(RoutedEventArgs)获得此信息,但它不存在。

【问题讨论】:

  • 你有没有想过在 UWP 中添加一个类似于以下的布尔字段:
  • 我认为您可以只跟踪Tapped 事件而不是Checked,然后像var isChecked = checkbox.isChecked; 一样直接在事件处理程序中获取新值
  • @AndreyAshikhmin 我认为不应使用Tapped 事件,它仅适用于触摸、笔和鼠标输入。我在回答中提到了这一点
  • 这是一个很好的例子,为什么您必须使用 MVVM 而不是将逻辑直接放入代码隐藏中

标签: c# xaml checkbox uwp


【解决方案1】:

您可以添加一个标志,然后设置该标志以避免处理事件:

private bool _checkedFromCode = false;

private void CheckboxChecked(object sender, RoutedEventArgs e)
{
    if ( !_checkedFromCode )
    {
        //your logic
    }
}

现在在代码中设置IsChecked 时:

_checkedFromCode = true;
checkBoxExample.IsChecked = true;
_checkedFromCode = false;

该事件仍将触发,但您可以将处理限制为仅在实际来自用户交互时进行。

或者,您可以创建一个自定义派生版本的CheckBox,该版本将具有仅用于此场景的自定义事件。

RE:Tapped 事件:建议的带有Tapped 事件的解决方案将不起作用,因为您不应假定用户正在使用触摸、鼠标或笔,由于 Windows 10 可以处理任何类型的输入,因此唯一可靠的事件是 Checked 事件。您使用哪种输入类型并不重要。对于使您的应用程序易于访问和包容性尤其如此。例如,键盘不会导致Tapped 事件。

【讨论】:

  • 您能否提供不会引发 Tapped 事件但仍允许用户选中复选框的输入示例?
  • Keyboard 主要,这将是有限制的用户的主要输入 - 如果您创建一个空白的 UWP 应用程序,请在页面上放置一个 CheckBox,向其添加一个 Tapped 事件,设置一个断点,启动应用程序并按 Tab,然后按空格 - 将检查 CheckBox,但不会触发事件
  • 我也倾向于 :-D .
  • 我希望有一个更优雅/内置的方法,但这也很好用。谢谢。
  • @MartinZikmund 最近我一直在使用通用 ButtonBase.Command 属性。事实证明,命令仅由用户交互触发,因此不需要任何标志。此外,Microsoft 文档建议尽可能使用命令而不是事件处理程序来提高性能和效率。命令实际上很酷! docs.microsoft.com/en-us/windows/uwp/design/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 2015-05-29
  • 2011-06-22
  • 2016-06-12
相关资源
最近更新 更多