wodehuajianrui

博客园 首页 新随笔 联系 订阅 管理

TabControl这个控件想必大家都不陌生,无论是WinForm、Asp.net还是WPF中,这个通用控件都是非常有用的。

笔者最近在学习Silverlight中也应用到这个控件,发觉它与WPF中的TabControl是不尽相同的——这个事情让我非常的不解,主要是因为这个控件并不会涉及到安全因素,没有理由和WPF不一样(或许是我的类库版本有问题,也请大家有兴趣帮我验证一下)。

WPF的TabControl有ItemTemplate与ContentTemplate两个属性,前者可以为TabItem设置Header的模板,后者可以为TabItem设置Content模板。然而,在Silverlight的TabControl中,只有ItemTemplate这个属性(还有一个Template属性,但是一旦设置,就无法显示Header了)。于是退而求其次的,我只好为TabItem设置模板,幸运的是TabItem有HeaderTemplate与ContentTemplate两个属性,然而ContentTemplate并不Work,原因不明。。。

 

Code

后台代码:

 

Code

 

原本希望在Style中为TabItem设置它的HeaderTemplate与ContentTemplate,这样就可以在绑定DataContext的时候,对相应的控件属性进行绑定。然而运行的时候,可以发现ContentTemplate已经被赋值,但是却不会显示出来那个TextBlock。

 

至于上面这段代码最让我满意的,就是我为了TabItem的Header加入了一个Button,点击它的话,就可以将这个TabItem从TabControl中移除掉。

由于使用ContentTemplate的想法失败了,于是我只好动用TabItem的Content属性,代码做一下修改:

 

Code

这样就向TabItem的Content中加入了一人Button,Button的内容显示abcd。但是这样做有一个非常大的局限性,tabItem.Content属性虽然接受object类型,但是如果设置的不是ContentControl的子类,就会自动调用它的ToString()显示Content。于是这里有了一个权宜之计,就是加入一个Panel(如Canvas),这样向Pannel中就可以加入任何你想要的Control了。但是,我要说的是“但是”,这种方法无疑要求我们手写大量的cs代码而不是xaml代码,我认为这种方法是非常不好的。

我不知道我在设置TabItem的ContentTemplate的时候出了什么错,或者可以直接从TabControl的ItemTemplate(Template、ItemPanel等属性)中设置即可达到相应的效果,如果哪位做过类似的尝试或者有相关的资料可以告诉我,不胜感激。最后截一张运行时的效果图吧:

 

 

posted on 2008-08-06 16:47  花间蕊  阅读(4393)  评论(10编辑  收藏  举报