C# 如何在ValueConverter上下文中注册名称?

C# 如何在ValueConverter上下文中注册名称?,c#,wpf,storyboard,C#,Wpf,Storyboard,因此,我有一个应用程序,我可以在app.config中配置我想要的应用程序外观。该应用程序包含一个我称之为“Callout”的用户控件,用于调用下一个custumer。我想在下一个custumer属性更改时设置此usercontrol背景的动画 我知道如何做到这一点,我唯一的问题是,我在转换器上接收它的背景配置,并将它们转换为实心、线性梯度或径向梯度笔刷。为了使渐变停止动画化,我需要注册它们的名称,而我在转换器中没有访问该方法的权限 如何在转换器上实现此效果?我怎样才能在里面注册名字 以下是相关

因此,我有一个应用程序,我可以在app.config中配置我想要的应用程序外观。该应用程序包含一个我称之为“Callout”的用户控件,用于调用下一个custumer。我想在下一个custumer属性更改时设置此usercontrol背景的动画

我知道如何做到这一点,我唯一的问题是,我在转换器上接收它的背景配置,并将它们转换为实心、线性梯度或径向梯度笔刷。为了使渐变停止动画化,我需要注册它们的名称,而我在转换器中没有访问该方法的权限

如何在转换器上实现此效果?我怎样才能在里面注册名字

以下是相关代码:

位于app.config中的configSection的一部分:

<callout key="PacientCallout"
           title="Paciente" 
           placeholder="N/D"
           border="#FFFFC20E">
    <titleFont family="/Clinical.Resources;Component/Fonts/#Dax-Regular"
               size="40"
               isCustom="true">
      <colors type="Solid">
        <color key="TitleColor" code="White" />
      </colors>
    </titleFont>
    <textFont family="/Clinical.Resources;Component/Fonts/#Dax-Regular"
               size="30"
               isCustom="true">
      <colors type="Solid">
        <color key="TextColor" code="White" />
      </colors>
    </textFont>
    <!--Possible values for type are Solid, LinearGradient or RadialGradient--> 
    <background type="LinearGradient">
        <color key="StarBlue" code="#FF2A398C" />
        <color key="EndBlue" code="#FF0D174F" />
    </background>
  </callout>

在您的情况下,最好的解决方案是使用多重绑定,而不是像这样使用绑定:

   <Border.BorderBrush>
            <MultiBinding Converter="Converter={StaticResource StringToBrushConverter}">
                <MultiBinding.Bindings>
                    <Binding PresentationTraceSources.TraceLevel="High"/>
                    <Binding Path="." ElementName="border" />
                </MultiBinding.Bindings>
            </MultiBinding>
        </Border.BorderBrush>


通过这种方式,您可以将多个对象传递到转换器中。例如Path=“”允许您传递任何控件或对象的实例。还请注意,您必须为多重绑定实现IMultiValueConverter,而不是IValueConverter。希望这对您有所帮助。

我认为这不适合我的需要,因为转换器用于多个UC,要使用这种方法,我需要在绑定中传递UC,以便访问RegisterName方法。但我会探索这种方法,并在尝试后立即提供反馈。
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if ((bool)(DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue))
            return null;

        var gradient = value as Clinical.Core.Configuration.ColorCollection;
        double offset = 0;
        Brush brush;
        switch (gradient.Type)
        {
            case BackgroundType.Solid:
                brush = (SolidColorBrush)new BrushConverter().ConvertFrom(gradient[0].Code);
                break;
            case BackgroundType.LinearGradient:
                LinearGradientBrush linearGradient = new LinearGradientBrush();
                linearGradient.StartPoint = new Point(0.5, 0);
                linearGradient.EndPoint = new Point(0.5, 1);
                linearGradient.MappingMode = BrushMappingMode.RelativeToBoundingBox;

                foreach (Clinical.Core.Configuration.ColorElement color in gradient)
                {
                    var colorCode = (Color)ColorConverter.ConvertFromString(color.Code);
                    var gradientStop = new GradientStop(colorCode, offset);
                    linearGradient.GradientStops.Add(gradientStop);
                    offset += 1d / ((double)gradient.Count-1);
                }
                brush = linearGradient;
                break;
            case BackgroundType.RadialGradient:
                RadialGradientBrush radialGradient = new RadialGradientBrush();
                radialGradient.GradientOrigin = new Point(0.75,0.15);
                radialGradient.MappingMode = BrushMappingMode.RelativeToBoundingBox;
                foreach (Clinical.Core.Configuration.ColorElement color in gradient)
                {
                    var colorCode = (Color)ColorConverter.ConvertFromString(color.Code);
                    var gradientStop = new GradientStop(colorCode, offset);
                    radialGradient.GradientStops.Add(gradientStop);
                    offset += 1d / ((double)gradient.Count-1);
                }
                brush = radialGradient;
                break;
            default:
                brush = null;
                break;
        }

        return brush;
    }
   <Border.BorderBrush>
            <MultiBinding Converter="Converter={StaticResource StringToBrushConverter}">
                <MultiBinding.Bindings>
                    <Binding PresentationTraceSources.TraceLevel="High"/>
                    <Binding Path="." ElementName="border" />
                </MultiBinding.Bindings>
            </MultiBinding>
        </Border.BorderBrush>