如何在矩形的 Fill 属性 上使用 Multibinding.StringFormat?
how to use Multibinding.StringFormat on Fill property of a rectangle?
我创建了一个带有 dataTemplate 的 ItemControl,其中包含一个将根据 ItemsSource 着色的矩形。提供给我的应用程序的日期是一个不包含井号 (#) 的彩色十六进制代码。只是一个 6 个字符的字符串。为了让颜色正确显示,我需要用前面的 # 格式化 6 个字符的字符串。 exp #A31F34
这是XAML
<DataTemplate x:Key="ColorSequenceSwatchPreviews">
<Rectangle Name="ColorSwatch" Height="20" Width="120" RadiusX="3" RadiusY="3" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="0,3,0,3">
<Rectangle.Style>
<Style TargetType="{x:Type Rectangle}">
<Setter Property="Fill">
<Setter.Value>
<MultiBinding>
<MultiBinding.StringFormat><![CDATA[#{0}]]></MultiBinding.StringFormat>
<Binding Path="InnerXml" Mode="OneWay" />
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</Rectangle.Style>
</Rectangle>
我正在使用 MultiBinding.StringFormat 将字符串正确格式化为十六进制代码,但我很困惑为什么矩形的填充没有着色。
如果我使用 TextBox 进行 MultiBinding,然后将矩形的填充 属性 绑定到文本框的文本 属性,我就可以让矩形着色。但是,我更喜欢直接从矩形的填充 属性 绑定,就像在我的第一个示例中那样,因为它更干净。
<DataTemplate x:Key="ColorSequenceSwatchPreviews">
<StackPanel Orientation="Horizontal" Margin="0,3,0,3" VerticalAlignment="Center" HorizontalAlignment="Left">
<TextBox x:Name="Hexcode" Visibility="Collapsed">
<TextBox.Text>
<MultiBinding>
<MultiBinding.StringFormat><![CDATA[#{0}]]></MultiBinding.StringFormat>
<Binding Path="InnerXml" Mode="OneWay" />
</MultiBinding>
</TextBox.Text>
</TextBox>
<Rectangle Name="ColorSwatch" Height="20" Width="120" RadiusX="3" RadiusY="3" VerticalAlignment="Center" HorizontalAlignment="Left">
<Rectangle.Style>
<Style TargetType="{x:Type Rectangle}">
<Setter Property="Fill" Value="{Binding ElementName=Hexcode,Path=,Mode=OneWay}" />
</Style>
</Rectangle.Style>
</Rectangle>
</StackPanel>
有没有办法让第一个示例工作,或者我是否坚持使用第二个示例中的代码?
使用转换器可以更轻松地实现这一点。你甚至不需要 MultiBinding
。带有 Converter
的简单 Binding
应该可以做到:
这是转换器:
<ValueConversion(GetType(String), GetType(SolidColorBrush))>
Public Class HexToBrushConverter
Implements IValueConverter
Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.Convert
Return DirectCast(New BrushConverter().ConvertFrom("#" & value.ToString()), SolidColorBrush)
End Function
Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.ConvertBack
Return Nothing
End Function
End Class
您现在需要做的就是在资源部分创建一个转换器对象:
<local:HexToBrushConverter x:Key="HexToBrushConverter" />
(本地是您定义此转换器的项目的命名空间class)
然后在Fill
属性:
中使用
<Rectangle Fill="{Binding ElementName=Hexcode, Path=, Mode=OneWay, Converter={StaticResource HexToBrushConverter}}" />
我创建了一个带有 dataTemplate 的 ItemControl,其中包含一个将根据 ItemsSource 着色的矩形。提供给我的应用程序的日期是一个不包含井号 (#) 的彩色十六进制代码。只是一个 6 个字符的字符串。为了让颜色正确显示,我需要用前面的 # 格式化 6 个字符的字符串。 exp #A31F34
这是XAML
<DataTemplate x:Key="ColorSequenceSwatchPreviews">
<Rectangle Name="ColorSwatch" Height="20" Width="120" RadiusX="3" RadiusY="3" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="0,3,0,3">
<Rectangle.Style>
<Style TargetType="{x:Type Rectangle}">
<Setter Property="Fill">
<Setter.Value>
<MultiBinding>
<MultiBinding.StringFormat><![CDATA[#{0}]]></MultiBinding.StringFormat>
<Binding Path="InnerXml" Mode="OneWay" />
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</Rectangle.Style>
</Rectangle>
我正在使用 MultiBinding.StringFormat 将字符串正确格式化为十六进制代码,但我很困惑为什么矩形的填充没有着色。
如果我使用 TextBox 进行 MultiBinding,然后将矩形的填充 属性 绑定到文本框的文本 属性,我就可以让矩形着色。但是,我更喜欢直接从矩形的填充 属性 绑定,就像在我的第一个示例中那样,因为它更干净。
<DataTemplate x:Key="ColorSequenceSwatchPreviews">
<StackPanel Orientation="Horizontal" Margin="0,3,0,3" VerticalAlignment="Center" HorizontalAlignment="Left">
<TextBox x:Name="Hexcode" Visibility="Collapsed">
<TextBox.Text>
<MultiBinding>
<MultiBinding.StringFormat><![CDATA[#{0}]]></MultiBinding.StringFormat>
<Binding Path="InnerXml" Mode="OneWay" />
</MultiBinding>
</TextBox.Text>
</TextBox>
<Rectangle Name="ColorSwatch" Height="20" Width="120" RadiusX="3" RadiusY="3" VerticalAlignment="Center" HorizontalAlignment="Left">
<Rectangle.Style>
<Style TargetType="{x:Type Rectangle}">
<Setter Property="Fill" Value="{Binding ElementName=Hexcode,Path=,Mode=OneWay}" />
</Style>
</Rectangle.Style>
</Rectangle>
</StackPanel>
有没有办法让第一个示例工作,或者我是否坚持使用第二个示例中的代码?
使用转换器可以更轻松地实现这一点。你甚至不需要 MultiBinding
。带有 Converter
的简单 Binding
应该可以做到:
这是转换器:
<ValueConversion(GetType(String), GetType(SolidColorBrush))>
Public Class HexToBrushConverter
Implements IValueConverter
Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.Convert
Return DirectCast(New BrushConverter().ConvertFrom("#" & value.ToString()), SolidColorBrush)
End Function
Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.ConvertBack
Return Nothing
End Function
End Class
您现在需要做的就是在资源部分创建一个转换器对象:
<local:HexToBrushConverter x:Key="HexToBrushConverter" />
(本地是您定义此转换器的项目的命名空间class)
然后在Fill
属性:
<Rectangle Fill="{Binding ElementName=Hexcode, Path=, Mode=OneWay, Converter={StaticResource HexToBrushConverter}}" />