21

CheckBoxいくつかの特別な操作の制御をオーバーライドしたWPFプロジェクトに取り組んでいます。それは正しく機能しています。

私の問題はControlTemplate、テーマ(codeplexのshinyred.xaml)から適用されたものが、オーバーライドされたコントロールに適用されないことです。CheckBox ControlTemplate新しいコントロールで使用するためにを継承する方法はありますか?

私が見つけることができるすべてのサンプルは、のスタイルを継承することに焦点を当てていますが、CheckBoxについては何もありませんControlTemplate

4

2 に答える 2

22

いいえ、あなたが言ったように、プロパティを使用してスタイルを「継承」することは可能ですがBasedOn、テンプレートを直接「継承」することはできません。これは理解できますが、テンプレート継承のセマンティクスは何でしょうか?派生テンプレートは、ベーステンプレートの要素をどのように追加または変更できますか?

Settersスタイルを使用すると、、などを簡単に追加できるため、完全に可能ですTriggers。テンプレートの継承で考えられる唯一のことはTriggers、ベーステンプレートに追加することです。ただし、その場合は、ベーステンプレートの要素名を熟知している必要があり、ベーステンプレートの要素名を変更すると、派生したものが破損する可能性があります。読みやすさの問題は言うまでもなく、派生テンプレートで名前を参照します。これは、完全に別の場所で定義されています。

遅ればせながら追加それをすべて言っても、あなたの特定の問題を解決することは可能です(私は今のところそれがまだあなたのものであるか、あるいは問題でさえあるとは思えませんが)。Templateこのように、プロパティのセッターを使用してコントロールのスタイルを定義するだけです。

<Style TargetType="<your type>">
    <Setter Property="Template" Value="{StaticResource <existing template resource name>}"/>
</Style>
于 2010-01-09T19:10:17.773 に答える
2

@Aviadが言ったことを念頭に置いて、以下は回避策です。

Buttonihneritするテンプレートを定義するがあり、次のCustomButtonようにカスタムコントロールとして定義するとします。

public class CustomButton : Button
{

    static CustomButton()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomButton), new FrameworkPropertyMetadata(typeof(CustomButton)));
    }


    public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text",
        typeof(string),  typeof(CustomButton), new UIPropertyMetadata(null));

    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }
}

次に、Generic.xamlに移動し、以下を定義します。

 <Style
    x:Key="CustomButtonStyle" TargetType="{x:Type local:CustomButton}">
    <Setter Property="FontSize" Value="18" /> <!--Override the font size -->
    <Setter Property="FontWeight" Value="Bold" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CustomButton}">
                <Button Style="{StaticResource ButtonStyleBase}" 
                    Height="{TemplateBinding Height}" 
                        Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:CustomButton}}, Path=Command}"
                        CommandParameter="{Binding}"
                        Width="{TemplateBinding Width}">
                    <Grid>
                        <StackPanel>
                            <Image Source="Image/icon.jpg" />
                            <TextBlock Text="{TemplateBinding Text}"></TextBlock>
                        </StackPanel>
                    </Grid>
                </Button>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

テンプレートを継承するボタンは新しいテンプレート内にラップされており、スタイルは既存のボタンに設定されていることに注意してください。チェックボックスを同じように操作し、チェックボックスとラベルを、たとえばCustomCheckBoxの新しいControlTemplate内で垂直方向に整理します。

于 2020-05-03T02:38:55.690 に答える