在 WPF+C# 上为 Windows 8 创建 Metro (Microsoft UI) 应用程序时,我遇到了按钮上的 PointerPressed 事件的困难。当我执行左键单击(通过鼠标)时不会发生事件,但它会在右键单击或点击的情况下发生。那么这个事件有什么问题呢?例如
<Button x:Name="Somebutton" Width="100" Height="100"
PointerPressed="Somebutton_PointerPressed"/>
在 WPF+C# 上为 Windows 8 创建 Metro (Microsoft UI) 应用程序时,我遇到了按钮上的 PointerPressed 事件的困难。当我执行左键单击(通过鼠标)时不会发生事件,但它会在右键单击或点击的情况下发生。那么这个事件有什么问题呢?例如
<Button x:Name="Somebutton" Width="100" Height="100"
PointerPressed="Somebutton_PointerPressed"/>
解决方案非常简单:这些事件不能通过 XAML 而是通过 AddHandler 方法来处理。
SomeButton.AddHandler(PointerPressedEvent,
new PointerEventHandler(SomeButton_PointerPressed), true);
我遇到了这个问题,但无法使用接受的答案,因为我的按钮是由 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 方法中填充一些额外的逻辑,以便它仅在左键单击或右键单击时触发事件。无论你想要什么。
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
视觉效果和效果(即悬停等),但对我来说这不是问题。我认为您可以从库存样式中重新应用它们。
如果您正在使用 Button 控件,请尝试使用“Click”事件附加事件。
请注意,Button 控件在内部考虑并处理 PointerPressed、MouseLeftButtonDown、MouseLeftButtonUp 和引发 Click 事件。通常 Button 控件不会允许 PointerPressed、MouseLeftButtonDown、MouseLeftButtonUp 事件冒泡并触发。