从StaticResource设置RowDefinition高度

bja*_*vor 21 c# wpf

在我的WPF样式中,我已经定义了一个标准网格行高度,我想应用于几个地方,如下所示:

<system:Double x:Key="TableRowHeight">22</system:Double>
Run Code Online (Sandbox Code Playgroud)

但是,当我想这样应用时,它不起作用:

<RowDefinition Height="{StaticResource TableRowHeight}"/>
Run Code Online (Sandbox Code Playgroud)

相反,我需要创建一个完整的风格,如:

<Style x:Key="GridTableRow" TargetType="{x:Type RowDefinition}">
    <!--<Setter Property="Height" Value="{StaticResource TableRowHeight}"/>-->
    <Setter Property="Height" Value="22"/>
</Style>
Run Code Online (Sandbox Code Playgroud)

从注释掉的行中可以看出,尝试引用Style定义中的数字常量也不起作用,但"硬编码"值也可以.

现在我查了一下,我想这是因为与Height属性相关联的类型是GridLength,并且它在某种程度上无法在从另一个资源传入时自动转换double值...

问题是似乎没有办法从XAML创建GridLength对象.价值属于只读.所以像这样的东西也不起作用:

<Style x:Key="GridTableRow" TargetType="{x:Type RowDefinition}">
    <Setter Property="Height">
        <Setter.Value>
            <GridLength Value="{StaticResource TableRowHeight}"/>
        </Setter.Value>
    </Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)

有没有办法让它工作,或者我应该忘记使用该常量,只使用带有硬编码值的RowDefinition样式代替常量?

nmc*_*ean 31

当您"硬编码"值时,XAML处理器会查找可以将其从字符串转换为必要类型的转换器.甚至您的TableRowHeight资源也在使用DoubleConverter进行创建.GridLength使用GridLengthConverter.

因此编译器中没有自动转换/转换 - WPF需要显式查找类并调用convert方法.在这种情况下StaticResource,它跳过这一步.

绑定确实使用类型转换器,因此以下方法可以按预期工作:

<RowDefinition Height="{Binding Source={StaticResource TableRowHeight}}" />
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为GridLengthConverter知道如何转换Double.但是,在您的情况下,这不应该是必要的.如果GridLength以初始化Double(在标记内)的方式初始化资源,则在分配资源之前将调用字符串转换:

<GridLength x:Key="TableRowHeight">22</GridLength>
Run Code Online (Sandbox Code Playgroud)

然后你就可以直接调用资源了.