0

わかりました... これは一種の 2 部構成です。(ちょっと。実際にはただの 1 つかもしれません。とにかく、それが私が望んでいることです。)

まず、より一般的には、XAML のみを介して、コントロールのテンプレート内の名前付き項目をターゲットにすることは可能ですか? たとえば、コントロールのテンプレートに 'PART_Foo' という名前の ContentPresenter があり、その特定の項目の Horizo​​ntalAlignment を純粋なスタイリングによって 'Stretch' に具体的に設定したい場合、それは可能ですか? 名前でコントロールを明示的に検索し、コードでプロパティを設定するサブクラスの OnApplyTemplate オーバーライドでこれを実行できることはわかっていますが、スタイリングによって厳密にこれを実行できるように、XAML のみのソリューションを望んでいます。サブクラスではなく、特定のユースケースのシナリオを除いて、とにかくほとんど推奨されていません。

また、コントロールのテンプレートを手動で指定する必要はありません。現在のテーマによってそのテンプレートが何であるか、つまりコントロールがどのように表示されるかを決定する必要があるからです。「テーマが選択したテンプレートに「foo」という名前のパーツがある場合は、純粋なスタイリングを介してこのプロパティを設定します。その名前のパーツが見つからない場合は、何もしないでください。

XAML のみのアプローチが望まれるのは、コントロール自体ではなく、生成されたコンテナー オブジェクトをターゲットにしているという 2 番目の部分のためです。特にItemsControlが仮想化されている場合、これはa$$の本当の苦痛です。

詳細については、最終的な目標は、TreeView の TreeViewItem のテンプレートで「Bd」という名前の Border を選び出し、その添付プロパティ「Grid.ColumnSpan」をデフォルトの「1」ではなく「2」に設定することです。それでおしまい!TreeViewItem のテンプレート全体を手動で置き換えたり、コード ビハインド ベースのソリューションに頼ったりしなければ、これほど単純なことはほぼ不可能に思えることに驚かされます。

4

1 に答える 1

0

いいえ、これは XAML のみを使用して行うことはできません。少なくとも、これには添付プロパティを記述する必要があります (XAML で使用できます)。仮想化されたリストで発生するように、実行時にオンザフライで作成されるコントロールがない場合にのみ機能します。次のようになります c:TemplateHelper.ReplaceStretchForTemplateItemName="PART_Foo"変更されたハンドラーでは、 VisualTreeHelperを使用してそのコントロールのビジュアル サブツリーをたどり、その名前を探して、必要なものを適用します。

このようにテンプレートを変更することは非常に困難であり、悪い習慣と見なされます。「Part_Foo」を持たない、または「Part_Foo」があなたが期待していたものとはまったく異なるものであるというテーマが存在するか、将来的に存在する可能性が非常に高いです。テーマ、つまり ControlTemplates は変更される可能性があります。Microsoft がオペレーティング システムを更新すると、新しいテーマが表示されます (そしてアプリケーションに自動的に適用されます)。カスタム テーマをサポートしている場合、デザイナーは別のテーマを思いつくかもしれません。

これは ControlTemplates の欠点であり、ある程度まではそうであると主張できます。しかし、もう一度 Windows フォーム (またはこの惑星上の他の UI フレームワーク) でコントロールをカスタマイズしてみてください... WPF の非常に優れた機能に慣れると、制限を受け入れるのが難しくなります。この場合は設計によるものです。

于 2010-09-30T05:53:24.377 に答える