none
RibbonGalleryItemでSelectedイベントが発生しない RRS feed

  • 質問

  • お世話になります。
    .NET4 C#、WPFでRibbonを使用してアプリを開発しています。
    Applicationメニューの補助ペインで「最近使用したファイル」を選択させる処理を実装していますが、Selectedイベントが発生しません。

    コードは次の通りです。何が原因なのか教えて下さい。

    <r:RibbonGallery>
      <r:RibbonGalleryCategory ItemsSource="{Binding Source={x:Static me:RibbonViewModel.RecentFiles},
    Path=GalleryItemDataCollection}">
        <r:RibbonGalleryCategory.ItemTemplate>
          <DataTemplate>
            <r:RibbonGalleryItem Content="{Binding Label}" Selected="RecentFile_Selected" />
          </DataTemplate>
        </r:RibbonGalleryCategory.ItemTemplate>
      </r:RibbonGalleryCategory>
    </r:RibbonGallery>

    --- イベントハンドラー -------------------
    private void RecentFile_Selected(object sender, RoutedEventArgs e)
    {
      RibbonGalleryItem recentFile = (RibbonGalleryItem)sender;
      MessageBox.Show(recentFile.Content.ToString());
    }


    なお、コードを下記のように変更すればSelectedイベントは発生しますが、上記の方式で実装したいと考えています。

    <r:RibbonApplicationMenu Loaded="RibbonApplicationMenu_Loaded" ・・・・ 他は省略
    <r:RibbonGallery>
      <r:RibbonGalleryCategory x:Name="recentFiles" />
    </r:RibbonGallery>

    --- イベントハンドラー -------------------
    private void RibbonApplicationMenu_Loaded(object sender, RoutedEventArgs e)
    {
      Collection<String> recentList = RecentFile.RecentFileCollection;
      for (int i = 0; i < recentList.Count; i++)
      {
        RibbonGalleryItem recentFile = new RibbonGalleryItem();
        recentFile.Content = recentList[i];
        recentFile.Selected += new RoutedEventHandler(RecentFile_Selected);
        recentFiles.Items.Add(recentFile);
      }
    }
    private void RecentFile_Selected(object sender, RoutedEventArgs e)
    {
      RibbonGalleryItem recentFile = (RibbonGalleryItem)sender;
      MessageBox.Show(recentFile.Content.ToString());
    }

    よろしくお願いします。


    • 編集済み IKB56 2011年9月3日 14:24
    2011年9月3日 14:18

回答

  • Ribbon 系の要素を触ったことはありませんが、ItemsControl において、ItemTemplate はその ItemContainer の中身を記述する部分です。例えば ListBox であれば、ListBox の個々のアイテムの ItemContainer は ListBoxItem になりますが、ItemTemplate 内に ListBoxItem は記述せず、直接その中に表示する物を記述します。

    RibbonGalleryItem は RibbonGallery の ItemContainer のようですから、同様に ItemTemplate には記述しないのではないでしょうか。多分現状では RibbonGallery / RibbonGalleryItem / RibbonGalleryItem というツリー構成になってしまいます(で、実際に選択されるのは RibbonGallery が自動的に生成する最初の方の Item で、Selected イベントを仕掛けてるのが二番目の Item)。

    ItemContainer に対してプロパティやイベントを設定する場合、ItemTemplate ではなく、ItemContainerStyle プロパティを使って Style および Setter/EventSetter で設定することになります。

    また表示するのが単なる文字列へのバインディングであれば、DisplayMemberPath プロパティを指定するだけでよく、ItemTemplate プロパティを使用する必要はありません。

    • 回答としてマーク 山本春海 2011年9月21日 1:44
    2011年9月3日 16:47
  • 自己レスです。

    Eventハンドラー側で選択のリセットは下記の方法(SelectedItemをnullにする)で実現しました。

          RibbonGalleryxxx.SelectedItem=null;

    ありがとうございました。


    • 回答としてマーク 山本春海 2011年9月21日 1:44
    2011年9月5日 4:25

すべての返信

  • Ribbon 系の要素を触ったことはありませんが、ItemsControl において、ItemTemplate はその ItemContainer の中身を記述する部分です。例えば ListBox であれば、ListBox の個々のアイテムの ItemContainer は ListBoxItem になりますが、ItemTemplate 内に ListBoxItem は記述せず、直接その中に表示する物を記述します。

    RibbonGalleryItem は RibbonGallery の ItemContainer のようですから、同様に ItemTemplate には記述しないのではないでしょうか。多分現状では RibbonGallery / RibbonGalleryItem / RibbonGalleryItem というツリー構成になってしまいます(で、実際に選択されるのは RibbonGallery が自動的に生成する最初の方の Item で、Selected イベントを仕掛けてるのが二番目の Item)。

    ItemContainer に対してプロパティやイベントを設定する場合、ItemTemplate ではなく、ItemContainerStyle プロパティを使って Style および Setter/EventSetter で設定することになります。

    また表示するのが単なる文字列へのバインディングであれば、DisplayMemberPath プロパティを指定するだけでよく、ItemTemplate プロパティを使用する必要はありません。

    • 回答としてマーク 山本春海 2011年9月21日 1:44
    2011年9月3日 16:47
  • ありがとうございます。

    ItemContainerStyle プロパティを使いStyleでEventハンドラーを設定するよう変更し、Selectedイベントが発生することを確認しました。なお、表示する内容はファイル名の他にもありItemTemplate プロパティでその内容を設定しています。

    ただ、ひとつ問題があります。

    ファイル名(RibbonGalleryItem)を選択すればSelectedイベントが発生しそのファイルの処理は出来るのですが、その後もう一度同じファイル名を選択した場合にSelectedイベントは発生しません。同じRibbonGalleryItemでは連続してSelectedイベントを発生させない仕様?のようです。

    Eventハンドラーでitemxxx.IsSelected = falseを行ってみました。選択されていることを示す色表示は消えますが、選択状態は保持されたままのようで、Selectedイベントは発生しません

    Eventハンドラー側で選択をリセットする方法は考えられないでしょうか?

    実運用では同じファイルを連続して選択できなくても特に支障はないと思われますが、できればその制限は無くしたいと考えています。


    2011年9月5日 2:05
  • 自己レスです。

    Eventハンドラー側で選択のリセットは下記の方法(SelectedItemをnullにする)で実現しました。

          RibbonGalleryxxx.SelectedItem=null;

    ありがとうございました。


    • 回答としてマーク 山本春海 2011年9月21日 1:44
    2011年9月5日 4:25