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依赖属性,默认值为Blue(PropertyMetaData如上图所示。

这是我控制的 XAMLGeneric.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 的默认值。请注意,我的模板中的边框用于TemplateBinding将背景设置为所讨论的画笔。

那么你认为边框背景设置了什么颜色?红色还是蓝色?

答案都不是。

如果我在我的控件中设置了一个断点,该值应该可用(OnApplyTemplate例如),那么该值为空,而不是预期的红色(默认)。事实上,我在控件的所有生命周期点都设置了断点,并且从未使用过 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

就个人而言,我认为这是 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

好像还没修好 如果您开发像自定义按钮和 PointerOver 效果只是较浅的背景,一个有效的技巧是在内容顶部有白色背景的不可见 PointerOverVisual。然后 PointerOver 动画将使它稍微可见。这就是我使用的:

<VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Normal"/>
                            <VisualState x:Name="PointerOver">
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames   Storyboard.TargetProperty="Opacity" Storyboard.TargetName="pointerOverVisual">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="0.15"/>
                                    </ObjectAnimationUsingKeyFrames>

…………

<Border x:Name="Border" BorderThickness="0" Background="{TemplateBinding Background}" Margin="3">   
        content here                                                    
</Border>
    <Rectangle x:Name="pointerOverVisual" Fill="White" Opacity="0" Margin="3"/>
    <Rectangle x:Name="FocusVisualWhite" IsHitTestVisible="False" Opacity="0" StrokeDashOffset="1.5" StrokeEndLineCap="Square" Stroke="{StaticResource FocusVisualWhiteStrokeThemeBrush}" StrokeDashArray="1,1"/>
    <Rectangle x:Name="FocusVisualBlack" IsHitTestVisible="False" Opacity="0" StrokeDashOffset="0.5" StrokeEndLineCap="Square" Stroke="{StaticResource FocusVisualBlackStrokeThemeBrush}" StrokeDashArray="1,1"/>
于 2013-04-10T11:17:30.693 回答
0

您可以尝试下面的代码片段来绑定 TestColor,

 Background="{Binding  RelativeSource={RelativeSource TemplatedParent}, Path=TestColor}"

我希望它会有所帮助。

问候,雷克斯

于 2014-05-17T07:51:49.660 回答
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!)

如果您用 (new SolidColorBrush(Colors.Black)) 替换 propertymetadata 值中的 (null) 值,您将在设计模式下获得默认值。

:)

希望有帮助。

于 2013-08-17T07:20:01.327 回答
0

这是我们希望解决的问题。同时,像这样设置它:

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

然后在您的模板中:

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

那么你现在应该能够清除这个障碍。

于 2012-05-30T21:01:42.823 回答