26

私のWPFスタイルでは、次のようにいくつかの場所に適用したい標準のグリッド行の高さを定義しました:

<system:Double x:Key="TableRowHeight">22</system:Double>

ただし、次のように適用したい場合は機能しません。

<RowDefinition Height="{StaticResource TableRowHeight}"/>

代わりに、次のような完全なスタイルを作成する必要があります。

<Style x:Key="GridTableRow" TargetType="{x:Type RowDefinition}">
    <!--<Setter Property="Height" Value="{StaticResource TableRowHeight}"/>-->
    <Setter Property="Height" Value="22"/>
</Style>

コメントアウトされた行からわかるように、スタイル定義内の数値定数を参照しようとしても機能しませんが、「ハードコードされた」値は機能します。

今調べてみたところ、Height プロパティに関連付けられている型が GridLength であり、別のリソースから来るときに double 値を自動的にキャストできないためだと思います...

問題は、XAML から GridLength オブジェクトを作成する方法がないように見えることです。Value プロパティは読み取り専用です。したがって、次のようなものも機能しません。

<Style x:Key="GridTableRow" TargetType="{x:Type RowDefinition}">
    <Setter Property="Height">
        <Setter.Value>
            <GridLength Value="{StaticResource TableRowHeight}"/>
        </Setter.Value>
    </Setter>
</Style>

これを機能させる方法はありますか、それともその定数の使用を忘れて、定数の代わりにハードコードされた値で RowDefinition スタイルを使用する必要がありますか?

4

3 に答える 3

38

値を "ハード コード" すると、XAML プロセッサは文字列から必要な型に変換できるコンバーターを検索します。TableRowHeightリソースでさえDoubleConverterを使用して作成されています。GridLengthConverterGridLengthを使用します。

そのため、コンパイラで自動キャスト/変換が行われることはありません。WPF は明示的にクラスを検索し、convert メソッドを呼び出す必要があります。の場合はStaticResource、この手順をスキップします。

ただし、バインディングは型コンバーターを使用するため、次のようにすると期待どおりに動作します。

<RowDefinition Height="{Binding Source={StaticResource TableRowHeight}}" />

GridLengthConverterから変換する方法を知っているため、これは機能しDoubleます。あなたの場合、これは必要ありません。(タグ内で)GridLength初期化したのと同じ方法でリソースを初期化すると、リソースが割り当てられる前に文字列変換が呼び出されます。Double

<GridLength x:Key="TableRowHeight">22</GridLength>

その後、リソースを直接呼び出すことができます。

于 2013-09-05T13:15:13.623 に答える
2

GridLengthtypeをそのまま適用するにRowDefinition.Heightは、type のリソースを作成する必要がありGridLengthます。

<window:GridLength x:Key="TableRowHeight">50</window:GridLength>

これは、適用したい方法で機能します。

于 2013-09-05T12:59:04.800 に答える