5

ここに私の問題を説明するための簡単なカスタム コントロールがあります

public sealed class TestControl : Control
{
    public static DependencyProperty TestColorProperty = DependencyProperty.Register("TestColor", typeof(Brush), typeof(TestControl), new PropertyMetadata(new SolidColorBrush(Colors.Blue)));

    public Brush TestColor
    {
        get { return (Brush)GetValue(TestColorProperty); }
        set { SetValue(TestColorProperty, value); }
    }

    public TestControl()
    {
        this.DefaultStyleKey = typeof(TestControl);
    }
}

ご覧のとおり、Brush依存関係プロパティが 1 つあり、既定値はBlue(PropertyMetaData上記のように に設定されています。

これが私のコントロールのXAMLですGeneric.xaml

<Style TargetType="local:TestControl">
        <Setter Property="TestColor" Value="Red" />
        <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:TestControl">
                <Border
                    Background="{TemplateBinding TestColor}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}">
                        <TextBlock Text="TEST"  />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

ご覧のとおりTestColor、setter で Brush 依存関係プロパティを Red にStyle設定し、PropertyMetaData で宣言されている Blue のデフォルト値をオーバーライドしています。説明したように、Template の Border を使用TemplateBindingして背景をブラシに設定していることに注意してください。

では、境界線の背景は何色に設定されると思いますか? 赤または青?

答えはどちらでもありません。

この値を使用できる場所 (たとえばOnApplyTemplate、例として) にブレークポイントをコントロールに設定すると、期待どおりの赤 (デフォルト) ではなく、値が null になります。実際、コントロールのすべてのライフサイクル ポイントにブレークポイントを設定しましたが、ProprtyMetaData の既定値は使用されません。

スタイル内で値を設定しても何も起こりません (スタイル セッターのデラレーションに従って、青に設定されません。これは、スタイル セッターがSolidColorBrush何らかの理由で失敗していることを示唆しています。

ただし、これは機能します

public BlankPage()
{
    this.InitializeComponent();
    testcont.TestColor = new SolidColorBrush(Colors.Orange);
}

これも同様に機能します:

<Grid Background="{StaticResource ApplicationPageBackgroundBrush}">
    <local:TestControl  TestColor="Green" />
</Grid>

TemplateBinding再利用可能なカスタムコントロールを作成しようとしているので、これは重要です。

これはバグですか?

ディーン

4

5 に答える 5

0

これは私たちが対処しようとしている問題です。その間、次のように設定します。

<SolidColorBrush x:Key="DefaultTestColorBrush">Red</SolidColorBrush>

そして、あなたのテンプレートで:

<Setter Property="TestColor" Value="{StaticResource DefaultTestColorBrush}" />

そうすれば、とりあえずこのハードルをクリアできるはずです。

于 2012-05-30T21:01:42.823 に答える
0

個人的には、xaml パーサーのどこかのバグだと思います。次のようなものを試してみてください。うまくいくはずです:

    <Setter Property="SelectedDayBrush">
        <Setter.Value>
            <SolidColorBrush>#7F7F7F7F</SolidColorBrush>
        </Setter.Value>
    </Setter>
    <Setter Property="SelectedDayBrush">
        <Setter.Value>
            <SolidColorBrush Color="Orange"/>
        </Setter.Value>
    </Setter>
于 2012-05-30T20:31:00.713 に答える
0

カスタムコントロールを使用する実用的なソリューションがあります。これは、ユーザーコントロールに複数回配置されます(フレームで再利用できるのは素晴らしいことです)。

(generic.xaml で、カスタム コントロールを作成したことを思い出してください)

<Style TargetType="local:myPad">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:myPad">
                <Path Data="..." Height="60" Width="30" Fill="{TemplateBinding myPadColor}"/>

(myPad.cs 内)

    public sealed class myPad : Control
    {
        public myPad()
        {
            this.DefaultStyleKey = typeof(myPad);
        }

        public SolidColorBrush myPadColor
        {
            get { return (SolidColorBrush)GetValue(PadColorProperty); }
            set { SetValue(PadColorProperty, value); }
        }

        public static readonly DependencyProperty PadColorProperty =
            DependencyProperty.Register("myPadColor", typeof(SolidColorBrush), typeof(myPad), new PropertyMetadata(null));
}

私のユーザーコントロールでは、テンプレートコントロールをドロップし、同じ「カラー」バージョンを複数持つことができます...

<UserControl
    x:Class=....
    <Canvas Width="235" Height="235">
        <local:myPad x:Name="thisPad" myPadColor="White">

...

余分なものはかなりカットしましたが(...)、ここでアイデアが得られると思います。また、ユーザー コントロールまたはコード ビハインドで myPadColor のさらに別のバインディングを使用して、創造性を発揮できると考えています。

ところで、私はSP3でVS2012を使用しています..おそらく問題は修正されました。

また、私は XAML のプログラミングにかなり慣れていませんが、Tim Heuer のブログで、依存関係プロパティを実行する正しい方法を見つけました (Tim に感謝します!)

propertymetadata 値の (null) 値を (new SolidColorBrush(Colors.Black)) に置き換えると、デザイン モードでデフォルト値が取得されます。

:)

それが役立つことを願っています。

于 2013-08-17T07:20:01.327 に答える