0

私は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ヒットすることはありません。つまり、バインディングが何とかしてサイレントに失敗していることを意味します。

解決策はないようです。誰かがこの問題に光を当てることができますか?

ありがとう

4

3 に答える 3

1

値の型の依存関係プロパティには既知の問題があります。値の型の期間は、XAML のプロパティの期間で許可されていません MS は、修正されると述べています。現在、プロパティ タイプを Color から Object に変更できます。

于 2012-05-31T17:08:13.227 に答える
0

色の種類を定義する2つの名前空間System.DrawingSystem.Windows.Media。colorプロパティはおそらく描画名前空間のものであり、XAMLはメディア名前空間を使用します。

System.Windows.Media.Brush代わりにタイプを使用しColor(ここでも名前空間が重要です)、Bindable(true)CLRプロパティの属性を追加します。

Control実例を示すために、 :のBackgroundプロパティ宣言を見てください。

[Bindable(true), Category("Appearance")]
public Brush Background
{
    get
{
    return (Brush)base.GetValue(Control.BackgroundProperty);
}
set
{
    base.SetValue(Control.BackgroundProperty, value);
}
}
于 2012-05-29T19:29:34.357 に答える
0

Brushではなく、を使用する必要がありますColor

testcont.TestColor = Brushes.Red;

DependencyProperty も Color ではなく、Brush である必要があります。色を使用できますが、色をブラシに変換する必要があります。

于 2012-05-29T19:17:12.527 に答える