【问题标题】:how to use Multibinding.StringFormat on Fill property of a rectangle?如何在矩形的 Fill 属性上使用 Multibinding.StringFormat?
【发布时间】:2016-04-27 16:14:20
【问题描述】:

我创建了一个带有 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 将字符串正确格式化为 Hexcode,但我很难理解为什么矩形的填充没有着色。

如果我使用 TextBox 进行 MultiBinding,则可以让矩形着色,然后将矩形的填充属性绑定到文本框的 Text 属性。但是,我更喜欢直接从矩形的填充属性绑定,就像在我的第一个示例中一样,因为它更干净。

<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>

有没有办法让第一个示例工作,还是我坚持使用第二个示例中的代码?

【问题讨论】:

    标签: xaml multibinding


    【解决方案1】:

    使用转换器可以更轻松地实现这一点。你甚至不需要MultiBinding。简单的BindingConverter 应该可以做到:

    这是转换器:

    <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" />
    

    (local 是您定义此转换器类的项目的命名空间)

    然后在Fill属性中使用:

    <Rectangle Fill="{Binding ElementName=Hexcode, Path=, Mode=OneWay, Converter={StaticResource HexToBrushConverter}}" />
    

    【讨论】:

    • 希望得到一些不涉及任何代码的东西。不过我确实喜欢这个解决方案!
    猜你喜欢
    • 1970-01-01
    • 2021-05-30
    • 2018-02-11
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2022-08-06
    • 1970-01-01
    • 2020-09-29
    相关资源
    最近更新 更多