微软宣告官方TFS 200九 Scrum 模板

   在看过1篇文章  

转自:

WPF自定义控件之列表滑动特效 PowerListBox  http://www.cnblogs.com/ShenNan/p/4993374.html\#3619585 达成了滑动的特效(正是动画)之后 ,觉得很有趣 也想在 UWP里面完结。最棒效率如下图片 1

接下去就说说是怎么落实的吗:

一. 添加 Behaviors

  右键项目 选中 “管理 NuGet
程序包”图片 2

然后搜索 Behaviors 添加图片 3

 

 2 . 添加二个新的类

      这么些类就叫

ListViewBehavior 

吧 继承 DependencyObject, 继承接口 IBehavior
然后突显一连这么些接口的四个措施

  public class ListViewBehavior : DependencyObject, IBehavior
    {
        public DependencyObject AssociatedObject { get; set; }

        public void Attach(DependencyObject associatedObject)
        {
            throw new NotImplementedException();
        }

        public void Detach()
        {
            throw new NotImplementedException();
        }
    }

下一场在那么些类里面添加1些属性,等会会用到

  public DependencyObject AssociatedObject { get; set; }

        /// <summary>
        /// 需要做动画的列表
        /// </summary>
        public ListView ListView;

        /// <summary>
        /// listView 里面的滚动条
        /// </summary>
        public ScrollViewer scroll;

          /// <summary>
          /// 容器的布局方向
           /// </summary>
            private Orientation _panelOrientation;

        /// <summary>
        /// 当前可视化视图的第一项
        /// </summary>
        private int firstVisibleIndex;

        /// <summary>
        /// 当前可视化视图的最后一项
        /// </summary>
        private int lastVisibleIndex;

        /// <summary>
        /// 上次滚动时可视化视图的第一项
        /// </summary>
        private int oldFirstVisibleIndex;

        /// <summary>
        /// 上次滚动时可视化视图的最后一项
        /// </summary>
        private int oldLastVisibleIndex;

        /// <summary>
        /// 标识,是否已找到第一项
        /// </summary>
        private bool isFindFirst;

        /// <summary>
        /// 当前累计已遍历过的Item高度或宽度的值,用于寻找第一项和最后一项
        /// </summary>
        private double cumulativeNum;




        public void Attach(DependencyObject associatedObject)
        {

        }

        public void Detach()
        {

        }

品质都准备好了那大家今后上马进入正式的接轨吧 , 在 Attach
方法里面添加代码

public void Attach(DependencyObject associatedObject)
        {
           //获取 ListView 列表对象
            ListView = associatedObject as ListView;

            if (ListView ==null )
            {
                return;
            }

            //传进来的 对象不为空,我们就对这个对象注册一个事件
            ListView.Loaded += ListView_Loaded;
        }

ListView_Lodaded 代码:

 /// <summary>
        /// 列表对象加载完成后的逻辑代码
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ListView_Loaded(object sender, RoutedEventArgs e)
        {
            //查找滚动视图,并赋值到我们刚刚添加的属性里
            scroll = FindVisualChild<ScrollViewer>(ListView, "ScrollViewer");
            //判断是否为空,不为空的话就添加一个事件
            if (scroll == null)
            {
                return;
            }
            else
            {
                //监听滚动事件
                scroll.ViewChanged += Scroll_ViewChanged;
            }

             ItemsPresenter v =
FindVisualChild<ItemsPresenter>(ListView, “”);

             ItemsStackPanel items =
FindVisualChild<ItemsStackPanel>(v,””);

             _panelOrientation = items.Orientation;

        }

 /// <summary>
        /// 获取模板控件
        /// </summary>
        /// <typeparam name="T">获取的类型</typeparam>
        /// <param name="obj">控件对象</param>
        /// <returns></returns>
        protected T FindVisualChild<T>(DependencyObject obj, string name) where T : DependencyObject
        {
            //获取控件可视化树中的子对象数量
            int count = VisualTreeHelper.GetChildrenCount(obj);

            //根据索引遍历每一个对象
            for (int i = 0; i < count; i++)
            {
                var child = VisualTreeHelper.GetChild(obj, i);
                //根据参数判断是不是我们要找的对象,如果是 就返回,并退出该方法,
                //如果不是则再递归到下一层查找
                if (child is T && ((FrameworkElement)child).Name == name)
                {
                    return (T)child;
                }
                else
                {
                    var child1 = FindVisualChild<T>(child, name);

                    if (child1 != null)
                    {
                        return (T)child1;
                    }


                }
            }

            return null;

        }

 

当今壹度收获到了 列表的 ScrollViewer 对象了 就能够执行这一个动画最宗旨的局部了,正是经过监听 滚动事件 来取得大家要求做动画的控件了。

 /// <summary>
        /// 监听滚动事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Scroll_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
        {
            //每次滚动时都计算当前可视化区域的首尾项
            CalculationIndex();
        }

再添加三个字段

 /// <summary>
        /// 列表子控件的高度
        /// </summary>
        private double itemsHeight;
        //平移特效对象
        private TranslateTransform tt;

  /// <summary>
        /// 计算可视化区域的第一项和最后一项
        /// </summary>
        private void CalculationIndex()
        {
            //赋值旧的第一个可视化视图
            oldFirstVisibleIndex = firstVisibleIndex;
            //赋值最后一个可视化视图
            oldLastVisibleIndex = lastVisibleIndex;

            ;
            //标记第一项是否找到了
            isFindFirst = false;
            //判断列表的方向
            if (_panelOrientation == Orientation.Vertical)
            {
                cumulativeNum = 0.0;


                //遍历列表的全部可视化视图,寻找第一项和最后一项
                for (int i = 0; i < ListView.Items.Count; i++)
                {


                    //转换成 ListViewItem 对象,用于操作
                    var _item = ListView.ContainerFromIndex(i) as ListViewItem;

                    //这里有个坑,应为 ListView 支持虚拟化的,所以每次获取列表的
                    //子项最多只会有20项左右,所以我们要记录一下 高度,将所遍历到的
                    //可视化视图的高度累加。

                    if (_item == null)
                    {

                        cumulativeNum += itemsHeight;
                    }
                    else
                    {
                        itemsHeight = _item.ActualHeight;
                        cumulativeNum += _item.ActualHeight + _item.Margin.Top + _item.Margin.Bottom;

                    }
                    //判断当前所累加的高度大于我们滚动的距离找到 现在显示在屏幕上的第一项
                    if (!isFindFirst && cumulativeNum >= scroll.VerticalOffset)
                    {
                        //记录第一项的索性
                        firstVisibleIndex = i;
                        //表明第一项已经找到了
                        isFindFirst = true;

                        Up();
                    }

                    //当前所累加的高度 大于 当前移动的距离和 滚动视图的可见高度,找出最后一项
                    if (cumulativeNum >= (scroll.VerticalOffset + scroll.ViewportHeight))
                    {
                        //记录最后一项的索引
                        lastVisibleIndex = i;

                        Down();

                        //已经找到的第一项和最后一项了 跳出循环
                        break;
                    }


                    ;

                }
            }

        }

 

提及底 三个开始展览动画的格局:

  /// <summary>
        /// 滚动条向下,类容向上移动
        /// </summary>
        private void Down()
        {

            if ((firstVisibleIndex == oldFirstVisibleIndex && lastVisibleIndex == oldLastVisibleIndex) || oldFirstVisibleIndex == 0 && oldLastVisibleIndex == 0)
                return;

            //判断 当前最后一项 是否大于上次移动的最后一项
            if (lastVisibleIndex > oldLastVisibleIndex)
            {
                //获取可视化对象
                var _item = ListView.ContainerFromIndex(lastVisibleIndex) as ListViewItem;
                //
                tt = new TranslateTransform();

                //这里要判断一下 当前可视化是否为空,如果你移动得比较快的化,列表的虚拟化会给不到对象来的。
                if (_item == null)
                {
                    return;
                }


                _item.RenderTransform = tt;

                Storyboard board = new Storyboard();

                //创建一个 double 动画
                DoubleAnimation animation = new DoubleAnimation() { AutoReverse = false, RepeatBehavior = new RepeatBehavior(1), EnableDependentAnimation = true, To = 0, From = _item.ActualWidth / 2, Duration = TimeSpan.FromSeconds(0.2) };
                Storyboard.SetTarget(animation, tt);
                Storyboard.SetTargetProperty(animation, nameof(TranslateTransform.X));

                board.Children.Add(animation);

                board.Begin();




            }
        }

        /// <summary>
        /// 滚动条向上,内容向下
        /// </summary>
        private void Up()
        {
            if (firstVisibleIndex < oldFirstVisibleIndex)
            {
                var _item = ListView.ContainerFromIndex(firstVisibleIndex) as ListViewItem;

                tt = new TranslateTransform();
                if (_item == null)
                {
                    return;
                }
                _item.RenderTransform = tt;



                Storyboard board = new Storyboard();


                DoubleAnimation animation = new DoubleAnimation() { AutoReverse = false, RepeatBehavior = new RepeatBehavior(1), EnableDependentAnimation = true, To = 0, From = _item.ActualWidth / 2, Duration = TimeSpan.FromSeconds(0.3) };
                Storyboard.SetTarget(animation, tt);
                Storyboard.SetTargetProperty(animation, nameof(TranslateTransform.X));

                board.Children.Add(animation);

                board.Begin();


            }
        }

 

本条了类已经形成了最后我们在前台调试一下呢:前台代码:

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <ListView x:Name="listView"   >
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem" >
                    <Setter Property="HorizontalContentAlignment" Value="Stretch" ></Setter>
                </Style>
            </ListView.ItemContainerStyle>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch"  >
                        <Rectangle Height="100" Fill="Red"  HorizontalAlignment="Stretch"  Margin="5" ></Rectangle>
                        <TextBlock Text="{Binding }" FontSize="50" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="20" ></TextBlock>
                    </Grid>
                </DataTemplate>
            </ListView.ItemTemplate>




            <interactivity:Interaction.Behaviors>
                <local:ListViewBehavior></local:ListViewBehavior>
            </interactivity:Interaction.Behaviors>
        </ListView>


    </Grid>

就像此大家就完了了一个轮转列表特效了,我们可以在 Down 和 Up
那多个法子里面修改其动画效果能够变得愈加酷点,
率先次写博客。。。。。。。呜呜呜

http://www.almnetworks.net/zh-CN/post/2010/06/10/Microsoft-Released-Official-Scrum-Process-Template-for-Team-Foundation-Server-2010.aspx

 

近年在看Brian 哈利的博客,发现微软刚好发表了TFS 二零一零方面使用的Scrum
v一.0 beta版的沙盘,就算照旧beta版本,可是曾经是老大scrum化的模版。 

http://blogs.msdn.com/b/bharry/archive/2010/06/07/a-scrum-process-template-for-tfs.aspx

趁清晨的时辰啊这些模板安装在本人的测试TFS服务器上,简单测试了须臾间:

#1 – 安装很便捷

依照包里包蕴了模版文件和SharePoint门户的wsp部属包:

 

图片 4

 

使用模板管理器能够很方面包车型地铁把模版计划到服务器上:

 

图片 5Stack Rank 

 

#二 – 流程模板指南今后针对Scrum.org

自身使用那个新模版创设了2个档次,发现流程模版指南里显示的scrum.org;小编个人觉得假若指向Scrum
Guide大概会更好一点 (http://www.scrum.org/scrumguides/).
 

 

图片 6 

 

#三 – 工作项全体针对Scrum进行了优化

办事项已经被更新为完全Scrum化的类型,名称相符Scrum的常用标准:

  • Product Backlog Item(PBI产品供给列表项): 代替了User Story 

  • Impediment(障碍工作项): 代替了 Issues,那么些工作项是Scrum
    Master用来记录阻碍团队寻常开支的拦路虎的办事项,是Scrum
    Master的办事首要

  • Task (职分工作项)

  • Test Case (测试用例工作项)

  • Shared Steps (共享测试步骤工作项)

  • Bug (缺陷工作项)

  • Sprint(Scrum中的迭代): 那是全新的劳作项,用来记录和迭代有关的剧情,如:迭代伊始/甘休时间,审核会议记录等内容。

图片 7 

 

Product Backlog Work ItemPBI产品供给列表项
:

 

行使新的Scrum模板创制了3个PBI工作项,发现那不然而User
Story的工作项的更名那么粗略: 

图片 8  

切实看一下PBI的情节: 

–       Backlog Priority (优先级): 代替了User Story中的Stack
Rank和Story
Points,PO能够动用这一个值来对PBI进行先期级的标号,这是PO的关键办事内容之1;
–       Effort(工作量): 这表示了用来成功方今PBI所急需的工作量;
–       Business Value(商业价值):
用来衡量PBI对用户的价值的相对值;
–       Tasks(职分列表):
那里要求链接到全体实现当前PBI的职务工作项;
–      Test Cases(测试用例):
大家在定义Scrum项指标PBI的同时须求对如何对近期PBI进行测试举行定义,也正是UAT。那也是Scrum方式中的需要所分裂之处,壹边来说必要仅仅是对用户的渴求开始展览描述,可是Scrum需要我们对用户如何测试这么些要求也还要开始展览定义,以担保须要的实惠;
–       Acceptance
Criteria(接受规范):
那里应该对近期PBI的接受规范进行定义,应该1致done
criteria,不过一般的话,我们不会对每1个PBI选取差异的done criteria。 

PBI的情事转换: 

本身觉得那里的景色立异很好,因为它更好的反映了scrum方式的劳作流程。首先PBI处于New的情状,然后由PO/干系人审核,变为Approved状态;在迭代布置会议上,PO会把PBI的内容交付给团队,共青团和少先队必要予以PO承诺他们将按须求实现供给,那是更换为Committed;最后当组织成功了那几个须求的时候,转变为Done的状态。(作者个人直接以为微软的流程模板的美貌在于其场所转换,很好的对景况转换举行定义意味着大家得以对集体的做事流程展开更好的主宰;现在的MSF
Agile模板因为过于追求通用型,对气象转换的概念往往不只怕满足开发团队供给,那么些Scrum模板为大家提供了3个1贰分的例证)。 
 

图片 9

事态包含:

–       New
–       Approved/Removed
–       Committed
–       Done    

 

Sprint 迭代工作项:

那是Scrum流程模板中的全新工作项,也是过去的Agile模板所缺点和失误的显要工作项项目。其剧情囊括迭代的开首/截止时间,迭代的目的定义和迭代的核查会议(Restrospective)的笔录模板。
审核会议(Retrospective
Meeting)是Scrum的精华内容:Scrum鼓励集体针对实情对工作流程,团队组织,任务分配等等举行连发的优化,以便可以找到适合团队的办事章程;审核会议是Scrum为团队提供的反省开发流程的火候,对那一个剧情展开定义能够为大家立异流程提供尤其好的实际基础。

图片 10

 

Task 义工项:

 

Scrum中的职责不关注任务上的骨子里工时,因而大家未有在这几个义工项上收看Completed
Work数据域,而仅仅保留了剩下工作量Remaining
Work数据域。那自然是Scrum形式的性情之壹,不过对于依靠于工作时辰来接受开发支出的咨询类软件集团来说,实际工作时间是老大有意义的数据。

除此以外值得大家注意的是任务工作项的状态有:To do, In
Progress和Done,1个状态。那是一个老大棒的改变,就如本人事先说过的,状态的变换代表了开发组织的劳作措施。对于自己的话,卓殊敬重小编的团伙每一日正在那多少个剧情上工作,所以那几个In
Progress的景色就格外重要了。

图片 11 

 

Bug 缺陷工作项:

 

症结工作项同样有相比较大的革新,尤其必要注意的是Backlog
Priority这么些数据域;很三个人都对怎么处理Bug工作项有疑点,Bug到底应该亦然职分依然1如既往PBI,这里Scrum模板为我们很好的解答了那几个题目:Bug工作项应该是1致PBI的出品须求。因为实际Bug也是壹种供给,是壹种缓解缺陷的急需,普通的PBI则是1种添加越来越多商业价值的需求(注意是商业价值而不是法力,因为scrum中的须要是工作导向的,而不是作用导向的)。

 

图片 12 

测试用例和共享测试步骤工作项:

那自然就不是scrum的始末,而是MSF Agile中的内容,在此处获得了封存。 

#四 – 工作项查询也作了优化,很方便

Scrum v1.0
Beta 模板包含了3个“当前迭代”的询问目录,里面包蕴了颇具针对当下迭代的查询;万分方便使用并得以很简单的拓展复制以便协理后续的迭代。

图片 13

–       Product backlog:
那里你可以观望PBI和Bug工作项项目被选定,他们都以成品需求列表的剧情。

图片 14

–       Sprint Backlog
迭代须求列表: 除了PBI和Bug之外,还包涵了有关的职务   

图片 15

–       Work in Progress
正在展开的干活: 这一个查询太有用了,每一日清晨都已运行一下,就知道团队今天要干嘛了。  

图片 16

–       Open Impediments 未缓解的绊脚石: 那会是Scrum
Master用的最多的查询,看看团队以往有那么些难点阻碍他们健康费用?

图片 17

#五 – 报表还索要更始

当前的Scrum模板仅仅包涵了Scrum中最常用的一个表格,还需求多多革新。依据Brian
哈利的传教,他们会把Agile模板中的一些常用报表包涵进来,尤其是1些软件工程类的保驾,比如:构建报表。 

Release Burndown
Indicates how quickly the team is completing work and delivering Product
Backlog Items. Its primary use is for planning when to schedule a
release and to track the team’s progress towards delivering on its
goals.

图片 18

Sprint Burndown
Indicates the team’s progress towards completing its work for a sprint.

图片 19

Velocity
Indicates the amount of effort the team is completing in each sprint.

图片 20

As I don’t have any data in the database yet, I just copied above
screenshots from Brian’s blog.

#陆 – 门户和文书档案模板方面还索要过多的劳作

门户能够说还完全是空的,里面未有找到其余的Excel模板,报表和doc文档模板;看来那终归照旧beta版。笔者可怜期待微软得以把Agile
Workbook包罗进来,那是Agile
五.0中间三个足够好用的沙盘,对于我们开始展览安顿会议13分实惠。

总结

当然,就像每两个微软出品的v一壹样,对于Scrum
v1.0模板笔者同一也尚无太高的期望值。然而经过上述大家得以看出这些模板格外的Scrum化,基本上满足了四个Scrum团队的工具供给。当然,一般的软件集团是不太敢使用beta版的模版的,因为模板的改观在TFS中依然是四个很难堪复杂的长河。

PS:近日不可胜举人都曾经试用过那么些模板了,有人反应为啥不帮助Microsoft
Project;关于敏捷项目是或不是相应选择Project那些题材大家是个有观点,有人以为火速项目不应该利用Project来展开管理;有人觉得Project很关键。其实就好像Scrum所推行的意见1如既往,模板/流程/方法论都必须和实在的开发社团,集团文化,技术完毕所涉嫌;作者个人认为用不用Project不根本,假若Project能够很好的缓解难点,那么就用,不用担心用了Project就不飞速的标题。工具是给人用的,不要被工具所制约就好。

 

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注