PointerPressed在左键单击时不起作用

时间:2013-02-08 06:34:10

标签: c# wpf windows-8 microsoft-metro controls

在WPF + C#上为Windows 8创建Metro(Microsoft UI)应用程序,我遇到了按钮上的PointerPressed事件的困难。当我执行左键单击(通过鼠标)时不会发生事件,但是在右键单击或点击时会发生这种情况。那个事件有什么问题? 例如

 <Button x:Name="Somebutton"  Width="100" Height="100"
PointerPressed="Somebutton_PointerPressed"/>

4 个答案:

答案 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事件冒泡并触发。