2

我正在开发一个类似 WPF 信息亭的客户端,它将部署在启用多点触控的 HP TouchSmart Windows 7 机器上。我的问题是,对于 Windows 7 多点触控,应用程序无法将手指“轻击”识别为按钮按下事件,因此永远不会触发按钮按下触发器来更改颜色。

触摸的 Windows 7 动画通常会显示,并且按钮单击事件可以正常触发。只有“IsPressed”事件的 XAML 定义样式在手指点击时无法按预期运行。如果用手指施加足够的压力和/或像指纹一样滚动或按压,它最终会起作用。是否有一种解决方法可以让“点击”触发按下/单击事件?

<Trigger Property="AreAnyTouchesOver" Value="true">
    <Trigger.ExitActions>
        <BeginStoryboard Storyboard="{StaticResource PressedOff}" />
    </Trigger.ExitActions>
    <Trigger.EnterActions>
        <BeginStoryboard Storyboard="{StaticResource PressedOn}" />
    </Trigger.EnterActions>
</Trigger>

<Trigger Property="AreAnyTouchesDirectlyOver" Value="true">
    <Trigger.ExitActions>
        <BeginStoryboard Storyboard="{StaticResource PressedOff}" />
    </Trigger.ExitActions>
    <Trigger.EnterActions>
        <BeginStoryboard Storyboard="{StaticResource PressedOn}" />
    </Trigger.EnterActions>
</Trigger>
4

3 回答 3

6

只需将Stylus.IsPressAndHoldEnabled附加属性设置False为按钮。这将导致按钮的IsPressed属性被设置/清除以响应触摸和鼠标单击。

UIElement.TouchDown Event的文档中:

若要在手指触摸屏幕时立即发生 PreviewTouchDown 和 TouchDown 事件,请将此元素的 Stylus.IsPressAndHoldEnabled 附加属性设置为 false。

例如,您可以在按钮样式中使用 setter 来确保将属性设置为 false:

<Setter Property="Stylus.IsPressAndHoldEnabled" Value="False"/>

我在尝试找到一种方法使我的按钮可靠地为鼠标单击和触摸事件设置动画时发现了这个问题。接受的答案让我走上了一条似乎错误的道路:将情节提要与上/下事件同步。事实证明,对两者使用IsPressed属性触发器既简单又可靠。希望这可以避免其他人犯类似的错误。

于 2013-09-18T23:03:41.367 回答
5

我不清楚你想做什么。

关于您的问题的一些解释:

In touch IsPressed 仅在您的联系人被按住在元素上并且通过移动阈值以创建“按下”时触发(这就是为什么如果您按下手指并轻轻滑动它会看到它的原因)

一旦联系人出现 IsPressed = false。

当您“点击”一个按钮时,您实际上是在单击鼠标。这就是事件按预期触发的原因。

那么你到底想做什么?您希望在“按住”按钮(“IsPressed”)或单击(点击)按钮时触发情节提要动画。

这是两种不同的情况,还请注意,桌面隐喻通常不能很好地转化为触摸环境。您可能需要重新考虑如何向用户提供视觉反馈。

如果我正确理解您的问题,我认为您想要的最简单的答案是触发“TouchDown”。

更新:

这应该适用于 TouchDown 触发器

<Button Content="Touch Down Example" Height="20" Width="20">
        <Button.Triggers>
            <EventTrigger RoutedEvent="Button.TouchDown">
                <BeginStoryboard>
                    ....
                </BeginStoryboard>
            </EventTrigger>
        </Button.Triggers>
    </Button>

注意:我面前没有触摸屏,所以可能会有错误,但看起来是正确的。

于 2010-09-27T22:47:21.100 回答
2

对于触摸开发,我建议在您的项目中使用Microsoft® Surface® Toolkit for Windows Touch Beta,并使用包含的表面控件,因为它们可以正确处理触摸事件以及大量用例,例如用户按下按钮用 2 根手指,一次抬起一根。只有最后一个“lift”或 TouchUp 事件应该触发 Click 事件。

所有的表面控件都是 Windows 控件的子类,因此 SurfaceListBox 是 ListBox 的子类,SurfaceButton 是 Button 的子类等。这样,您的所有样式和模板仍然可以使用这些控件。

在您的情况下,您将需要使用 SurfaceButton 控件。只需添加对工具包程序集的引用,然后在您的外部元素(、、等)中,添加对表面命名空间的引用,例如

xmlns:s="http://schemas.microsoft.com/surface/2008"

然后从该命名空间添加表面控件,例如

<s:SurfaceButton x:Name="button1" Click="OnButtonClick" />
于 2010-09-30T12:44:42.160 回答