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