1

カスタム コントロール (ContentControl を継承) の動的な背景ブラシを作成するには、これを行う必要があります。私のカスタム コントロールには、StartColor と EndColor の 2 つの依存関係プロパティがあります。カスタム コントロールのコントロール テンプレートでは、コントロールは、背景がRadialGradientBrushグラデーション ストップである境界線でラップされます。1 つのグラデーション ストップの色は StartColor にバインドされ、もう 1 つのグラデーション ストップの色は EndColor にバインドされます。これは XAML で動作していますが、VB コードに変換する必要があります。XAML のコントロール テンプレートの境界要素は、次のコードで実行されます。

<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コードでこれを達成する方法についてのアイデアはありますか?

4

2 に答える 2

1

MS によると、FrameworkElementFactory アプローチが推奨されなくなったことをご存知ですか? 推奨されるアプローチは、XamlReader.Parseを使用してコードで要素/リソースを作成することです。

于 2009-08-05T20:55:10.700 に答える
0

Border が Content になる親 ContentControl にアクセスする必要があります。そして、それを VB コードに設定します。

ここで ContentControl が意味するのは、どちらのコントロールが Border の親であるかに関係なく、OnApplyTemplate オーバーライド関数でそれにアクセスし、VB.NET で作成された境界線を子としてそのビジュアルに追加する必要があるということです。

于 2009-08-05T18:09:16.790 に答える