0

カスタムの「ウィザード」コントロールを作成したいと考えています。

そこで、Selector から "Wizard" を派生させ、HeaderedContentControl から派生した "WizardPage" を作成しました。「WizardPages」を「Wizard」のコンテンツ自体に直接追加すると、すべて正常に動作します。

コード内:これは機能します

<ctrl:Wizard>
    <ctrl:WizardPage Header="Page 1" Content="Some Stuff" />
</ctrl:Wizard>

それから私は考えました:ねえ、ウィザードのコンテンツにランダムなものを入れて、必要に応じて、ListBoxItems を使用した ListBox のように、その周りにラッパーを作成できれば素晴らしいと思います (WizardPage にはプロパティが必要なので、ラッパーは間違いなく必要です)。 "CanLeavePage" および "AlreadyVisited")。

コード内:これが機能することを望みます(グループは何でもリストであり、WizardPageのどこかにテンプレート化できます)

<ctrl:Wizard ItemsSource="{Binding Groups}" />

だから私は試しました:

protected override bool IsItemItsOwnContainerOverride(object item)
{
    return item is WizardPage;
}

protected override DependencyObject GetContainerForItemOverride()
{
    return new WizardPage();
}

これら 2 つのメソッドにブレークポイントを設定すると、IsItemItsOwnContainer が呼び出されることがわかりますが、GetContainerForItemOverride は呼び出されません。

ここで何が欠けていますか?

コンセプトは次のようになります。

セットアップウィザード

4

1 に答える 1

1

あなたのコードをチェックした後、それが機能しない理由は明らかです。Wizard クラスは Selector であるため、ItemsControl ですが、ウィザード コントロール テンプレートでは ItemsControl のものを使用せず、テンプレート内では ItemsControl 自体である ListBox を使用し、そこでウィザードの ItemsSource をリストボックスのItemsSource。したがって、ListBox では、ListBoxItems を生成するために呼び出される ItemContainerGenerator が呼び出されます。これは、事実上リスト ボックスがすべての作業を行い、ウィザードは ItemsSource プロパティの再ルーティング以外は何もしないためです。

ウィザード テンプレートを機能させるには、大幅に変更する必要があります。ところで。ListBox から Wizard クラスを簡単に派生させることができます。

于 2013-03-18T15:12:39.513 に答える