locked
ContextMenu を Tap & Hold ではなくて、Tap で開く方法 RRS feed

  • 質問

  • 初めて投稿させていただきます、MAirJ と申します。

     

    Silverlight for Windows Phone 7 ToolKit に含まれている、ContextMenu を使ってアプリケーションを作成しています。

    そこで英語の技術情報サイトにて、ContextMenu を Tap & Hold ではなくて、Tap イベントで開く方法が説明されていました。

    下記がその方法になります。

     

    <Grid>
      <toolkit:ContextMenuService.ContextMenu>
        <toolkit:ContextMenu x:Name="menu1">
          <toolkit:MenuItem Header="item1" />
          <toolkit:MenuItem Header="item2"  />
          <toolkit:MenuItem Header="item3"  />
        </toolkit:ContextMenu>
      </toolkit:ContextMenuService.ContextMenu>
      <Image Source="logo.png" Height="80" Width="80">
        <toolkit:GestureService.GestureListener>
          <toolkit:GestureListener Tap="GestureListener_Tap" />
        </toolkit:GestureService.GestureListener>
      </Image>
      <TextBlock Text="Tap the image"/>
    </Grid><br/>
    
    private void GestureListener_Tap(object sender, GestureEventArgs e)
    {    
      if (this.menu1.Parent == null)    
      {        
          this.menu1.IsOpen = true;    
      }
    }
    
    

    このコードをそのまま新規プロジェクトにコピーして実行したところ、下記のような NullReferenceException で落ちてしまい ContextMenu を Tap で開くことができませんでした。

    System.NullReferenceException was unhandled
      Message=NullReferenceException
      StackTrace:
           at Microsoft.Phone.Controls.ContextMenu.UpdateVisualStates(Boolean useTransitions)
           at Microsoft.Phone.Controls.ContextMenu.OnOpened(RoutedEventArgs e)
           at Microsoft.Phone.Controls.ContextMenu.<OpenPopup>b__12(Object s, EventArgs e)
           at MS.Internal.CoreInvokeHandler.InvokeEventHandler(Int32 typeIndex, Delegate handlerDelegate, Object sender, Object args)
           at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)

    しかしサイトにあるサンプルプロジェクトをダウンロードして実行したところ、同じコードでもこちらは問題なく動いているようです。

    またサンプルプロジェクトのすべてのコードを新規プロジェクトにコピーして実行したところ、こちらも同じ NullReferenceException エラーでアプリケーションが落ちてしまいました。

     

    デバッグ等も試みたのですがこの NullReferenceException の原因がわからないため投稿させていただきました。

    プロパティか設定の可能性も大きいと思いますが、もしこの問題の解決方法をご存じな方がいらっしゃる場合にはご教示頂ければ幸いです。

     

    • 移動 Mike Wang (MSCS) 2012年10月2日 10:57 (移動元:Windows Phone 7 How-to)
    2011年9月29日 10:24

すべての返信

  • こんばんは。
    7.1 向けのプロジェクトで実行すると確かにエラーが出ますね。

    GestureListener はすごく便利なんですが、時々挙動がおかしい事があるような気がします。
    Image をタップしたら... という事でしたら GestureListener を使わなくてもいいのかな?と思います。

    以下のような感じでいかがでしょうか?

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <toolkit:ContextMenuService.ContextMenu>
            <toolkit:ContextMenu x:Name="menu1">
                <toolkit:MenuItem Header="item1" />
                <toolkit:MenuItem Header="item2"  />
                <toolkit:MenuItem Header="item3"  />
            </toolkit:ContextMenu>
        </toolkit:ContextMenuService.ContextMenu>
        <TextBlock Text="Tap the image"/>
        <Image Grid.Row="1" Source="Background.png" Height="80" Width="80" ManipulationCompleted="Image_ManipulationCompleted" />
    </Grid>
    
    

    private void Image_ManipulationCompleted(object sender, System.Windows.Input.ManipulationCompletedEventArgs e)
    {
        if (this.menu1.Parent == null)
        {
            this.menu1.IsOpen = true;
        }
    }
    

    2011年10月3日 13:30