私はC#を使用してMetro/XAMLで複雑なカスタムコントロールを作成してきました。
私のポイントを説明するために、私はあなたの考慮のための最小限のシナリオを作成しました。
簡単なカスタムコントロールは次のとおりです。
public sealed class TestControl : Control
{
public static DependencyProperty TestTextProperty = DependencyProperty.Register("TestText", typeof(string), typeof(TestControl), new PropertyMetadata(string.Empty));
public string TestText
{
get { return (string) GetValue(TestTextProperty); }
set { SetValue(TestTextProperty, value); }
}
public static DependencyProperty TestColorProperty = DependencyProperty.Register("TestColor", typeof(Color), typeof(TestControl), new PropertyMetadata(Colors.Blue));
public Color TestColor
{
get { return (Color)GetValue(TestColorProperty); }
set { SetValue(TestColorProperty, value); }
}
public TestControl()
{
this.DefaultStyleKey = typeof(TestControl);
}
}
コントロールには、Textプロパティとcolorプロパティの2つの依存関係プロパティがあります。
Generic.xamlのコントロールの標準スタイルは次のとおりです
<Style TargetType="local:TestControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:TestControl">
<Border
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<TextBlock Text="{TemplateBinding TestText}">
<TextBlock.Foreground>
<SolidColorBrush Color="{Binding Source={RelativeSource Mode=TemplatedParent}, Path=TestColor}" />
</TextBlock.Foreground>
</TextBlock>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
2つの問題があります:
1)このコードはコンパイルされません:
<Grid Background="{StaticResource ApplicationPageBackgroundBrush}">
<local:TestControl x:Name="testcont" TestText="Hello" TestColor="Red" />
</Grid>
エラーは次のとおりです。
XAMLBlankPage.xamlのプロパティTestColorでは値タイプColorは許可されていません
そのため、Colorの型コンバーターが壊れているようです(私は推測します)。これを回避するために、コードビハインドでTestColorプロパティを設定します。
public BlankPage()
{
this.InitializeComponent();
testcont.TestColor = Colors.Red;
}
これによりコードをコンパイルできますが、テンプレートで色が正しく設定されることはありません。私も使用しましたValueConverter
:
<TextBlock.Foreground>
<SolidColorBrush Color="{Binding Source={RelativeSource Mode=TemplatedParent}, Path=TestColor, Converter={StaticResource DebugConverter}}" />
</TextBlock.Foreground>
ただし、のブレークポイントがValueConverter
ヒットすることはありません。つまり、バインディングが何とかしてサイレントに失敗していることを意味します。
解決策はないようです。誰かがこの問題に光を当てることができますか?
ありがとう