2009-08-05 66 views
1

我需要这样做才能为自定义控件创建动态背景画笔(继承ContentControl)。我的自定义控件有两个依赖属性:StartColor和EndColor。在自定义控件的控件模板中,控件包装在背景为具有渐变停止的RadialGradientBrush的边框中。一个渐变色的颜色被绑定到StartColor,另一个被绑定到EndColor。我在XAML中有这样的工作,但我需要将它转换为VB代码。在XAML控件模板的边框元素与下面的代码完成:WPF:如何绑定位于vb代码的controlTemplate中的gradientstop的颜色属性?

<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> 

我试着按照以下步骤创建在VB代码的边界,但它没有工作:

... 
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) 
... 



有关如何在VB代码中完成此操作的任何想法?

回答

1

您是否知道FrameworkElementFactory方法不再被推荐,根据MS?推荐的方法是用代码XamlReader.Parse创建任何元素/资源。

+0

起初,这不起作用,因为我在xaml中包含了我当前的项目命名空间,而没有指定它在哪个组件。一旦我改变了它,一切都很好,这比旧的方法要容易得多。 – Robin 2009-08-06 16:12:16

0

您必须访问边框应作为内容的Parent ContentControl。并将其设置在您的VB代码中。

我的意思是ContentControl在这里是无论哪个控件都是边框的父项,您需要访问OnApplyTemplate覆盖函数,并将VB.NET创建的边框添加为该视觉的子项。

+0

谢谢你的回应。 该控件是一个自定义控件(继承ContentControl)。我实际上在XAML中有这个工作。 XAML提供的工作正常。我的问题是我需要将此XAML转换为VB代码。 我编辑了这个问题来澄清这一点。 – Robin 2009-08-05 19:17:48

+0

我认为你需要在border上面提供更多的XAML代码 – 2009-08-05 19:58:36

+0

上面的XAML样式被设置为我的自定义控件的默认样式。 – Robin 2009-08-05 20:25:15

相关问题