2013-02-08 25 views
15

Windows 8のMetro(Microsoft UI)アプリケーションをWPF + C#で作成すると、ボタンの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の 'handlesEventsToo'パラメータ' true'を設定する方法がないためです。しかし、このパラメータは重要なニュアンスです。イベントがButtonの中のどこかで処理され、ハンドラが「無視されます」 – xkillah

+0

Microsoftの世界がいかに奇妙でハードなのか...単純なもの –

0

あなたはその後、「クリック」イベントにイベントを添付しようButtonコントロールで作業しているしている場合。

Buttonコントロールは、PointerPressed、MouseLeftButtonDown、MouseLeftButtonUp、raise Clickイベントを内部的に考慮して処理することに注意してください。一般的に、ボタンコントロールは、PointerPressed、MouseLeftButtonDown、MouseLeftButtonUpイベントをバブルアップして起動することを許可しません。

+2

いいえ、私は正確にPointerPressedが必要です。違いは[ここに記載](http://stackoverflow.com/questions/13318569/are-click-tapped-and-pointerpressed-synonymous-in-winrt-xaml) – xkillah

+0

Buttonコントロールは内部的にPointerPressed、MouseLeftButtonDown、 MouseLeftButtonUpとraiseイベントを発生させます。一般的に、ボタンコントロールは、PointerPressed、MouseLeftButtonDown、MouseLeftButtonUpイベントをバブルアップして起動することを許可しません。 – Somnath

+1

はい、それは古い良いデスクトップのWindowsアプリケーションのための方法でした.Metro-Appでは、別の[UIElementクラス]のため、MouseLeftButtonUp、MouseLeftButtonDownはありません。(http://msdn.microsoft.com/en-us/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); 
    } 
} 

今あなたがしたい場合は、かかる制御は、代わりにPointerPressed

<local:PressAndHoldButton 
    x:Name="Somebutton" 
    Width="100" 
    Height="100" 
    PointerPressPreview="Somebutton_PointerPressed"/> 

のPointerPressPreviewに結合することができ、オーバーライドされたOnPointerPressedメソッドに追加のロジックを追加して、左クリックでイベントを発生させるか、右クリックするだけで済みます。あなたが望むものなら、なんでも。

関連する問題