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

本文共 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

你可能感兴趣的文章
RDD之五:Key-Value型Transformation算子
查看>>
percona 5.7.11root初始密码设置
查看>>
Cognitive Security的异常检测技术
查看>>
Pyrex也许是一个好东西
查看>>
WINFORM WPF字体颜色相互转换
查看>>
能力不是仅靠原始积累(三)
查看>>
彻底学会使用epoll(一)——ET模式实现分析
查看>>
脱离标准文档流(2)---定位
查看>>
IO流之字符流
查看>>
集合异常之List接口
查看>>
Softmax回归
查看>>
紫书 习题11-11 UVa 1644 (并查集)
查看>>
App工程结构搭建:几种常见Android代码架构分析
查看>>
使用openssl进行证书格式转换
查看>>
Callable和Future
查看>>
少用数字来作为参数标识含义
查看>>
ScrollView中嵌套ListView
查看>>
观察者模式
查看>>
在properties.xml中定义变量,在application.xml中取值问题
查看>>
【故障处理】ORA-12545: Connect failed because target host or object does not exist
查看>>