How to: Work Item Tracking Custom Controls

本文介绍如何创建自定义的TFS工作项控件,包括定义IWorkItemControl接口的基类WitCustomControlBase,及具体实现的DemoControl类,并详细说明了配置XML文件及修改TFS团队项目模板的过程。

需要实现IWorkItemControl接口,首先创建一个自定义控件的基类WitCustomControlBase,定义_workItem_workItemFieldName字段,定义FlushToDatasource方法。

 

代码段如下:

publicclass WitCustomControlBase : UserControl, IWorkItemControl{

 protected WorkItem_workItem = null;

 protected string_workItemFieldName = null;

 

 

 public virtual voidFlushToDatasource(){

  }

}

 

新建类DemoControl继承自WitCustomControlBase,代码段如下:

publicpartial class DemoControl : WitCustomControlBase {

       private TextBox txtDemo = newTextBox();

 

       public DemoControl() {

           InitializeComponent();

 

           txtDemo.Width = 100;

           txtDemo.Height = 25;

           txtDemo.Text = "InitText";

           this.Controls.Add(txtDemo);

       }

 

       private void UpdateData() {

           this._workItem.Fields[_workItemFieldName].Value = txtDemo.Text;

       }

 

       public override voidFlushToDatasource() {

           UpdateData();

       }

   }

 

新建DemoControl.wicc文件,内容如下:

<?xmlversion="1.0"?>

<CustomControlxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema">

 <Assembly>CodePlex.WitCustomControls.dll</Assembly>

 <FullClassName>CodePlex.WitCustomControls.Demo.DemoControl</FullClassName>

</CustomControl>

 

创建安装项目,安装以上内容所在的项目

Machine generated alternative text: WCustomControlSebpE]  Detected Dependen鰁sContent Files from WitCustomControls (Active)Primary output from WitCustomControls (Active)

安装之后在安装目录下可以找到以下内容

Machine generated alternative text: AssodatedAutomat韔nControl . wicck CaptureAttachmentsControl .wicc? Codeplex.WitCustomControls.dIIDemoControl.wiccMuibValueControl .wiccReproStepsControl .wiccScreenshotConfrol . wiccteststepsControl .wiccWeb遰owserConfrol . wicc

 

接下来修改TFS团队项目模板

通过Visual Studio中的Team Explorer下载Agile 5.0模板,打开WorkItemTracking下的TypeDefinitions,复制一份task.xml文件,重命名为Customtask.xml。打开Customtask.xml,将WORKITEMTYPE修改为CustomTask,添加

Machine generated alternative text: <WORKITEMTYPE name=擟ustomTask?

 

<FIELDname="DemoTitle" refname="Microsoft.VSTS.Common.DemoTitle"type="String" />

<ControlType="DemoControl"FieldName="Microsoft.VSTS.Common.DemoTitle"Label="DemoTitle:" LabelPosition="Left" />

 

Machine generated alternative text: <FIELD name=擠emoTitle? refname=擬icrosoft .VSTS . Common .DemoTitle? type=擲tring? I>

 

Machine generated alternative text: <Column PercentWidth=?0?<Group Label=擟lassification?<Column PercentWidth=? loo?<Control FieldName=擲ystem.AreaPath? Type=揥orkltemClassificationControl? Label=? &amp;Area:?LabelPosition=擫eft? I><Control FieldName=擲ystem. IterationPath? Type=揥orkltemClassificationControl? Label=擨te&amp;ration:?LabelPosition=擫eft? I><Control Type=擠emoControl? FielclName=揗icrosoft .VSTS . Common .DeinoTitle? Label=擠einoTitle:?LabelPosition=擫eft? I></Column></Group></Column>

 

打开WorkItem Tracking下面的workitems.xml,添加一个WORKITEMTYPES

Machine generated alternative text: <taskXml><WORKITEMTYPES><WORKITEMTYPE fileName=擶orkltem Tracking\Typeoefinitions\Bug. xml? I><WORKITEMTYPE fileName=擶orkltem Tracking\TypeDefinitions\SharedStep. xml? I><WORKITEMTYPE f ileName=擶orkltem Tracking\TypeDefinitions\Task. xml? ,><WQRKITEMTYPE f ileName=擶orkltem Tracking\TypeDefinitions\TestCase . xml? I><WORKITEMTYPE f ileName=擶orkltem Tracking\TypeDefinitions\UserStory . xml? ,><WORKITEMTYPE f ileName=擶orkltem Tracking\TypeDefinitions\Issue . xml? I><WQRKITEMTYPE fileName=擶orkltem Tracking\TypeDefinitionsCustomtask. xml? !></WORKITEMTYPES>

上载修改过后的Agile 5.0模板,根据该模板新建TeamProject,添加CustomTask类型的WorkItem

 

Machine generated alternative text: I My Favorites________ a El  DemoControl棏 (J Work Item Templates! rn ____portsAidsam Membersurce ControleWebWI:tDemoPointProjectsork Item Templatesork ItemsJ DocumentsJ ReportsIt;::: BuildsAcbvit? IECustomTaskIssueShared Steps1 New CustomTask...New Work Item? GotoWorkitem...New QueryTeam Project Process GuidanceTaskTest Case RefreshUser StoryIElElrn

 

Machine generated alternative text: ]Jtle: IDemoTUeE-St5 ________Assigned To: IAdminisfrathrState: lActiveseason: INPlanningSta Rank: rPrior靦y: 12- Effort (Hours)Original estimate:I Remaining:Compieted:ClassificationArea:Iteration: IDemoconfrolActiviti: IIoemoconfrol zIz]I MyCustomTideDemoTitle:z]

 

保存该WorkItem,查看DemoTitle在数据库中的存储

打开表dbo.WorkItemsLatest,找到刚才添加到DemoTitle

Machine generated alternative text: 9999-01-0100:00:00.000 539999-01-0100:00:00.000 539999-01-0100:00:00.000 529999-01-01 00:00:00.000 67J 9999-01-01 00:00:00.000 5543ActiveNULL133343bbbbbbbbbbbbbbbbbBugNULL43ActiveNULL133443mytaskTaskNULL55Active13133555sganBugNULL55Active214133655DemoBugBugNULL64 Active 13 13 37 64 DemoTitle CustomTask MyCuomTitIe

 

 

Links

 

Work Item Tracking Custom Controls

 

Pastedfrom <http://blogs.msdn.com/b/greggboer/archive/2010/03/30/work-item-tracking-custom-controls.aspx>

 

Createcustom work item control for TFS Web Access 2010 (TWA)

 

Pastedfrom <http://www.ewaldhofman.nl/post/2010/08/10/Create-custom-work-item-control-for-TFS-Web-Access-2010-(TWA).aspx>

 

Custom Controls for TFS Work Item Tracking

 

Pastedfrom <http://witcustomcontrols.codeplex.com/

<think>好的,用户问的是“TrackingMode::ARRAY_TRACKING | TrackingMode::MARKER_TRACKING这是什么写法”,需要详细解释这种写法的含义和用途。首先,用户可能在C++代码中看到了这种按位或操作符的使用,不太理解为什么用这样的方式组合枚举值。 首先,我应该确认这种写法的常见用途。在C++中,按位或通常用于组合多个标志位,尤其是在使用位掩码(bitmask)的时候。枚举类型中的每个值通常代表一个特定的位,通过按位或可以将多个标志组合成一个整数,表示多种状态或选项的组合。 接下来,需要解释TrackingMode可能是一个枚举类(enum class),其中ARRAY_TRACKING和MARKER_TRACKING是其枚举值。这些枚举值应该被设计为二的幂,比如0x01, 0x02, 0x04等,这样每个标志位占据不同的二进制位,从而可以通过按位或操作组合起来。例如,ARRAY_TRACKING可能是1(0b0001),MARKER_TRACKING是2(0b0010),组合后是3(0b0011),表示同时启用这两种模式。 然后,用户可能想知道这种写法的好处,比如节省存储空间,简化参数传递,或者提高效率。需要提到这种设计在API中的常见性,比如Windows API中的窗口样式,或者游戏开发中的状态标志。 同时,需要注意可能的陷阱,比如枚举值是否确实设计为位掩码,否则直接按位或会导致错误。还要提到在C++中使用枚举类时的类型安全问题,可能需要显式转换为整数类型才能进行按位操作。 用户可能的背景是C++开发者,对位操作有一定了解,但对实际应用中的模式不太熟悉。他们可能在使用或阅读现有代码时遇到了这种写法,想要了解其原理和正确用法。 最后,要确保回答清晰,结构合理,分点解释,并举例说明。同时,提供相关问题供用户进一步思考,比如如何定义枚举值,如何检查组合标志,以及与其他组合方式的比较。 </think>该写法使用了 **按位或运算符 (`|`)** 组合 `TrackingMode` 枚举类型的两个标志位,表示同时启用 **数组跟踪** 和 **标记点跟踪** 两种模式。这种写法常见于 **位掩码(bitmask)** 设计模式,用于高效管理多个布尔状态。 --- ### **逐层解析** #### 1. **`TrackingMode` 枚举定义** 假设 `TrackingMode` 是一个枚举类(`enum class`),其成员值为二的幂(每个值对应一个二进制位): ```cpp enum class TrackingMode { NONE = 0, // 0b0000 ARRAY_TRACKING = 1 << 0, // 0b0001 MARKER_TRACKING = 1 << 1, // 0b0010 OTHER_MODE = 1 << 2, // 0b0100 // ... }; ``` - **按位或 (`|`)**:将多个标志的二进制位“或”在一起,结果为一个整数,表示多种模式的组合。 #### 2. **`ARRAY_TRACKING | MARKER_TRACKING` 的计算** - `ARRAY_TRACKING` 的值为 `1`(二进制 `0001`)。 - `MARKER_TRACKING` 的值为 `2`(二进制 `0010`)。 - 按位或后:`0001 | 0010 = 0011`(十进制 `3`),表示同时启用这两种模式。 #### 3. **使用场景** - **函数参数传递**:通过一个整数参数传递多个布尔标志,例如: ```cpp void startTracking(TrackingMode mode); startTracking(TrackingMode::ARRAY_TRACKING | TrackingMode::MARKER_TRACKING); ``` - **状态管理**:用单个变量存储多个独立状态,节省内存并简化逻辑。 --- ### **优势与注意事项** #### ✅ **优势** 1. **高效性**:按位操作是底层硬件直接支持的操作,速度极快。 2. **简洁性**:避免多个布尔参数或标志变量的冗余代码。 3. **扩展性**:新增模式时只需定义新的二进制位(如 `OTHER_MODE = 1 << 2`)。 #### ⚠️ **注意事项** 1. **枚举值必须为二的幂**:若值冲突(如 `ARRAY_TRACKING = 1`, `MARKER_TRACKING = 3`),按位或会导致不可预测的结果。 2. **类型转换问题**:C++ 的 `enum class` 默认不支持按位运算,需显式转换为整数类型: ```cpp auto combined = static_cast<int>(TrackingMode::ARRAY_TRACKING) | static_cast<int>(TrackingMode::MARKER_TRACKING); ``` 3. **可读性**:需注释说明每个标志位的含义,避免维护困难。 --- ### **完整示例** ```cpp #include <iostream> enum class TrackingMode { NONE = 0, ARRAY_TRACKING = 1 << 0, // 0b0001 MARKER_TRACKING = 1 << 1, // 0b0010 DEBUG_MODE = 1 << 2 // 0b0100 }; void startTracking(int mode) { if (mode & static_cast<int>(TrackingMode::ARRAY_TRACKING)) { std::cout << "Array Tracking Enabled\n"; } if (mode & static_cast<int>(TrackingMode::MARKER_TRACKING)) { std::cout << "Marker Tracking Enabled\n"; } if (mode & static_cast<int>(TrackingMode::DEBUG_MODE)) { std::cout << "Debug Mode Enabled\n"; } } int main() { startTracking( static_cast<int>(TrackingMode::ARRAY_TRACKING) | static_cast<int>(TrackingMode::MARKER_TRACKING) ); return 0; } ``` **输出**: ``` Array Tracking Enabled Marker Tracking Enabled ``` --- ### **与其他组合方式的对比** | 方式 | 优点 | 缺点 | |------------------|--------------------------|--------------------------| | **按位或 (`|`)** | 高效、简洁、扩展性强 | 依赖枚举值设计,可读性差 | | **布尔参数列表** | 直观易懂 | 参数多时冗长 | | **结构体/对象** | 支持复杂配置 | 内存占用高,初始化复杂 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值