我的一些最终用户拥有触摸屏,而其他人拥有个人电脑。在触摸屏上,PreviewMouseUp/Down
与触摸事件处理程序一起触发,导致重复行为(在PreviewMousUp / Down中写入的函数执行两次)。
所以我的样本Button 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上被解雇?
如果我在触摸屏上执行,它就像魅力(触摸事件处理程序)。但是,在我的电脑(VS-2015)上它根本不起作用。拜托,谢谢
答案 0 :(得分:3)
似乎Click事件处理程序阻止了MouseDown和MouseUp的触发事件。我希望这是因为当我从头开始构建自定义控件(如按钮)时,我会使用这些事件触发Click事件。 这只是我的期望。
无论如何,我尝试过,如果你没有实现TouchDown / Up,则触摸和非触摸都会触发PreviewMouseDown / Up。但是如果你用它们实现了TouchDown / Up,那么在TOUCH上执行将是这样的:&gt; TouchDown&gt; PreviewMouseDown&gt; TouchUp&gt; PreviewMouseUp。在NON-TOUCH上的执行将是这样的:&gt; PreviewMouseDown&gt; PreviewMouseUp。所以我建议您使用PreviewMouseDown / Up,因为它适用于触摸和非触摸。
你也可以使用MouseRightButtonDown / Up它可以和你一起使用。但是你会注意到MouseDown / Up被激活了。你可以通过添加e.Handled = true来阻止它;在MouseRightButtonDown / Up处理程序中。
尝试使用这些提示,如果你无法解决它,请告诉我,我会和你一起思考。祝你好运。
答案 1 :(得分:2)
我不确定为什么你不是简单地使用适用于鼠标和触摸的Click事件,但是你没有看到MouseUp和MouseDown的原因在这里解释:WPF MouseLeftButtonUp Not Firing。除非您创建自己的按钮控件并控制容器本身或使用您自己的按钮模板,否则如果Click Event不是一个选项,则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>