在我的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>
从注释掉的行中可以看出,尝试引用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>
有没有办法让它工作,或者我应该忘记使用该常量并只使用带有硬编码值的RowDefinition样式代替常量?
答案 0 :(得分:27)
当您“硬编码”值时,XAML处理器会查找可以将其从字符串转换为必要类型的转换器。甚至您的TableRowHeight
资源也在使用DoubleConverter创建。 GridLength
使用GridLengthConverter。
因此编译器中没有自动转换/转换 - WPF需要显式查找类并调用convert方法。在StaticResource
的情况下,它会跳过此步骤。
绑定确实使用了类型转换器,因此以下将按预期工作:
<RowDefinition Height="{Binding Source={StaticResource TableRowHeight}}" />
这可行,因为GridLengthConverter
知道如何从Double
转换。但是,在您的情况下,这不应该是必要的。如果以初始化GridLength
(在标记内)的方式初始化Double
资源,则在分配资源之前将调用字符串转换:
<GridLength x:Key="TableRowHeight">22</GridLength>
然后你就可以直接调用资源了。
答案 1 :(得分:3)
试试这个:
<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>
....
答案 2 :(得分:2)
您必须创建GridLength
类型的资源才能申请RowDefinition.Height
类型GridLength
:
<window:GridLength x:Key="TableRowHeight">50</window:GridLength>
无论如何,这都适用于您想要应用它。