2015-04-05 31 views
0

所以我有一個應用程序,我可以配置我想要的應用程序看起來像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; 
    } 

回答

-1

在您的情況最好的解決方案是使用的,而不是綁定就像這樣MultiBinding:

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

通過這種方式,您可以通過幾個對象進入轉換器。例如Path =「。」允許您傳遞任何控件或對象的實例。還要注意,不是IValueConverter,你必須實現MultiPinding的IMultiValueConverter。希望這對你有所幫助。

+0

我認爲這不符合我的需求,因爲轉換器在多個UC上使用,並且爲了使用該方法,我需要在綁定中傳遞UC才能訪問RegisterName方法。但是我會盡快探索這種方法並提供反饋意見。 – Ninglin 2015-04-06 15:52:45

相關問題