所以我有一個應用程序,我可以配置我想要的應用程序看起來像app.config的方式。該應用程序包含一個用戶控件,我稱之爲「標註」,用於調用下一個客戶。我想在下一個custumer屬性更改時爲此用戶控件的背景設置動畫。如何在ValueConverter上下文中註冊名稱?
我知道如何做到這一點,我唯一的問題是,我收到它在轉換器上的背景配置,並將它們轉換爲Solid,LinearGradient或RadialGradient Brush。爲了設置漸變停靠點的動畫效果,我需要註冊它們的名稱,並且我無法訪問Converter中的該方法。
如何在轉換器上實現這種效果?我如何能夠在其中註冊名稱?
以下是代碼中的相關部分:位於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 CornerRadius="30,0,0,30"
Margin="0,15,0,15"
BorderBrush="{Binding Border,
Converter={StaticResource StringToBrushConverter},
Mode=TwoWay,
PresentationTraceSources.TraceLevel=High}"
Background="{Binding Background,
Converter={StaticResource StringToGradientStopConverter},
Mode=TwoWay,
PresentationTraceSources.TraceLevel=High}"
BorderThickness="2"
Width="400"
Height="150">
<Border.Triggers>
</Border.Triggers>
<Border.BitmapEffect>
<DropShadowBitmapEffect Color="Black"
Direction="225"
ShadowDepth="6"
Opacity="0.5" />
</Border.BitmapEffect>
<!-- More User Control stuff in here -->
</Border>
而後臺轉換器配置成刷機:
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;
}
我認爲這不符合我的需求,因爲轉換器在多個UC上使用,並且爲了使用該方法,我需要在綁定中傳遞UC才能訪問RegisterName方法。但是我會盡快探索這種方法並提供反饋意見。 – Ninglin 2015-04-06 15:52:45