2

いくつかのRibbonCommandsを持つRibbonmenuにMicrosofts RibbonControlLibraryを使用しています。押された各リボン ボタンのタブを含む TabControl があります。たとえば、RibbonCommand 2 をクリックすると、TabControl にまだ存在しない場合は「Tab2」というタブを作成し、それ以外の場合はフォーカスする必要があります。

私はすでにhttp://www.codeproject.com/KB/WPF/WpfTabClos ​​eButton.aspx を実装しています。これは非常に優れています。

私はまだ WPF のイベント メカニズムを正しく理解していないと思います。私のコードは、Ribboncontrol のサンプル プロジェクトを大幅に変更しました。

これがコマンドの実装方法です。

<Window.CommandBindings>
  <CommandBinding Command="me:AppCommands.Protokoll" Executed="RibbonButton_Click" /> 
</Window.CommandBindings>

RibbonControl 内のボタンは次のようになります。

<r:RibbonButton Command="me:AppCommands.Protokoll" />

AppCommands.cs

public class AppCommands
{
  public static RibbonCommand Protokoll
  {
     get { return (RibbonCommand)Application.Current.Resources["ProtokollCommand"]; }
   }
}

リソース辞書:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:r="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary">
    <r:RibbonCommand x:Key="ProtokollCommand"                
        LabelTitle="foo"
        ToolTipTitle="foo"
        ToolTipDescription="foo" />
</ResourceDictionary>

私が今書きたいのは、ボタンのクリックごとにタブを作成するメソッドです。作成されたタブページには特定のユーザーコントロールが含まれています。CommandButtons と Tabs の間のマッピングを最適に実装する方法がわかりません。ボタンごとにイベントハンドラーを使用するのではなく、クリックイベントハンドラーを 1 つだけ使用するのが最善だと思います。 質問:

1)イベントを発生させた固有のボタンを特定するにはどうすればよいですか? ResourceDictionary で情報を取得することしかできませんでした。残念ながら、uniqueID などのプロパティはありません。私はこれを行いました:

private void RibbonButton_Click(object sender, RoutedEventArgs e)
{
  // ((Microsoft.Windows.Controls.Ribbon.RibbonCommand)(((System.Windows.Controls.Button)(e.OriginalSource)).Command))
}

LabelTitle のような表示用のプロパティに基づいてマッピングを作成したくありません。

2) この WPF/C# を見つけました: TabControl 内で TabItems を参照するにはどうすればよいですか? これは、TabControl の Items コレクションを照会する方法を示しました。それは良い試みですか、それとももっと良い試みがありますか?

3)
表示する必要がある、RibbonCommand と TabPage + Controls の間のマッピングを作成するにはどうすればよいですか。もちろん、次のような辞書を使用できます

Dictionary<String, fooContainer>
// ...
public class fooContainer()
{
  public String TabHeaderString {get;set;}
 // other properties
}

それとも、私が今まで理解していなかったこれらの ResourceDictionaries を使用して、WPF がより良いアプローチを提示するのでしょうか。

4

1 に答える 1

2

を使用してタブを管理しているため、それぞれのプロパティを意味のある方法でCommand設定できると思います。これにより、達成する必要があるさまざまなアクションを区別することができます (つまり、既にわかっている場合は である可能性があります)。公開する必要があるタブの種類、またはそのようなタブを動的に作成できる場合のより複雑なオブジェクト)。CommandParameterButtonEnum

ちなみに、RibbonButton_Clickメソッドに渡される引数は type でなければならないため、メソッドのシグネチャは正しくないように見えますExecutedRoutedEventHandler。そうすることで、変数のプロパティを通じて、レベルでCommandParameter指定されたにアクセスできるようになります。変更するコードに従ってください。ButtonParameterargs

1.あなたCommandParameterRibbonButton

<r:RibbonButton Command="me:AppCommands.Protokoll" CommandParameter="TabKind.Sample1"/>
<r:RibbonButton Command="me:AppCommands.Protokoll" CommandParameter="TabKind.Sample2"/>

2.ハンドラーをExecuteイベントに変更し、適切な署名に一致させ、必要に応じてパラメーターを処理します。

private void RibbonButton_Click(object sender, ExecutedRoutedEventArgs e)
{
  TabKind kind = (TabKind)e.Parameter;
  switch (kind)
  {
       case TabKind.Sample1:
       {
           //Do something meaningful...
           break;
       }
       case TabKind.Sample2:
       {
           //Do something meaningful...
           break;
       }
  }
}

質問に直接答えるには:

1.ボタンのどのインスタンスが を発生させたかを知る必要はありません。Command適切な方法は、CommandParameter実行したいアクションの種類を識別するために a を使用することです (RibbonButtonは単に のホストでありCommand、私には意味がありません)アプリケーションのロジックを特定の UI 実装に合わせて設計するため)。

2.TacControl本当ににその子を照会する必要がある場合TabItemは、提供したリンクを使用することをお勧めします。

3.実行する必要があるアクションを特定したら、TabItem以前に作成したレジスターから必要なインスタンスを取得できます (つまり、適切な値をインスタンスDictionaryに関連付けるために使用できます)。別の可能な方法は、各でプロパティを使用し、適切な値に設定し、次のメソッドを使用して適切な値を取得することです (前のスニペットで定義された変数であることに注意してください)。EnumTabItemTagTabItemEnumTabItemkind

TabItem matchingItem = tab_main.Items.Cast<TabItem>()
                                     .Where(item => item.Tag == kind)
                                     .FirstOrDefault();
于 2010-07-29T08:05:25.540 に答える