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 并且它在来自另一个资源时无法自动转换双精度值......

问题是似乎没有办法从 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来创建。GridLength使用GridLengthConverter

因此编译器中不会发生自动转换/转换——WPF 需要显式查找一个类并调用一个转换方法。在 的情况下StaticResource,它会跳过这一步。

不过,绑定确实使用类型转换器,因此以下内容将按您的预期工作:

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

这是有效的,因为GridLengthConverter知道如何从Double. 不过,就您而言,这不是必需的。如果您GridLength以与初始化相同的方式Double(在标签内)初始化资源,则将在分配资源之前调用字符串转换:

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

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

于 2013-09-05T13:15:13.623 回答
4

尝试这个:

    <Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        xmlns:t="clr-namespace:System.Windows;assembly=PresentationFramework">
    <Window.Resources>
        <t:GridLength x:Key="gridHeight">50</t:GridLength>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="{StaticResource gridHeight}"></RowDefinition>
        </Grid.RowDefinitions>
     ....
于 2013-09-05T13:03:00.867 回答
2

您必须创建类型的资源GridLength才能按RowDefinition.Height类型应用GridLength

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

无论您想应用它,这都会起作用。

于 2013-09-05T12:59:04.800 回答