私の LOB アプリでは、通常、ユーザーがデータを入力するためのさまざまなテキストブロックとテキスト ボックスを含むコンテナーを作成します。通常、各コントロールに特定のマージンまたは垂直/水平の配置を適用する必要があります。
フォームに次のようなグリッドがあるとします (簡潔にするために、多くのマークアップは省略されています)。
<Grid>
<Grid.ColumnDefinitions.../>
<Grid.RowDefinitions.../>
<TextBlock Text="MyLabel" />
<TextBox Text={Binding ...}/>
.
'
<!-- Repated a bunch more times along with all of the Grid.Row, Grid.Column definitions -->
</Grid>
ここで、グリッドに含まれるすべてのアイテムが Margin="3,1" VerticalContentAlignment="Left" VerticalAlignment="Center" を持つ必要があるとしましょう。これを実現するには、いくつかの方法があります。
- 各コントロールでプロパティを直接設定します-BAD!! スタイルのスキニングや集中化は許可されません。
- x:Key="MyStyleName" で Style を作成し、そのスタイルを各コントロールに適用します。ベター...スタイルの集中化とスキニングをより管理しやすくしますが、それでも大量のマークアップが必要であり、扱いにくくなる可能性があります。
- グローバル スタイルを作成します (つまり、x:Key を指定して TargetType={x:Type TextBox/TextBlock} を設定しないでください) - BAD!! これの問題は、明示的にオーバーライドしないアプリ内のすべてのコントロールに影響することです。これは、テキストブロックとテキストボックスを使用するメニュー、グリッド、およびその他のコントロールのようなものには不適切な場合があります。
- グリッドを対象とするスタイルを作成し、依存プロパティの値を Not bad のように明示的に設定します
<Setter Property="Frameworkelement.Margin" Value="3,1" />
...スタイルをコンテンツ内のすべての要素に正しく適用しますが、グリッド自体にも直接適用します...私が望むものではありません。
では、どのようなアプローチを採用し、その理由は何ですか? 何が一番効果的ですか?