博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UWP Composition API - 锁定列的FlexGrid
阅读量:6088 次
发布时间:2019-06-20

本文共 3670 字,大约阅读时间需要 12 分钟。

需求是第一列锁定,那么怎么让锁定列不跟着滚动条向做移动呢?

其实很简单,让锁定列跟scrollviewer的滚动做反方向移动。

先看一下这个控件的模板,嗯,其实很简单,就是ListView的模板,不同的是ScrollViewer 加上了TopHeader作为Column header。

而这个自定义的ListView的ItemContainer需要重写。

protected override bool IsItemItsOwnContainerOverride(object item)        {            return item is FlexGridItem;            return base.IsItemItsOwnContainerOverride(item);        }        protected override DependencyObject GetContainerForItemOverride()        {            return new FlexGridItem();            return base.GetContainerForItemOverride();        }

这个重写的FlexGridItem 是继承于ListVIewItem,ListViewItem的模板也得重写,重点改变在下面:

frozenContent就是我们将要锁定的列。 在FlexGridItem里面我们让frozenContent跟着Scrollviewer 丝滑的水平滑动.
internal void StartAnimation(ScrollViewer sv)        {            _sv = sv;            if (_frozenContent == null || _sv == null || _pressedHider == null || _frozenContentVisual != null)            {                return;            }            _scrollerViewerManipulation = ElementCompositionPreview.GetScrollViewerManipulationPropertySet(sv);            _compositor = _scrollerViewerManipulation.Compositor;            _offsetAnimation = _compositor.CreateExpressionAnimation("-min(0,ScrollManipulation.Translation.X)");            _offsetAnimation.SetReferenceParameter("ScrollManipulation", _scrollerViewerManipulation);            _frozenContentVisual = ElementCompositionPreview.GetElementVisual(_frozenContent);            _pressedHiderVisual = ElementCompositionPreview.GetElementVisual(_pressedHider);            _frozenContentVisual.StartAnimation("Offset.X", _offsetAnimation);            _pressedHiderVisual.StartAnimation("Offset.X", _offsetAnimation);        }

看过之前使用UWP Composition API的童鞋肯定对这个代码还是很眼熟。ScrollViewer 向右移动100,锁定的内容也向右移动100,这样看起来锁定的内容就像是不动的一样。

不过这种由ListView继续的Grid 局限是比较多,不能随自己的想法来操作ScrollViewer。想要更多功能的童鞋可以看看.

开源有益:

注意: Composition API 只支持10586以及更高的版本,判断条件如下:

使用条件:

// Windows build 10240 and later.     if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 1))    {        ...    }    // Windows build10586 and later.    if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 2))    {        ...    }    // Windows build14332 and later.    if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 3))    {        ...    }
调试了下
1. Windows build14332 and later: 1,2,3都为true。 2. Windows build10586 and later: 1,2为true。
3. Windows build 10240 and later: 1为true。

因为10586之前的版本是不支持Composition API的。所以使用的时候记得判断:

// Windows build10586 and later.    if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 2))    {        ...    }
 

 

转载于:https://www.cnblogs.com/FaDeKongJian/p/5860148.html

你可能感兴趣的文章
AI为移动医疗APP加码
查看>>
Webpack 入门教程一
查看>>
Keras上的VGGNet、ResNet、Inception与Xception
查看>>
关于python的bottle框架跨域请求报错问题的处理
查看>>
dirname() 函数
查看>>
Fms3中client端与server端交互方式汇总
查看>>
SVG系列一
查看>>
VS2005环境下的DLL应用
查看>>
windows终止处理程序( __try __finally) 简单解析
查看>>
Configuring Default-network for EIGRP
查看>>
Redis集群部署文档(centos6系统)
查看>>
部署docker-gitlab
查看>>
构建富互联网应用程序监控工作流和流程(5)
查看>>
美研制自我复制机器人 10年内吞噬所有沙漠
查看>>
ls -l命令详解
查看>>
php分页必用的几个单词
查看>>
Linux用户管理(九)Linux网络基础
查看>>
redhat 6.5 YUM安装kvm 并用VNC远程管理
查看>>
HCL模拟器的telnet实验(password和scheme)
查看>>
MySQL 级联复制(A->B->C)
查看>>