在IValueConverter中使用FindResource

时间:2017-11-01 20:20:48

标签: c# wpf

我有这个值转换器,它将数字转换为画笔颜色。我需要做的是将行return Brushes.Red;更改为return (Brush)FindResource("PrimaryHueMidBrush");,这样我就可以返回主题的颜色。问题是我不知道如何声明(Brush)FindResource("PrimaryHueMidBrush");。欢迎任何帮助。提前谢谢。

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    double.TryParse(value.ToString(), out double val);

    if (val == 1)
    {
        return Brushes.Red;
    }
    else if(val == 0.5)
    {
        return Brushes.MediumVioletRed;
    }
    else if(val==0)
    {
        return Brushes.Transparent;
    }
    else
    {
        return Brushes.Transparent;
    }
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
    throw new NotImplementedException();
}

2 个答案:

答案 0 :(得分:2)

不要在转换器中调用FindResource,而是最好为动态画笔添加一个或多个属性:

public class YourConverter : IValueConverter
{
    public Brush FirstBrush { get; set; }
    public Brush SecondBrush { get; set; }

    public object Convert(
        object value, Type targetType, object parameter, CultureInfo culture)
    {
        double val = (double)value;

        if (val >= 1)
        {
            return FirstBrush;
        }

        if (val >= 0.5)
        {
            return SecondBrush;
        }

        return Brushes.Transparent;
    }

    public object ConvertBack(
        object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

您可以在应用程序或窗口的资源中声明它,如下所示:

<local:YourConverter x:Key="YourConverter"
    FirstBrush="{StaticResource PrimaryHueMidBrush}"
    SecondBrush="MediumVioletRed"/>

答案 1 :(得分:0)

要访问FindResource,您需要FrameworkElement,因此最好的方法可能是使用MultiValueConverter代替并将使用转换器的元素作为第二个值传递。

转换器:

public class WhateverThisIsCalledConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        // Insert type- and sanity-checks here
        double val = (double)values[0];
        FrameworkElement callingElement = (FrameworkElement)values[1];

        if (val >= 1)
        {
            return callingElement.FindResource("PrimaryHueMidBrush");
        }
        if (val >= 0.5)
        {
            return Brushes.MediumVioletRed;
        }

        return Brushes.Transparent;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        return Enumerable.Repeat(DependencyProperty.UnsetValue, targetTypes.Length).ToArray();
    }
}

XAML中的用法:

<Window.Resources>
    <local:WhateverThisIsCalledConverter x:Key="Converter"/>
    <SolidColorBrush Color="Red" x:Key="PrimaryHueMidBrush"/>
</Window.Resources>
<Grid>
    <Grid.Background>
        <MultiBinding Converter="{StaticResource Converter}">
            <Binding Path="Value"/>
            <Binding RelativeSource="{RelativeSource Self}"/>
        </MultiBinding>
    </Grid.Background>
</Grid>

关于您当前实施的几点说明:

  • 尝试避免双打==,它们并非无限期。
  • 以前else中的return,您不需要所有这些if
  • 应实施ConvertBack方法(自由选择其他例外,Binding.DoNothingDependencyProperty.UnsetValue)。
  • 如果您知道自己的价值是双倍的,只需转换它。