2013-02-08 85 views
15

在WPF + C#上爲Windows 8創建Metro(Microsoft UI)應用程序時,遇到按鈕上的PointerPressed事件時遇到困難。當我執行左鍵單擊(通過鼠標)時不會發生事件,但是在右鍵單擊或點擊時會發生事件。那麼這個事件有什麼問題? 例如PointerPressed不能在左鍵單擊

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

@ACB這只是簡單的按鈕。我添加了代碼,以防它會幫助你 – xkillah

回答

29

解決方案非常簡單:這些事件必須不通過XAML處理,而是通過AddHandler方法處理。

SomeButton.AddHandler(PointerPressedEvent, 
new PointerEventHandler(SomeButton_PointerPressed), true); 
+3

對不起,如果這是一個愚蠢的問題,但是它通過在XAML中聲明它不工作的原因是什麼? – dcdroid

+6

@dcdroid因爲在XAML中沒有辦法設置bool'handledEventsToo'參數爲'true'。但是,這個參數是重要的細微差別,沒有它,沒有它的原因,事件處理Button中的某處,並「忽略」你的處理程序 – xkillah

+0

微軟世界多麼奇怪和艱難...簡單的事情 –

0

如果你是一個按鈕控制工作,然後嘗試使用「點擊」事件附加事件。

請注意Button控件在內部考慮並處理PointerPressed,MouseLeftButtonDown,MouseLeftButtonUp並引發Click事件。通常,Button控件不允許PointerPressed,MouseLeftButtonDown,MouseLeftButtonUp事件冒泡並觸發。

+2

不,我需要完全PointerPressed。差異描述[here](http://stackoverflow.com/questions/13318569/are-click-tapped-and-pointerpressed-synonymous-in-winrt-xaml) – xkillah

+0

請注意,按鈕控制內部考慮並處理PointerPressed,MouseLeftButtonDown, MouseLeftButtonUp並引發Click事件。通常,Button控件不允許PointerPressed,MouseLeftButtonDown,MouseLeftButtonUp事件冒泡並觸發。 – Somnath

+1

是的,對於舊的桌面Windows應用程序來說就是這樣,而對於Metro應用程序來說,由於另一個[UIElement類](http://msdn.microsoft.com/zh-cn/library/ windows/apps/xaml/windows.ui.xaml.uielement.aspx) – xkillah

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方法中添加一些額外的邏輯,以便僅在左鍵單擊或右鍵單擊時觸發事件。任何你想要的。