Silverlight 2.0:在更改之前确定是否设置了依赖项属性

时间:2009-08-13 17:12:05

标签: user-controls controls silverlight-2.0 dependency-properties control-library

我在自定义控件上有一个依赖属性(Foreground),它继承自Control。当我加载控件时,我想查看用户是否已设置依赖项属性,或者在我为其设置值之前是否使用其默认值。问题稍微复杂一点,这就是:

控件位于用户添加到项目中的自定义控件库中。当他们设置项目时,我可以让他们使用给定的x:key在app.xaml文件中添加一行,其中包含我在设置控件的默认值时读取的设置。但是,如果他们在代码或xaml中设置值,我不想使用此全局值设置值。以下是一些案例,以帮助想象我正在谈论的内容:

  1. 用户从我的库中创建一个控件并将其放在他们的页面上。然后他们将前景设置为绿色。我希望该控件的前景值为绿色。

  2. 用户在app.xaml中添加一条特殊行,表示他们希望特定种类的所有控件都具有红色前景。我希望这种控件的前景值为红色。

  3. 用户在app.xaml中添加一条特殊行,表示他们希望特定种类的所有控件都具有红色前景。然后,他们将单个控件(在xaml中)的前景值设置为黄色。我希望那种类型的所有控件的前景值都是红色的,除非他们指定为黄色的那个。

  4. 加载控件时,我想读取依赖项属性以查看它们是否设置了值,或者它是否是样式中定义的默认值。如果它是默认值,我想从app.xaml文件中读取它们的特殊行,并将前景设置为该颜色。

2 个答案:

答案 0 :(得分:5)

MSDN page ReadLocalValue

扩展您的解决方案
if (ReadLocalValue(FontSizeProperty) == DependencyProperty.UnsetValue)
    // Do your thing...

也就是说,存在DependencyProperty.UnsetValue,用于检查是否设置了值。

答案 1 :(得分:1)

我做了一些研究,并相信我找到了答案。当我加载控件(或更新)时,如果此类型为System.Object,则检查ReadLocalValue(ForegroundProperty)的类型,然后不在xaml中设置。但是,如果此类型是System.Object(如System.Windows.Media.Brush)之外的其他类型,那么它将在xaml中设置。