为什么当我有触摸事件处理程序时我的鼠标事件处理程序不工作?
Why my Mouse Event Handlers are not working when I have Touch Event Handlers?
我的一些最终用户使用触摸屏,而另一些使用 PC。在触摸屏上,PreviewMouseUp/Down
与触摸事件处理程序一起触发,导致重复行为(在 PreviewMousUp/Down 中编写的函数执行两次)。
所以我的示例按钮 XAML:
<Button x:Name="Whatever" Background="Transparent" MouseUp="Whatever_MouseUp" MouseDown="Whatever_MouseDown" TouchUp="Whatever_TouchUp" TouchDown="Whatever_TouchDown">
<StackPanel>
<TextBlock x:Name="WhateverText" Text="Soemthing" FontSize="13"/>
<Image x:Name="WhateverImage" Source="bla/bla/bla"/>
</StackPanel>
</Button>
为什么 MouseDown
和 MouseUp
事件处理程序在 PC 上没有被触发?
如果我在触摸屏上执行,它就像一个魅力(触摸事件处理程序)一样工作。但是,在我的 PC(VS-2015)上它根本不起作用。请并感谢
似乎 Click 事件处理程序阻止触发 MouseDown 和 MouseUp 事件。我希望这是因为当我从头开始构建像按钮这样的自定义控件时,我使用这些事件来触发 Click 事件。
这只是我的期望。
无论如何,我试过了,如果你没有实现 TouchDown/Up,PreviewMouseDown/Up 会在触摸和非触摸时触发。但是如果你用它们实现 TouchDown/Up,在 TOUCH 上的执行将是这样的:> TouchDown > PreviewMouseDown > TouchUp > PreviewMouseUp。 NON-TOUCH 上的执行将是这样的: > PreviewMouseDown > PreviewMouseUp。所以我建议你使用 PreviewMouseDown/Up 因为它适用于触摸和非触摸。
您也可以使用 MouseRightButtonDown/Up 它会与您一起工作。但是您会注意到 MouseDown/Up 在它之后被触发。您可以通过添加 e.Handled = true 来简单地防止这种情况;在 MouseRightButtonDown/Up 个处理程序中。
尝试利用这些提示,如果您无法解决问题,请告诉我,我会和您一起考虑。祝你好运。
我不确定您为什么不简单地使用应该同时适用于鼠标和触摸的 Click 事件,但是您没有看到 MouseUp 和 MouseDown 的原因在此处解释:WPF MouseLeftButtonUp Not Firing。除非您创建自己的按钮控件并控制容器本身或使用您自己的按钮模板,否则如果无法选择 Click 事件,则 PreviewXXX 事件是您的最佳选择。即使您在模板中的 StackPanel 上设置了事件处理程序,您也不会获得 MouseUp 事件,因为由于 Button 控件的默认行为,Button 将捕获鼠标。下面的代码只会为 StackPanel 获取 MouseDown 事件,但永远不会触发 MouseUp。只是为了验证,我添加了 Click 事件,每次我在 Button 内释放鼠标时都会触发它,这是 Button 的预期行为。
<Button Click="Whatever_Click" x:Name="Whatever" MouseUp="Whatever_MouseUp" MouseDown="Whatever_MouseDown" TouchUp="Whatever_TouchUp" TouchDown="Whatever_TouchDown">
<Button.Template>
<ControlTemplate TargetType="{x:Type Button}">
<StackPanel x:Name="stackButton" MouseUp="Whatever_MouseUp" MouseDown="Whatever_MouseDown" TouchUp="Whatever_TouchUp" TouchDown="Whatever_TouchDown">
<TextBlock x:Name="WhateverText" Text="StackPanelClick" FontSize="13"/>
<Image x:Name="WhateverImage" Source="dice.png"/>
</StackPanel>
</ControlTemplate>
</Button.Template>
</Button>
我的一些最终用户使用触摸屏,而另一些使用 PC。在触摸屏上,PreviewMouseUp/Down
与触摸事件处理程序一起触发,导致重复行为(在 PreviewMousUp/Down 中编写的函数执行两次)。
所以我的示例按钮 XAML:
<Button x:Name="Whatever" Background="Transparent" MouseUp="Whatever_MouseUp" MouseDown="Whatever_MouseDown" TouchUp="Whatever_TouchUp" TouchDown="Whatever_TouchDown">
<StackPanel>
<TextBlock x:Name="WhateverText" Text="Soemthing" FontSize="13"/>
<Image x:Name="WhateverImage" Source="bla/bla/bla"/>
</StackPanel>
</Button>
为什么 MouseDown
和 MouseUp
事件处理程序在 PC 上没有被触发?
如果我在触摸屏上执行,它就像一个魅力(触摸事件处理程序)一样工作。但是,在我的 PC(VS-2015)上它根本不起作用。请并感谢
似乎 Click 事件处理程序阻止触发 MouseDown 和 MouseUp 事件。我希望这是因为当我从头开始构建像按钮这样的自定义控件时,我使用这些事件来触发 Click 事件。 这只是我的期望。
无论如何,我试过了,如果你没有实现 TouchDown/Up,PreviewMouseDown/Up 会在触摸和非触摸时触发。但是如果你用它们实现 TouchDown/Up,在 TOUCH 上的执行将是这样的:> TouchDown > PreviewMouseDown > TouchUp > PreviewMouseUp。 NON-TOUCH 上的执行将是这样的: > PreviewMouseDown > PreviewMouseUp。所以我建议你使用 PreviewMouseDown/Up 因为它适用于触摸和非触摸。
您也可以使用 MouseRightButtonDown/Up 它会与您一起工作。但是您会注意到 MouseDown/Up 在它之后被触发。您可以通过添加 e.Handled = true 来简单地防止这种情况;在 MouseRightButtonDown/Up 个处理程序中。
尝试利用这些提示,如果您无法解决问题,请告诉我,我会和您一起考虑。祝你好运。
我不确定您为什么不简单地使用应该同时适用于鼠标和触摸的 Click 事件,但是您没有看到 MouseUp 和 MouseDown 的原因在此处解释:WPF MouseLeftButtonUp Not Firing。除非您创建自己的按钮控件并控制容器本身或使用您自己的按钮模板,否则如果无法选择 Click 事件,则 PreviewXXX 事件是您的最佳选择。即使您在模板中的 StackPanel 上设置了事件处理程序,您也不会获得 MouseUp 事件,因为由于 Button 控件的默认行为,Button 将捕获鼠标。下面的代码只会为 StackPanel 获取 MouseDown 事件,但永远不会触发 MouseUp。只是为了验证,我添加了 Click 事件,每次我在 Button 内释放鼠标时都会触发它,这是 Button 的预期行为。
<Button Click="Whatever_Click" x:Name="Whatever" MouseUp="Whatever_MouseUp" MouseDown="Whatever_MouseDown" TouchUp="Whatever_TouchUp" TouchDown="Whatever_TouchDown">
<Button.Template>
<ControlTemplate TargetType="{x:Type Button}">
<StackPanel x:Name="stackButton" MouseUp="Whatever_MouseUp" MouseDown="Whatever_MouseDown" TouchUp="Whatever_TouchUp" TouchDown="Whatever_TouchDown">
<TextBlock x:Name="WhateverText" Text="StackPanelClick" FontSize="13"/>
<Image x:Name="WhateverImage" Source="dice.png"/>
</StackPanel>
</ControlTemplate>
</Button.Template>
</Button>