ここに私の問題を説明するための簡単なカスタム コントロールがあります
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
再利用可能なカスタムコントロールを作成しようとしているので、これは重要です。
これはバグですか?
ディーン