19

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

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

4 回答 4

39

解决方案非常简单:这些事件不能通过 XAML 而是通过 AddHandler 方法来处理。

SomeButton.AddHandler(PointerPressedEvent, 
new PointerEventHandler(SomeButton_PointerPressed), true); 
于 2013-02-11T09:09:08.407 回答
2

我遇到了这个问题,但无法使用接受的答案,因为我的按钮是由 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 方法中填充一些额外的逻辑,以便它仅在左键单击或右键单击时触发事件。无论你想要什么。

于 2016-04-11T00:56:22.670 回答
0

FWIW,我一直面临同样的问题,并通过将事件处理程序添加到其他一些控件(但一个按钮)来解决它。

就我而言,我有一个像这样的Button包裹:SymbolIcon

<Button PointerPressed="OnTempoPressed" PointerReleased="OnTempoReleased">
  <SymbolIcon Symbol="Add" />
</Button>

我所做的只是删除了Button包装并将其替换为 a ViewBox,然后将处理程序添加到ViewBox自身,现在一切正常:

<Viewbox PointerPressed="OnTempoPressed" PointerReleased="OnTempoReleased">
    <SymbolIcon Symbol="Add"/>
</Viewbox>

请注意,您会丢失Button视觉效果和效果(即悬停等),但对我来说这不是问题。我认为您可以从库存样式中重新应用它们。

于 2018-10-20T23:47:56.497 回答
-1

如果您正在使用 Button 控件,请尝试使用“Click”事件附加事件。

请注意,Button 控件在内部考虑并处理 PointerPressed、MouseLeftButtonDown、MouseLeftButtonUp 和引发 Click 事件。通常 Button 控件不会允许 PointerPressed、MouseLeftButtonDown、MouseLeftButtonUp 事件冒泡并触发。

于 2013-02-08T06:56:18.850 回答