欢迎光临
我们一直在努力

编写与.NET属性窗口交互的RAD组件(四)-.NET教程,组件控件开发

建站超值云服务器,限时71元/月

七、 编写和显示订制的类型

属性窗口中的编辑有如下三种工作方式:一,有些场合可以作为字符串来编辑,然后由typeconverter来实现类型的转换。二,可以显示一个下拉列表来选择值。三,一个省略按钮提供其他的ui界面来编辑值,比如filedialog和fontpicker。我们已经讲过了字符串形式,接着我们就来看下拉列表。

.net framework已经包含了好几种下拉列表的例子,如color,accessiblerole,dock等属性。我们从下图可以看到下拉列表的具体实现。

图4. 下拉列表编辑器

实现下拉的工作同样是由typeconverter来定义。如果看typeconverter的说明,可以看到有三个虚函数来实现这个功能:getstandardvaluessupported(),getstandardvalues()和getstandardvaluesexclusive()。重载这些方法,我们可以为属性提供预先定义好的值列表。实际上,是typeconverter实现了下拉列表中的枚举值。属性窗口自己本身并没有代码来处理这种下拉列表的编辑,而仅仅是使用typeconverter的方法。

举个例来说,我们有一个包含relation属性的familymember组件,允许用户选择与其他人之间的关系。如果要使设计时界面更友好的话,属性窗口应该使用下拉列表来提供一些常用值的选择:如mother,father,daughter和sister等。除了提供的常用值之外,组件使用者也可以输入其他的表示关系的字符串值。

public class familymember : component

{

private string relation = "unknown";

[typeconverter(typeof(relationconverter)),category("details")]

public string relation

{

get { return relation;}

set { this.relation = value;}

}

}

internal class relationconverter : stringconverter

{

private static standardvaluescollection defaultrelations =

new standardvaluescollection(

new string[]{"mother", "father", "sister",

"brother", "daughter", "son",

"aunt", "uncle", "cousin"});

public override bool getstandardvaluessupported(

itypedescriptorcontext context)

{

return true;

}

public override bool getstandardvaluesexclusive(

itypedescriptorcontext context)

{

// returning false here means the property will

// have a drop down and a value that can be manually

// entered.

return false;

}

public override standardvaluescollection getstandardvalues(

itypedescriptorcontext context)

{

return defaultrelations;

}

}

不过如何做一个更加定制化的ui呢?我们可以使用uitypeeditor类。uitypeeditor类包括了在显示属性或者是编辑属性(比如下拉列表和省略按钮)时可以由属性窗口调用的方法。

一些类似于image,color,font.name的属性类型会在属性值的左边有一个小的图形化表示,这是通过重载uitypeeditor的paintvalue方法实现的。当属性窗口得到定义了编辑器的属性值的时候,它就提供给编辑器一个矩形框对象(rectangle)和画图的对象(graphic),他们都包含在paintvalue方法的事件参数paintvalueeventargs中。举个例子来说,我们有一个grade类需要有图形化的表示。下面就是我们的grade类。

[editor(typeof(gradeeditor), typeof(system.drawing.design.uitypeeditor))]

[typeconverter(typeof(gradeconverter))]

public struct grade

{

private int grade;

public grade(int grade)

{

this.grade = grade;

}

public int value

{

get

{

return grade;

}

}

}

当我们输入一个年龄的时候,我们可以看到左边的一个图形表示。

图5. 输入年龄

实现它并不困难。注意到赋给grade类的editorattribute特性,它就是下面的这个类:

public class gradeeditor : uitypeeditor

{

public override bool getpaintvaluesupported(

itypedescriptorcontext context)

{

// let the property browser know wed like

// to do custom painting.

return true;

}

public override void paintvalue(paintvalueeventargs pe)

{

// choose the right bitmap based on the value

string bmpname = null;

grade g = (grade)pe.value;

if (g.value > 80)

{

bmpname = "best.bmp";

}

else if (g.value > 60)

{

bmpname = "ok.bmp";

}

else

{

bmpname = "bad.bmp";

}

// draw that bitmap onto the surface provided.

bitmap b = new bitmap(typeof(gradeeditor), bmpname);

pe.graphics.drawimage(b, pe.bounds);

b.dispose();

}

}

像我们上面提到的,uitypeeditor可以实现属性的下拉选择和弹出对话框选择。后面的例子会包括这样的代码。如果想知道进一步的信息的话,就要参考uitypeeditor.geteditstyle和uitypeeditor.editvalue方法以及iwindowsformseditorservice接口。

-----------------------------------

<<<<<<<<<<<<待续>>>>>>>>>>>>

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 编写与.NET属性窗口交互的RAD组件(四)-.NET教程,组件控件开发
分享到: 更多 (0)