在WPF + C#上为Windows 8创建Metro(Microsoft UI)应用程序,我遇到了按钮上的PointerPressed事件的困难。当我执行左键单击(通过鼠标)时不会发生事件,但是在右键单击或点击时会发生这种情况。那个事件有什么问题? 例如
<Button x:Name="Somebutton" Width="100" Height="100"
PointerPressed="Somebutton_PointerPressed"/>
答案 0 :(得分:32)
解决方案非常简单:这些事件不是通过XAML处理,而是通过AddHandler方法处理。
SomeButton.AddHandler(PointerPressedEvent,
new PointerEventHandler(SomeButton_PointerPressed), true);
答案 1 :(得分:0)
我遇到了这个问题,但由于我的按钮是由ItemsControl动态创建的,因此无法使用接受的答案,而且没有好的地方可以调用AddHandler。
相反,我将Windows.UI.Xaml.Controls.Button:
分类public sealed class PressAndHoldButton : Button
{
public event EventHandler PointerPressPreview = delegate { };
protected override void OnPointerPressed(PointerRoutedEventArgs e)
{
PointerPressPreview(this, EventArgs.Empty);
base.OnPointerPressed(e);
}
}
现在,消费控件可以绑定到PointerPressPreview而不是PointerPressed
<local:PressAndHoldButton
x:Name="Somebutton"
Width="100"
Height="100"
PointerPressPreview="Somebutton_PointerPressed"/>
如果需要,可以在重写的OnPointerPressed方法中添加一些额外的逻辑,这样它只会在左键单击或右键单击时触发事件。无论你想要什么。
答案 2 :(得分:0)
FWIW,我也遇到过同样的问题,并通过将事件处理程序添加到其他控件(但有一个按钮)来解决了这个问题。
在我的情况下,我将Button
包裹在SymbolIcon
周围,如下所示:
<Button PointerPressed="OnTempoPressed" PointerReleased="OnTempoReleased">
<SymbolIcon Symbol="Add" />
</Button>
我所做的只是删除了Button
包装,并将处理程序添加到SymbolIcon
本身,现在一切正常:
<SymbolIcon Symbol="Add"
PointerPressed="OnTempoPressed" PointerReleased="OnTempoReleased"/>
答案 3 :(得分:-1)
如果您正在使用Button控件,请尝试使用“Click”事件附加事件。
请注意,Button控件在内部考虑并处理PointerPressed,MouseLeftButtonDown,MouseLeftButtonUp和引发Click事件。通常,Button控件不允许PointerPressed,MouseLeftButtonDown,MouseLeftButtonUp事件冒泡并触发。