WPF之ControlTemplate

本文介绍了一个WPF程序设计指南中的示例,通过反射机制读取程序集中所有继承自Control的类,并生成带有相应控件类型的菜单项。每个菜单项会创建对应的控件并自动生成XAML文件。

本示例来自于wpf程序设计指南,部分代码稍做调整

本示例使用反射机制读取程序集中所有继承自Control的类包括本Control自身,并选择相应的菜单项后会在窗体中创建相应的控件。

并会自动升成Xaml文件

 

示例效果 图1

图2

 

图3

 

代码部分包括一个ControlMenuItem类型派生自MenuItem,该类型创建一个“包含所有Control子类型”的菜单。每个子菜单项的Header都显示出类型的名称,Tag 属性存储该类型的Type对象。

示例代码:

ExpandedBlockStart.gif 代码
     public   class  ControlMenuItem : MenuItem
    {
        
public  ControlMenuItem()
        {
            var assembly 
=  Assembly.GetAssembly( typeof (Control));
            var aTypes 
=  assembly.GetTypes();
            var sortList 
=   new  SortedList < string , MenuItem > ();
            Header 
=   " Control " ;
            Tag 
=   typeof (Control);
            sortList.Add(
" Control " this );
            
foreach  (var type  in  aTypes)
            {
                
if  (type.IsPublic  &&
                    type.IsSubclassOf(
typeof (Control)))
                {
                    sortList.Add(type.Name,
                        
new  MenuItem
                        {
                            Header 
=  type.Name,
                            Tag 
=  type
                        });
                }
            }

            
foreach  (var kvp  in  sortList)
            {
                
if  (kvp.Key  ==   " Control " continue ;
                var strParent 
=  ((Type)kvp.Value.Tag).BaseType.Name;
                var itemParent 
=  sortList[strParent];
                itemParent.Items.Add(kvp.Value);
            }

            
foreach  (var kvp  in  sortList)
            {
                var type 
=  (Type)kvp.Value.Tag;
                
if  (type.IsAbstract  &&  kvp.Value.Items.Count  ==   0 )
                    kvp.Value.IsEnabled 
=   false ;
                
else
                    kvp.Value.Items.Insert(
0 ,
                        
new  MenuItem
                        {
                            Header 
=  kvp.Value.Header  as   string ,
                            Tag 
=  type
                        });
            }
        }
    }

 

 

所有派生自ContentControl的类型都使用ContentPresenter类型的对象来显示它们的内容。ContentPresenter派生自FrameworkElement,你可以在模板的视觉树内包含一个ContentPresenter对象。比起“内容一定要是字符串”的假设,新的作法好多了。

Wpf定义的任何具有视觉外观的控件,都已经将期Template设定为ControlTemplate类型的对象,当你将Template Property设定成你自己的ControlTemplate时,你等于是将原来的模板取代掉。

点击下载完整示例

转载于:https://www.cnblogs.com/homezzm/archive/2010/06/26/1765760.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值