2009-08-05 7 views
1

カスタムコントロール用の動的背景ブラシを作成するには、これを行う必要があります(ContentControlを継承します)。私のカスタムコントロールには、StartColorとEndColorの2つの依存プロパティがあります。カスタムコントロールのコントロールテンプレートでは、コントロールはグラデーションの停止を伴うRadialGradientBrushの背景の枠内にラップされます。 1つの勾配絞りの色はStartColorにバインドされ、もう1つの色はEndColorにバインドされます。私はXAMLでこの作業をしていますが、VBコードに変換する必要があります。私は次のようにVBのコードでは境界線を作成しようとしましたが、それはうまくいきませんでしたWPF:vbコード内のcontrolTemplateにあるグラデーション停止のcolorプロパティをバインドするにはどうすればよいですか?

<Style x:Key="{x:Type wpf:MyControl}" 
    TargetType="{x:Type wpf:MyControl}" 
    BasedOn="{StaticResource {x:Type ContentControl}}"> 
    <Style.Setters> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type wpf:MyControl}"> 

         ... 

        <Border HorizontalAlignment="Stretch" 
          x:Name="background" Width="Auto" 
          Grid.RowSpan="3" 
          Opacity="0.9" 
          CornerRadius="{TemplateBinding CornerRadius}"> 
           <Border.Background> 
            <Custom:RadialGradientBrush> 
             <Custom:GradientStop Color="{Binding Path=EndColor, 
                  RelativeSource={RelativeSource TemplatedParent}, 
                  Mode=OneWay}" 
                  Offset="0.462"/> 
             <Custom:GradientStop Color="{Binding StartColor, 
                  RelativeSource={RelativeSource TemplatedParent}, 
                  Mode=OneWay}" 
                  Offset="1"/> 
            </Custom:RadialGradientBrush> 
           </Border.Background> 
          </Border> 

         ... 

       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style.Setters> 
</Style> 

... 
Dim backgroundBorder As New FrameworkElementFactory(GetType(Border)) 
     With backgroundBorder 
      .Name = "background" 
      .SetValue(Grid.RowSpanProperty, 3) 
      .SetValue(Grid.OpacityProperty, 0.9) 
      .SetBinding(Border.CornerRadiusProperty, New Binding("CornerRadius") With {.RelativeSource = New RelativeSource(RelativeSourceMode.TemplatedParent)}) 
     End With 

     Dim backgroundBrush As New RadialGradientBrush() 

     Dim startColorGradientStop As New GradientStop() 
     startColorGradientStop.Offset = 1.0 
     BindingOperations.SetBinding(startColorGradientStop, GradientStop.ColorProperty, New Binding("StartColor") With {.RelativeSource = New RelativeSource(RelativeSourceMode.TemplatedParent), .Mode = BindingMode.OneWay}) 
     backgroundBrush.GradientStops.Add(startColorGradientStop) 

     Dim endColorGradientStop As New GradientStop() 
     endColorGradientStop.Offset = 0.462 
     BindingOperations.SetBinding(endColorGradientStop, GradientStop.ColorProperty, New Binding("EndColor") With {.RelativeSource = New RelativeSource(RelativeSourceMode.TemplatedParent), .Mode = BindingMode.OneWay}) 
     backgroundBrush.GradientStops.Add(endColorGradientStop) 

backgroundBorder.SetValue(Border.BackgroundProperty, backgroundBrush) 
... 


XAMLでコントロールテンプレートの境界要素は、次のコードで行われます
私はこれをVBコードでどのように達成することができますか?

答えて

1

MSによると、FrameworkElementFactoryアプローチはもう推奨されません。推奨されるアプローチは、XamlReader.Parseでコード内の任意の要素/リソースを作成することです。

+0

最初にこれは動作しませんでした。なぜなら、現在のプロジェクト名前空間をxamlに含めていたのですが、どのアセンブリを指定していなくても、これを変更してしまえば、すべてうまくいきました。 – Robin

0

境界線がコンテンツでなければならない親ContentControlにアクセスする必要があります。 VBコードでそれを設定します。

ここで私がContentControlで意味していたのは、ボーダーの親コントロールで、OnApplyTemplateオーバーライド関数でそのコントロールにアクセスし、VB.NETで作成したボーダーをそのビジュアルに子として追加する必要があります。

+0

ありがとうございます。 コントロールはカスタムコントロール(Inherits ContentControl)です。私は実際にXAMLでこれを動作させています。 XAMLは正しく動作します。私の問題は、このXAMLをVBコードに変換する必要があることです。 これを明確にするために質問を編集しました。 – Robin

+0

私はあなたがボーダーの上にもう少しXAMLサイドコードを提供する必要があると思う。 –

+0

上記のXAMLスタイルは、私のカスタムコントロールのデフォルトスタイルとして設定されています。 – Robin

関連する問題