代码之家  ›  专栏  ›  技术社区  ›  Sonny Boy

是否向自定义WPF控件添加属性?

  •  11
  • Sonny Boy  · 技术社区  · 14 年前

    我今天早上刚开始WPF,所以这是(希望)一个容易解决的问题。我已经开始创建一个具有渐变背景的按钮。我想在控件的属性中声明渐变的开始和结束颜色,然后在模板中应用它们。不过,我在编译代码时遇到了困难。我得到的例外是XAML告诉我该属性不可访问,但当我将Visibility修饰符更改为public时,它抱怨找不到静态属性…

    这是迄今为止我的XAML:

    <StackPanel>
        <StackPanel.Resources>
            <Style TargetType="my:GradientButton">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type my:GradientButton}">
                            <Grid>
                                <Ellipse Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" Stroke="{TemplateBinding Foreground}" VerticalAlignment="Top" HorizontalAlignment="Left">
                                    <Ellipse.Fill>
                                        <LinearGradientBrush>
                                            <GradientStop Color="{TemplateBinding GradientStart}" Offset="0"></GradientStop><!--Problem on this line!!!-->
                                            <GradientStop Color="{TemplateBinding GradientEnd}" Offset="1"></GradientStop>
                                        </LinearGradientBrush>
                                    </Ellipse.Fill>
                                </Ellipse>
                                <Polygon Points="18,12 18,38, 35,25" Fill="{TemplateBinding Foreground}" />
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </StackPanel.Resources>
        <my:GradientButton x:Name="btnPlay" Height="50" Width="50" Foreground="Black" Click="Button_Click" GradientStart="#CCCCCC" GradientEnd="#7777777" />
    </StackPanel>
    

    下面是我的自定义控件的代码:

    public class GradientButton : Button
    {
        static DependencyProperty GradientStartProperty;
        static DependencyProperty GradientEndProperty;
    
        static GradientButton()
        {
            GradientStartProperty = DependencyProperty.Register("GradientStart", typeof(Color), typeof(GradientButton));
            GradientEndProperty = DependencyProperty.Register("GradientEnd", typeof(Color), typeof(GradientButton));
        }
    
        public Color GradientStart
        {
            get { return (Color)base.GetValue(GradientStartProperty); }
            set { base.SetValue(GradientStartProperty, value); }
        }
    
        public Color GradientEnd
        {
            get { return (Color)base.GetValue(GradientEndProperty); }
            set { base.SetValue(GradientEndProperty, value); }
        }
    }
    

    编辑: 这是设计时的例外情况

    Cannot reference the static member 'GradientStartProperty' on the type 'GradientButton' as it is not accessible.
    
    1 回复  |  直到 14 年前
        1
  •  11
  •   Sonny Boy    14 年前

    我想出来了… 这是:

    static DependencyProperty GradientStartProperty; 
    static DependencyProperty GradientEndProperty;
    

    需要更改为:

    public static DependencyProperty GradientStartProperty; 
    public static DependencyProperty GradientEndProperty;