3

私はWPFを初めて使用しますが、これを正しく実行しているかどうかについてはまだ少し不確かなため、実行しようとしていることの解決策を見つけるのに苦労しています。

ボタンに次のスタイルを定義しています

<Style x:Key="ToolBarButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="Margin" Value="5" />
    <Setter Property="BorderBrush" Value="White" />
    <Setter Property="Background" Value="{DynamicResource CompanyBlue}" />
    <Setter Property="Foreground" Value="White" />
    <Setter Property="FontWeight" Value="Bold" />
    <Setter Property="FontSize" Value="20" />
    <Setter Property="Width" Value="100" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">               
                <Border x:Name="ButtonBorder" BorderThickness="5" CornerRadius="5"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        Background="{TemplateBinding Background}"
                        Width="{TemplateBinding Width}">
                    <ContentPresenter Margin="10" HorizontalAlignment="Center" VerticalAlignment="Center" />
                </Border>


            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Button.Background">
                <Setter.Value>
                    <LinearGradientBrush StartPoint="0,-0.2" EndPoint="0,1.2">
                        <LinearGradientBrush.GradientStops>
                            <GradientStop Color="White" Offset="0" />
                            <GradientStop Color="{ORIGINAL-COLOR}" Offset="0.5" />
                            <GradientStop Color="White" Offset="1" />
                        </LinearGradientBrush.GradientStops>
                    </LinearGradientBrush>
                </Setter.Value>
            </Setter>
        </Trigger>
    </Style.Triggers>
</Style>

プレースホルダーを配置したXAMLでは、基本的に、これをスタイルのコントロールテンプレートに{ORIGINAL-COLOR}以前に設定された値として使用する必要があります。{TemplateBinding Background}

使用すべき提案を見てきまし{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background}たが、これは機能していません。

助けてくれてありがとう。

4

3 に答える 3

2

問題は、それLinearGradientBrushFrameworkElementレイアウトツリーに属していないことだと思います。プロパティのみFrameworkElementsDataContextあり、結果としてバインディングを利用できます。あなたがやろうとしていることは、を設定することBindingですGradientStop

トリガーは次のようになります。

            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Button.Background" 
                        Value="{TemplateBinding Background, Converter={StaticResource myConverter}}">
                </Setter>
            </Trigger>

Andは、Backgroundの値を取得し、入力ブラシから作成された完全なインスタンスmyConverterを返すカスタムコンバータークラスです。LinearGradientBrushコンバーターの書き方を知っていると思います。リソースに追加する必要があることを忘れないでください。

多かれ少なかれこのようなもの:

    class BrushToGradient : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var brush = (Brush)value;
        var gradient = new LinearGradientBrush();

        //Make it manually
        gradient.GradientStops.Add(...);
        //...
        return gradient;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
于 2013-03-03T16:06:02.440 に答える
0

の戻り型はisであり、notであるため、プロパティでバインドすることはできColorません。BackgroundBackgroundBrushColor

のColorプロパティでバインドしますBrush。バックグラウンドはリソースCompanyBlueにバインドされているため、トリガーでもそのバインドを使用します-

<GradientStop Color="{Binding Color, Source={StaticResource CompanyBlue}}"
              Offset="0.5" />
于 2013-03-03T15:25:19.127 に答える
0

このようにしてみてください

<GradientStop Color="White" Offset="0" />
<GradientStop Color="{DynamicResource CompanyBlue}"  Offset="0.5" />
<GradientStop Color="White" Offset="1" />

これがお役に立てば幸いです。

于 2013-03-03T15:59:21.293 に答える