编写与.NET属性窗口交互的RAD组件(二)__教程 |
|
日期:2007-5-20 1:27:13 人气:118 [大 中 小] |
|
|
|
internal class LocCategoryAttribute : CategoryAttribute
{
public LocCategoryAttribute(string categoryKey) : base(categoryKey)
{
}
protected override string GetLocalizedString(string key)
{
// get the resource set for the current locale.
//
ResourceManager resourceManager = new ResourceManager();
string categoryName = null;
// walk up the cultures until we find one with
// this key as a resource as our category name
// if we reach the invariant culture, quit.
//
for (CultureInfo culture = CultureInfo.CurrentCulture;
categoryName == null &&
culture != CultureInfo.InvariantCulture;
culture = culture.Parent)
{
categoryName = (string)resourceManager.GetObject(key, culture);
}
return categoryName;
}
}
使用这个本地化类目名称,我们要先定义一个包含有这个key的资源文件,并且把这个特性使用到属性上去。
[LocCategory("SampleKey")]
public string Data
{
// . . .
}
当我们在设计窗口的时候,如果选择了Form上的多个组件,属性窗口就会显示他们共同属性,共同属性是按组件的属性名和类型区别的。如果改变共同属性的值,那么所有的被选择的组件的这个属性值都会跟着改变。而把一个属性包括在和其他属性的合成里一般来说意义不大。通常,共同属性都是有唯一的值,比如另一个组件的名字。由于当选择了多个组件的时候,改变共同属性的值,所有的被选择组件的对应属性值都会改变,因此,需要指定某些属性不被合并为共同属性。MergablePropertyAttribute就可以做到这点。只要简单的把这个特性参数设为false值,就可以在选择多个组件的时候隐藏掉这个属性,自然他的值就不会跟着变化了。
一些属性的值可以影响到另外的一些属性值。例如,在实现数据绑定的组件中,清除掉DataSource的值,当然应该清除掉DataMember的值。RefreshPropertiesAttribute就让我们实现这个功能。他的默认参数是“none,”也就是不影响到其他属性,如果指定其他的特性参数,属性窗口就可以在改变这个属性值的同时,自动的更新其他属性的值。另外的两个值,其一是Repaint,它让属性窗口重新获取属性的值并且重画他们;还有就是All,它就意味着组件自己要重新获取属性的值。如果值的改变导致属性的数目的增减,那么我们就要使用All。不过要注意到这个一般用在高级场合,并且速度要比Repaint慢。RefreshProperties.Repaint适用于大部分的情况。需要注意的是,这个特性是用在引发改变的属性上,而不是被改编的属性上。
最后,DefaultPropertyAttribute和DefaultEventAttribute使用在类级别的场合,他们让属性窗口高亮显示这些属性和事件。当选择其他的组件的时候,属性窗口总是试图定位到和上次选择的组件相同的属性或事件上。如果没有找到这样的属性或事件的话,它就会将输入指针定位到DefaultPropertyAttribute指定的属性。在Event视图就会定位到DefaultEventAttribute指定的事件。同时,这个事件也是当你双击组件时,自动使用的事件。 |
|
出处:本站原创 作者:佚名 |
|
|