WPF和触摸 - 焦点问题

13
我有一个运行在 Windows 8.1 平板上的 WPF .NET 4.6 应用程序,最近几天我一直在努力使应用程序变得触摸友好以使其正常工作。我的主要问题与焦点有关,这会影响到我的应用程序中的多个控件。例如:
  • 文本框:有时需要双击或三击才能获得输入焦点,它们确实进入了鼠标悬停状态,但光标不在那里;
  • 组合框:需要几次点击才能打开它,并且一旦触摸某个项目以选择它,则组合框保持打开状态并突出显示新选择的项目;
    combobox focus problem
  • 按钮:需要点击几次才能运行连接的命令并保持在鼠标悬停状态;
  • 键盘支持。

在寻找解决方案时,我尝试了几种方法,每种方法都有自己的缺点:

  • 移除整个应用程序的平板支持(从这里获取)。这个解决了上述大部分焦点问题,但使滚动(以及我还没有发现的其他与平板相关的功能)无法使用。
  • 在需要时明确激活键盘(示例在此)。焦点问题仍然存在,滚动按预期工作
  • 我还尝试删除所有样式,并在来自不同制造商的两个不同平板电脑上测试了一切,但没有成功。

最近微软宣布“触摸更好”,但我找不到任何关于如何最好地处理这个主题的官方文档。

有什么建议可以使我的应用程序在触摸方面更好地工作,将是一个很大的帮助。

1个回答

1

我通过使用以下行为来删除鼠标悬停状态:

public class TouchDeviceMouseOverUIElementFixBehavior : Behavior<UIElement>
{
    protected override void OnAttached()
    {
        AssociatedObject.StylusUp += AssociatedObject_StylusUp;
    }

    protected override void OnDetaching()
    {
        AssociatedObject.StylusUp -= AssociatedObject_StylusUp;
    }

    private void AssociatedObject_StylusUp(object sender, StylusEventArgs e)
    {
        var control = sender as FrameworkElement;
        if (control != null)
        {
            if (!VisualStateManager.GoToElementState(control, "Normal", true))
            {
                VisualStateManager.GoToState(control, "Normal", true);
            }
        }
    }
}

1
你如何使用这段代码?连接到控件的触摸事件? - Scott Solmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接