添加和自定义工作项类型

可以添加和自定义工作项的类型,以便用于特定团队项目。 对于每个工作项类型,您都可添加字段、状态和转换,并更改窗体布局。 对于为类型定义的每个字段,您都可以添加规则和定义允许值。

在本演练中,修改类型的每个组件时,会通过打开该类型的新工作项将更改导入团队项目并验证更改。

主题内容

若要添加和自定义工作项类型,请执行以下过程:

  1. 创建名为 WITLab 的团队项目

  2. 查看“Task”类型的工作项窗体

  3. 导出“Task”类型

  4. 复制“Task”类型并将其重命名为“Special Task”类型

  5. 导入“Special Task”类型并检查更改

  6. 将名为“Category”的新字段添加到“Special Task”类型

  7. 将规则添加到“Category”字段

  8. 为“Category”字段创建选取列表

  9. 更改“Special Task”类型的工作流

  10. 更改“Special Task”类型的窗体布局

系统必备

若要完成本演练中的步骤,必须满足以下条件:

  • 您必须拥有已安装团队资源管理器的 Visual Studio 的副本,并与 Team Foundation Server 相连接。 有关更多信息,请参见在 Team Foundation Server 中连接团队项目

  • 如果您可以建立与 Team Foundation Server 的连接,并且具有适当的权限集,则可以通过命令提示符、批处理文件或脚本文件对工作项类型进行基本的自定义。

必需的权限

若要执行此过程,您必须是**“Team Foundation Administrators (Team Foundation 管理员)”组的成员或项目的“Project Administrators (项目管理员)”**组的成员。 有关更多信息,请参见Team Foundation Server 权限

创建名为 WITLab 的团队项目

创建团队项目

  1. 启动 Visual Studio。

  2. 在 Visual Studio 中,在**“工具”菜单上,单击“连接到 Team Foundation Server”**。

    备注

    如果您看不到此选项,表示您尚未安装团队资源管理器。必须先安装团队资源管理器,然后才能选择连接到 Team Foundation Server。

  3. 在**“连接到团队项目”对话框中,从“Team Foundation Server”**列表中选择一个运行 Team Foundation Server 的服务器。

  4. 在**“连接到团队项目”对话框中,从“Team Foundation Server”**列表中选择包含要向其添加团队项目的团队项目集合的服务器。

    备注

    如果该下拉列表为空,请单击“服务器”按钮以手动输入服务器连接设置。请联系 Team Foundation 管理员或团队项目管理员获取连接设置。

  5. 从**“目录”**列表中单击要将团队项目添加到的项目集合的名称。

  6. 单击**“连接”**。

  7. 在**“文件”菜单上,单击“新建团队项目”**。

    备注

    如果没有使用项目管理环境设置,请在“文件”菜单上指向“新建”,然后单击“团队项目”

    **“新建团队项目”**向导出现。

    备注

    如果您尚未连接到 Team Foundation Server,系统将会提示您立即连接到一个此类服务器。检查步骤 2 到 6。

  8. 在**“指定团队项目设置”页上,在“团队项目的名称是什么?”下,键入 WITLab,然后单击“下一步”**。

  9. 在**“选择过程模板”页上,在“应使用哪个过程模板来创建团队项目?”下面,单击“MSF for Agile Software Development - <版本号>”,然后单击“完成”**。

    创建团队项目可能需要几分钟时间。

  10. 当**“已创建团队项目”页出现时,清除“启动过程指南”框,然后单击“关闭”**。

    名为“WITLab”的新团队项目在团队资源管理器中显示为一个节点。

查看“Task”类型的工作项窗体

前提条件:您必须已完成创建名为 WITLab 的团队项目。 “WITLab”团队项目在团队资源管理器中显示为一个节点。

查看工作项窗体

  1. 启动 Visual Studio 并打开团队资源管理器。

  2. 在团队资源管理器中,展开 WITLab 团队项目,并等待几秒钟以便加载其文件夹。

  3. 在团队项目中,右击**“工作项”节点,指向“添加工作项”,然后单击“Task”**。

    表示新“Task”工作项的窗体随即出现。 该表单的有些字段包含默认值。 在本主题后面的内容中,您可以自定义用于创建此工作项的“Task”工作项类型。

导出“Task”类型

前提条件:您必须已完成创建名为 WITLab 的团队项目。 “WITLab”团队项目在团队资源管理器中显示为一个节点。

导出工作项类型

  1. 打开一个 Visual Studio 命令提示。

  2. 在命令提示符处键入下面的命令,然后按 Enter:

    witadmin exportwitd /collection:http://服务器名称:端口/虚拟目录名称/连接名称 /p:WITLab /n:Task /f:"文件路径\task.xml"

    这会将“Task”工作项类型从 Team Foundation Server 导出到为“文件路径”指定的文件夹的 task.xml 文件中。 导出操作完成时会出现以下内容:

    Work item type export complete.

  3. (可选)若要查看“Task”工作项类型的 XML 定义,请在命令提示符处键入 "文件路径**\ task.xml"**,然后按 Enter。

复制“Task”类型并将其重命名为“Special Task”类型

前提条件:您必须已经完成导出“Task”类型过程。

复制并重命名类型

  1. 在 Visual Studio 中,单击**“文件”,然后单击“打开文件”**。

    将显示**“打开文件”**对话框。

  2. 在**“查找范围”**之下,移动到您导出该文件的位置。

    如果要修改工作项类型以自定义过程模板,请移动到下载该过程模板的位置。

    备注

    如果您运行的是 Windows Vista,则可能不具有某些文件夹的权限集。如果尝试将工作项类型导出到您没有权限集的位置,注册表虚拟化技术将自动重定向导出的文件,并将其保存到虚拟存储区。若要避免此重定向操作,可以将该文件导出到您拥有权限集的位置。有关注册表虚拟化的更多信息,请参见 Microsoft 网站:Registry Virtualization(注册表虚拟化)和 Windows Vista 中常见的文件和注册表虚拟化问题

  3. 单击 task.xml 文件,然后单击**“打开”。 出现有关行尾的提示时,单击“否”**。

    这将打开 task.xml,即包含“Task”工作项类型的定义的 XML 文件。

  4. 定位到 XML 文件中的以下元素。

    <WORKITEMTYPE name="Task">
    
  5. 将 name 特性的值更改为 Special Task。

    <WORKITEMTYPE name="Special Task">
    
  6. 将更改保存到新的 XML 文件。 为此,请在 Visual Studio 的**“文件”菜单上,单击“另存 task.xml 为”**。

    将显示**“另存文件为”**对话框。

  7. 对于**“文件名”,请键入 specialtask.xml,然后单击“保存”**。

导入“Special Task”类型并检查更改

前提条件:您必须已经完成复制“Task”类型并将其重命名为“Special Task”类型过程。

导入新类型

  1. 打开一个 Visual Studio 命令提示。

  2. 将“Special Task”类型导入 Team Foundation Server。 为此,请在 Visual Studio 命令提示符处键入下面的命令,然后按 Enter:

    witadmin importwitd /collection:http://服务器名称:端口/虚拟目录名称/连接名称 /p:WITLab /f:"文件路径\specialtask.xml"

    这会将“Special Task”类型导入 Team Foundation Server 上的 WitLab 项目。 导入操作完成时会显示下面的内容:

    Work item type import complete.

  3. 在团队资源管理器中,选择团队项目,然后在**“视图”**菜单上,单击 “刷新”,从服务器下载最新的更新。

    这些更新包括您刚导入的新“Special Task”类型。 请等待几秒钟,直到所有的节点加载完毕。 正在加载中的节点显示**“正在工作”**。

  4. 创建“Special Task”工作项。 为此,请右击**“工作项”节点,指向“添加工作项”,然后单击“Special Task”**。

    此工作项是从您已更改并导入的工作项类型创建的。

将名为“Category”的新字段添加到“Special Task”类型

前提条件:您必须已经完成复制“Task”类型并将其重命名为“Special Task”类型过程。

添加字段

  1. 打开包含“Special Task”工作项类型定义的文件。 为此,请在 Visual Studio 中单击标记为**“SpecialTask.xml”**的选项卡。

  2. 找到 XML 文件的以下节:

    <FIELDS>
    
  3. 若要创建一个名为“Category”的字符串字段和用于工具提示的帮助文本,请键入 FIELD 和 HELPTEXT 元素,如下面的示例所示:

    <FIELDS>
    <FIELD name="Category" refname="MyCompany.MyProcess.Category" type="String">
        <HELPTEXT>Describes the category to which this special task belongs.</HELPTEXT>
    </FIELD>
    

    备注

    “引用名称”(或 refname)是字段的编程名称。所有其他规则都应该引用此 refname。有关更多信息,请参见工作项跟踪对象的命名约定

  4. 找到 XML 文件中描述工作项窗体的部分。

    <FORM>
    
  5. 找到 <FORM> 节中的下列行:

    <Group Label="Classification">
      <Column PercentWidth="100">
        <Control Type="WorkItemClassificationControl" FieldName="System.AreaPath" Label="Area" LabelPosition="Left" />
        <Control Type="WorkItemClassificationControl" FieldName="System.IterationPath" Label="Iteration" LabelPosition="Left" />
      </Column>
    </Group>
    
  6. 若要插入一个控件来显示 Category 字段,请键入 Control 元素,且 Type="FieldControl" 跟在 System.IterationPath 控件后面,如下面的示例所示:

    <Group Label="Classification">
      <Column PercentWidth="100">
        <Control Type="WorkItemClassificationControl" FieldName="System.AreaPath" Label="Area" LabelPosition="Left" />
        <Control Type="WorkItemClassificationControl" FieldName="System.IterationPath" Label="Iteration" LabelPosition="Left" />
        <Control Type="FieldControl" FieldName="MyCompany.MyProcess.Category" Label="Category" LabelPosition="Left" />
      </Column>
    </Group>
    
  7. 在**“文件”菜单上,单击“保存”**,将更改保存到 XML 文件中。

  8. 将已更改的“Special Task”类型导入 Team Foundation Server。 为此,请重复以下过程中提供的步骤:导入“Special Task”类型并检查更改。

    请注意表单上新的**“Category”**字段。 将鼠标指针移到该字段的标签上方以查看工具提示。

  9. 单击**“关闭”关闭新的“Special Task”。 提示您保存工作项时,请单击“否”**。

ms400654.collapse_all(zh-cn,VS.110).gif将规则添加到“Category”字段

前提条件:您必须已经完成添加名为“Category”的新字段过程。

向字段添加规则

  1. 打开包含“Special Task”工作项类型定义的文件。 为此,请在 Visual Studio 中单击标记为**“SpecialTask.xml”**的选项卡。

  2. 找到 XML 文件的 <FIELDS> 部分,接着在该部分找到“Category”字段。

  3. 若要使 Category 成为必选字段,请添加 REQUIRED 元素,如下面的示例所示:

    <FIELD name="Category" refname="MyCompany.MyProcess.Category" type="String" reportable="dimension">
    <HELPTEXT>Describes the category to which this special task belongs.</HELPTEXT>
    <REQUIRED />
    </FIELD>
    
  4. 在**“文件”菜单上,单击“保存”**,将更改保存到 XML 文件中。

  5. 将更改后的“Special Task”工作项类型导入 Team Foundation Server。 为此,请重复本主题前面所述过程中提供的步骤:导入“Special Task”类型并检查更改。

    witadmin importwitd /collection:http://服务器名称:端口/虚拟目录名称/连接名称 /p:WITLab /f:"文件路径\specialtask.xml"

    **“Category”**字段现在已突出显示,指示该字段是必需字段。

  6. 选择“Special Task”工作项上的**“标题”**字段并键入“示例任务”。

  7. 在工具栏上,单击**“保存”**以保存该工作项。

    此时将显示一个错误对话框,指出**“Category”字段不能为空。 单击“确定”**关闭对话框。

  8. 在“Special Task”工作项上的**“Category”**字段中,键入“A”类别。

  9. 单击**“保存”**以保存该工作项。

    用来保存工作项的选项现在可用。

  10. 单击**“关闭”**关闭新的“Special Task”。

ms400654.collapse_all(zh-cn,VS.110).gif为“Category”字段创建选取列表

前提条件:您必须已经完成将规则添加到“Category”字段过程。

创建选取列表

  1. 打开包含“Special Task”工作项类型定义的文件。 为此,请在 Visual Studio 中单击标记为**“SpecialTask.xml”**的选项卡。

  2. 找到 XML 文件的 <FIELDS> 部分,接着在该部分找到“Category”字段。

  3. 若要添加 Category 字段允许值的列表,请插入 ALLOWEDVALUES 元素以及每个允许值对应的 LISTITEM 子元素。

    <FIELD name="Category" refname="MyCompany.MyProcess.Category" type="String" reportable="dimension">
    <HELPTEXT>Describes the category to which this special task belongs.</HELPTEXT>
    <REQUIRED />
    <ALLOWEDVALUES>
        <LISTITEM value="Process Management" />
        <LISTITEM value="Planning" />
        <LISTITEM value="Execution" />
        <LISTITEM value="Review" />
    </ALLOWEDVALUES>
    </FIELD>
    
  4. 若要使 Category 成为可选字段,请删除 ALLOWEDVALUES 元素上方列出的 REQUIRED 元素。

    <FIELD name="Category" refname="MyCompany.MyProcess.Category" type="String" reportable="dimension">
    <HELPTEXT>Describes the category to which this special task belongs.</HELPTEXT>
    <REQUIRED />
    <ALLOWEDVALUES>
        <LISTITEM value="Process Management" />
        <LISTITEM value="Planning" />
        <LISTITEM value="Execution" />
        <LISTITEM value="Review" />
    </ALLOWEDVALUES>
    </FIELD>
    
  5. 单击**“保存”**将更改保存到该 XML 文件。

  6. 将更改后的“Special Task”工作项类型导入 Team Foundation Server。 为此,请重复本主题前面所述过程中提供的步骤:导入“Special Task”类型并检查更改。

  7. 创建“Special Task”工作项。 为此,请右击**“工作项”节点,指向“添加工作项”,然后单击“Special Task”**。

    此工作项是从您已更改并导入的工作项类型创建的。

  8. 单击“Category”字段的列表框。

    请注意,该字段现在只支持由 ALLOWEDVALUES 规则指定的值。

    备注

    下拉列表中的允许值始终按字母顺序出现,与 XML 文件中的 LISTITEM 元素的顺序无关。

  9. 单击**“关闭”关闭新的“Special Task”。 提示您保存工作项时,请单击“否”**。

ms400654.collapse_all(zh-cn,VS.110).gif更改“Special Task”类型的工作流

前提条件:您必须已经完成为“Category”字段创建选取列表过程。

更改工作流

  1. 打开包含“Special Task”工作项类型定义的文件。 为此,请在 Visual Studio 中单击标记为**“SpecialTask.xml”**的选项卡。

  2. 在该 XML 文件的 <WORKFLOW> 部分中,找到工作项类型的工作流定义,如下面的 XML 所示:

    <WORKFLOW>
      <STATES>
        <STATE value="Active">
          <FIELDS>
            <FIELD refname="Microsoft.VSTS.Common.ClosedDate">
              <EMPTY />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ClosedBy">
    ...
    

    请注意,其中只定义了两个状态:“Active”和“Closed”。 还定义了这两个状态之间的转换,以及一个从 null 状态(该状态在创建工作项时使用)开始的起始转换。

  3. 若要向类型定义中添加 Unapproved 状态,请在活动状态上方插入另一个 STATE 元素。

    <WORKFLOW>
      <STATES>
        <STATE value="Unapproved">
        </STATE>
        <STATE value="Active">
          <FIELDS>
            <FIELD refname="Microsoft.VSTS.Common.ClosedDate">
              <EMPTY />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ClosedBy">
    ...
    
  4. 创建 null 状态与 Unapproved 状态之间的转换。 为此,请找到工作流定义中针对转换的部分。 然后,插入一个 TRANSITION 元素使未指定状态成为 Unapproved 状态。 由于此更改,该类型的所有新工作项将从 Unapproved 状态开始,并且默认原因为“New”(新建)。

    <TRANSITIONS>
      <TRANSITION from="" to="Unapproved">
        <REASONS>
          <DEFAULTREASON value="New" />
        </REASONS>
      </TRANSITION>
      <TRANSITION from="" to="Active">
        <REASONS>
          <DEFAULTREASON value="New" />
        </REASONS>
        <FIELDS>
          <FIELD refname="Microsoft.VSTS.Common.ActivatedBy">
            <COPY from="currentuser" />
          </FIELD>
          <FIELD refname="Microsoft.VSTS.Common.ActivatedDate">
            <COPY from="clock" />
          </FIELD>
          <FIELD refname="System.AssignedTo">
            <COPY from="currentuser" />
          </FIELD>
        </FIELDS>
      </TRANSITION>
    
  5. 删除未指定为活动状态的 TRANSITION 元素及其所有子元素,如下面的示例所示。 执行此步骤是因为只能存在一个起始转换,而您要使用名为“Ported”的起始转换(该转换在下一步中定义)。

    <TRANSITIONS>
      <TRANSITION from="" to="Unapproved">
        <REASONS>
          <DEFAULTREASON value="New" />
        </REASONS>
      </TRANSITION>
      <TRANSITION from="" to="Active">
        <REASONS>
          <DEFAULTREASON value="New" />
        </REASONS>
        <FIELDS>
          <FIELD refname="Microsoft.VSTS.Common.ActivatedBy">
            <COPY from="currentuser" />
          </FIELD>
          <FIELD refname="Microsoft.VSTS.Common.ActivatedDate">
            <COPY from="clock" />
          </FIELD>
          <FIELD refname="System.AssignedTo">
            <COPY from="currentuser" />
          </FIELD>
        </FIELDS>
      </TRANSITION>
    
  6. 通过在默认原因后插入一个 REASON 元素,为起始转换添加一个“Ported”(移植)原因。 如果您进行此更改,则用户可以验证工作项是新的还是从另一个跟踪系统移植过来的。

    <TRANSITIONS>
      <TRANSITION from="" to="Unapproved">
        <REASONS>
          <DEFAULTREASON value="New" />
         <REASON value="Ported" />
        </REASONS>
      </TRANSITION>
    ...
    
  7. 在下面的示例中插入 COPY 规则。 此规则使创建工作项的用户名成为**“指派给”**字段的默认值,而且此规则只能在起始转换期间进行评估。

    <TRANSITIONS>
      <TRANSITION from="" to="Unapproved">
        <REASONS>
          <DEFAULTREASON value="New" />
         <REASON value="Ported" />
        </REASONS>
        <FIELDS>
           <FIELD refname="System.AssignedTo">
             <COPY from="currentuser" />
           </FIELD>
        </FIELDS>
      </TRANSITION>
    ...
    

    备注

    在其他 <TRANSITION> 或 <STATE> 元素下面插入此规则会将此规则的作用范围限定于其他转换或状态。

  8. 若要创建一个从 Unapproved 状态到 Active 状态的转换,请插入 TRANSITION 元素及其子元素,如下面的示例所示。 由于此更改,当某个“Special Task”被批准时,它可以执行此转换。

    <TRANSITIONS>
      <TRANSITION from="" to="Unapproved">
        <REASONS>
          <DEFAULTREASON value="New" />
         <REASON value="Ported" />
        </REASONS>
        <FIELDS>
           <FIELD refname="System.AssignedTo">
             <COPY from="currentuser" />
           </FIELD>
        </FIELDS>
      </TRANSITION>
      <TRANSITION from="Unapproved" to="Active">
        <REASONS>
          <DEFAULTREASON value="Approved" />
        </REASONS>
      </TRANSITION>
      <TRANSITION from="Active" to="Closed">
        <REASONS>
          <DEFAULTREASON value="Completed" />
          <REASON value="Deferred" />
          <REASON value="Obsolete" />
          <REASON value="Cut" />
        </REASONS>
    ...
    
  9. 单击**“保存”**将更改保存到该 XML 文件。

  10. 将更改后的“Special Task”工作项类型导入 Team Foundation Server。 为此,请重复以下过程中提供的步骤:导入“Special Task”类型并检查更改。

    请注意,初始**“状态”现在为“Unapproved”,并且“原因”默认为“New”。 此外,“指派给”值默认为您的帐户名称。 单击“原因”字段可以看到一个列表框,其中列出了原因“New”“Ported”**。

  11. 在**“标题”字段中,键入标题,然后单击“保存”保存该工作项。 等待保存操作完成(由状态栏上的“项已保存”**指示)。

  12. 在**“状态”字段中,选择“Active”值以批准该工作项并再次转换它。 请注意,“原因”字段默认为“Approved”**。

  13. 单击**“保存”**保存此转换。

  14. 单击**“关闭”**关闭该“Special Task”。

ms400654.collapse_all(zh-cn,VS.110).gif更改“Special Task”类型的窗体布局

前提条件:您必须已经完成更改“Special Task”类型的工作流过程。

更改表单布局

  1. 打开包含“Special Task”工作项类型定义的文件。 为此,请在 Visual Studio 中单击标记为**“SpecialTask.xml”**的选项卡。

  2. 找到该 XML 文件的 <TabGroup> 节。 注意,该部分有用于“Links”(链接)和“File Attachments”(文件附件)的 <Tab> 元素,其中每个 <Tab> 元素包含一个呈现各自控件的 <Control> 元素。

    <Tab Label="Links">
      <Control Type="LinksControl" />
    </Tab>
    <Tab Label="File Attachments">
      <Control Type="AttachmentsControl" />
    </Tab>
    
  3. 通过用下面的新 XML 替换上一步骤所示的 XML,将两个 <Tab> 元素合并为一个同时包含两个控件的“Links and Attachments”(链接和附件)<Tab> 元素。

    <Tab Label="Links and Attachments">
      <Control Type="LinksControl" Label="Links" LabelPosition="Top" />
      <Control Type="AttachmentsControl" Label="Attachments" LabelPosition="Top" />
    </Tab>
    
  4. 找到 <FORM> 的 <Layout> 定义中描述**“Classification”(分类)和“Status”**(状态)组的部分。

    <Group Label="Classification">
      <Column PercentWidth="100">
        <Control Type="WorkItemClassificationControl" FieldName="System.AreaPath" Label="Area" LabelPosition="Left" />
        <Control Type="WorkItemClassificationControl" FieldName="System.IterationPath" Label="Iteration" LabelPosition="Left" />
        <Control Type="FieldControl" FieldName="MyCompany.MyProcess.Category" Label="Category" LabelPosition="Left" />
      </Column>
    </Group>
    

    备注

    为获得最佳效果,每个 Control(控件)或 Group(组)应显示在一个 Column(列)中,即使该 Column 跨越整个窗体宽度也应如此。相应地,每个 Column 应该显示在一个 Group 中,即使该 Group 没有可见的标签或边界也应如此。

  5. 在下面的示例中选择 CONTROL 元素行,然后在**“编辑”菜单上单击“复制”**,将此内容复制到剪贴板备用。

      <Column PercentWidth="70">
        <Group>
          <Column PercentWidth="100">
            <Group Label="Classification">
              <Column PercentWidth="100">
                <Control Type="WorkItemClassificationControl" FieldName="System.AreaPath" Label="Area" LabelPosition="Left" />
                <Control Type="WorkItemClassificationControl" FieldName="System.IterationPath" Label="Iteration" LabelPosition="Left" />
                <Control Type="FieldControl" FieldName="MyCompany.MyProcess.Category" Label="Category" LabelPosition="Left" />
              </Column>
            </Group>
    
  6. 若要将 Classification 组从它在窗体上的当前位置移除,请从示例中删除下面的行:从 <Group Label="Classification"> 到 </Group>。

    <Layout>
      <Group>
        <Column PercentWidth="70">
          <Control Type="FieldControl" FieldName="System.Title" Label="&amp;Title:" LabelPosition="Left" />
        </Column>
        <Column PercentWidth="30">
          <Control Type="FieldControl" FieldName="Microsoft.VSTS.Common.Discipline" Label="&amp;Discipline:" LabelPosition="Left" />
        </Column>
      </Group>
      <Group Label="Classification">
        <Column PercentWidth="100">
          <Control Type="WorkItemClassificationControl" FieldName="System.AreaPath" Label="&amp;Area:" LabelPosition="Left" />
          <Control Type="WorkItemClassificationControl" FieldName="System.IterationPath" Label="&amp;Iteration:" LabelPosition="Left" />
          <Control Type="FieldControl" FieldName="MyCompany.MyProcess.Category" Label="Category" LabelPosition="Left" />
        </Column>
      </Group>
    
  7. 在 <TabGroup> 部分,找到下列定义**“Details”(详细信息)**选项卡的行:

    <Tab Label="Details">
      <Group>
        <Column PercentWidth="50">
          <Group Label="General">
            <Column PercentWidth="100">
              <Control Type="FieldControl" FieldName="Microsoft.VSTS.Common.Issue" Label="Iss&amp;ue:" LabelPosition="Left" />
              <Control Type="FieldControl" FieldName="Microsoft.VSTS.Common.ExitCriteria" Label="E&amp;xit criteria:" LabelPosition="Left" />
              <Control Type="FieldControl" FieldName="Microsoft.VSTS.Build.IntegrationBuild" Label="Integration &amp;build:" LabelPosition="Left" />
            </Column>
          </Group>
        </Column>
        <Column PercentWidth="50">
          <Group Label="Schedule">
            <Column PercentWidth="100">
              <Control Type="FieldControl" FieldName="Microsoft.VSTS.Scheduling.RemainingWork" Label="Remaining &amp;work (hours):" LabelPosition="Left" />
              <Control Type="FieldControl" FieldName="Microsoft.VSTS.Scheduling.CompletedWork" Label="Com&amp;pleted work (hours):" LabelPosition="Left" />
            </Column>
          </Group>
        </Column>
      </Group>
    </Tab>
    
  8. 若要将这些控件移至**“详细信息”**选项卡,请在 <Tab Label="Details"> 元素后粘贴剪贴板中的内容。

    <Tab Label="Details">
      <Control Type="WorkItemClassificationControl" FieldName="System.AreaPath" Label="Area" LabelPosition="Left" />
      <Control Type="WorkItemClassificationControl" FieldName="System.IterationPath" Label="Iteration" LabelPosition="Left" />
      <Control Type="FieldControl" FieldName="MyCompany.MyProcess.Category" Label="Category" LabelPosition="Left" />
      <Group>
        <Column PercentWidth="50">
          <Group>
            <Column PercentWidth="100">
              <Control Type="FieldControl" FieldName="Microsoft.VSTS.Common.Issue" Label="Issue" LabelPosition="Left" />
    ...
    
  9. 若要围绕移动的字段创建分组并将字段划分为两列,请添加 Group 和 Column 元素,如下面的示例所示:

    <Tab Label="Details">
      <Group Label="Classification">
        <Column PercentWidth="50">
          <Group>
            <Column PercentWidth="100">
              <Control Type="WorkItemClassificationControl" FieldName="System.AreaPath" Label="Area" LabelPosition="Left" />
              <Control Type="WorkItemClassificationControl" FieldName="System.IterationPath" Label="Iteration" LabelPosition="Left" />
            </Column>
          </Group>
        </Column>
        <Column PercentWidth="50">
          <Group>
            <Column PercentWidth="100">
              <Control Type="FieldControl" FieldName="MyCompany.MyProcess.Category" Label="Category" LabelPosition="Left" />
            </Column>
          </Group>
        </Column>
      </Group>
      <Group>
        <Column PercentWidth="50">
          <Group>
            <Column PercentWidth="100">
              <Control Type="FieldControl" FieldName="Microsoft.VSTS.Common.Issue" Label="Issue" LabelPosition="Left" />
    ...
    
  10. 单击**“保存”**将更改保存到该 XML 文件。

  11. 将更改后的“Special Task”工作项类型导入 Team Foundation Server。 为此,请重复以下过程中提供的步骤:导入“Special Task”类型并检查更改。

    请注意,Classification 组已不再在主窗体上。 单击**“Links and Attachments”选项卡和“Details”**选项卡以查看所做更改的结果。

  12. 单击**“关闭”关闭新的“Special Task”。 提示您保存工作项时,请单击“否”**。

请参见

概念

自定义项目跟踪数据、窗体、工作流及其他对象