首页 > 其他分享 >搭建Wpf框架(18) ——DataGrid实现右冻结

搭建Wpf框架(18) ——DataGrid实现右冻结

时间:2023-12-02 22:23:11浏览次数:29  
标签:ScrollViewer ScrollChanged 18 DataGrid rightScrollViewer rightDataGrid Wpf scrol

19.搭建Wpf框架(18) ——DataGrid实现右冻结 先上效果图:

 

其中,Field3和Field4为右冻结列。

将一下大致思路,

1.在DataGrid右边再放一个DataGrid,用来显示右冻结的列,把冻结的列从左边的DataGrid移除。 2.然后左边的DataGrid右侧的滚动条隐藏,横向滚动条显示,右边的DataDataGrid右侧的滚动条显示,横向滚动条显示,代码如下:

   <Grid>
       <Grid.ColumnDefinitions>
           <ColumnDefinition Width="*"/>
           <ColumnDefinition Width="Auto"/>
       </Grid.ColumnDefinitions>
       <ScrollViewer x:Name="PART_ScrollViewer"
              Focusable="false">
              ...
       </ScrollViewer>
       <controls:DataGridScrollView x:Name="PART_Right"  Grid.Column="1" Visibility="Collapsed"
                 ItemsSource="{TemplateBinding ItemsSource}" 
                 AutoGenerateColumns="{TemplateBinding AutoGenerateColumns}"
                 CanUserSortColumns="False"
                 CanUserAddRows="False" 
                 IsReadOnly="True" 
                 Style="{StaticResource AIStudio.Styles.DataGrid}" 
                 ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                 ScrollViewer.VerticalScrollBarVisibility="{Binding ElementName=PART_ScrollViewer,Path=ComputedVerticalScrollBarVisibility}"/>
   </Grid>

3.然后是两个DataGrid的ScrollViewer的同步滚动和选中项互相同步的问题,在CS中实现,代码如下:

 public override void OnApplyTemplate()
 {
     base.OnApplyTemplate();
     if (_scrollViewer != null)
     {
         _scrollViewer.ScrollChanged -= ScrollViewer_ScrollChanged;
     }
     if (_rightScrollViewer != null)
     {
         _rightScrollViewer.ScrollChanged -= _rightScrollViewer_ScrollChanged;
     }
     if (_rightDataGrid != null)
     {
         _rightDataGrid.ScrollViewerChanged -= ScrollViewerChanged;
         _rightDataGrid.SelectionChanged -= _rightDataGrid_SelectionChanged;
     }

     _scrollViewer = GetTemplateChild(PART_ScrollViewer) as ScrollViewer;
     if (_scrollViewer != null)
     {
         _scrollViewer.ScrollChanged += ScrollViewer_ScrollChanged;
     }

     _rightDataGrid = GetTemplateChild(PART_Right) as DataGridScrollView;
     if (_rightDataGrid != null)
     {
         _rightDataGrid.ScrollViewerChanged += ScrollViewerChanged;
         _rightDataGrid.SelectionChanged += _rightDataGrid_SelectionChanged;
     }
     this.SelectionChanged += DataGridRightFrozen_SelectionChanged;
 }

 private void ScrollViewerChanged(ScrollViewer viewer)
 {
     _rightScrollViewer = viewer;
     _rightScrollViewer.ScrollChanged += _rightScrollViewer_ScrollChanged;
 }

 private void ScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
 {
     if (_rightScrollViewer != null)
     {
         _rightScrollViewer.ScrollToVerticalOffset(_scrollViewer.VerticalOffset);
     }
 }

 private void _rightScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
 {
     if (_scrollViewer != null)
     {
         _scrollViewer.ScrollToVerticalOffset(_rightScrollViewer.VerticalOffset);
     }
 }

 private void _rightDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
 {
     this.SetCurrentValue(SelectedItemProperty, _rightDataGrid.SelectedItem);
 }

 private void DataGridRightFrozen_SelectionChanged(object sender, SelectionChangedEventArgs e)
 {
     _rightDataGrid.SetCurrentValue(SelectedItemProperty, SelectedItem);
 }

大致就是这样

最后老规矩,上源码地址:

https://gitee.com/akwkevin/AI-wpf-controls

技术交流 个人QQ:80267720 QQ技术交流群1:51286643(已满),QQ技术交流群2:51280907

标签:ScrollViewer,ScrollChanged,18,DataGrid,rightScrollViewer,rightDataGrid,Wpf,scrol
From: https://www.cnblogs.com/akwkevin/p/17872348.html

相关文章

  • CF718A解题报告
    CF718A解题报告题意给你一个长度为\(n\)的浮点数,最多四舍五入\(t\)次,求可以得到的最大值。注意:四舍五入之针对小数部分,不针对整数部分。输出时不能有前缀\(0\),和后缀\(0\)。当最大的数变成整数了,就不输出小数点。分析根据题面,很容易想到要用贪心,只需要再加那么一......
  • 国标GB28181平台LiteCVR如何快速配置平台国标级联?
    今天我们就来介绍一下LiteCVR如何配置平台级联。具体操作步骤如下:1、平台级联在级联中,LiteCVR既可以作为下级平台,也可以作为上级平台,并支持同时级联多个上级平台。作为上级平台时,下级平台按照设备接入方式,配置LiteCVR的SIP信息即可。作为下级平台时,则要在【配置中心】-【国标级联】......
  • 国标GB28181安防LiteGBS视频平台:批量绑定角色与取消设备的开发过程
     国标GB28181协议视频平台LiteGBS支持多路设备同时接入,并对多平台、多终端分发出RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。GB28181视频监控国标平台LiteGBS可支持多分屏播放实时监控视频,画面支持1、4、9、16个,可同时播放多路视频流。今天介绍一下LiteGBS新开发的角色批量绑定......
  • GB28181视频监控平台LiteCVR调取登录接口获取token的操作步骤
    视频监控设备是安防行业的细分专业领域,近年来,随着计算机、网络、图像处理以及传输技术的飞速发展,视频监控技术也迎来质的飞跃,实现从“简单化”到“多元化”的发展。数以万计的监控摄像头遍布城市各个角落,为人们的安全带来有力保障。安防视频监控管理平台LiteCVR能在复杂的网络环......
  • NKOJ2180证明
    这是一个经典模板,先看老板的PPT但其实我个人觉得从冒泡排序理解是不好理解的这个问题的本质还是证明这种做法是正确的首先,逆序对个数是下限,因为交换一次相邻两个数,通过对这两个数的相对大小的讨论,会发现最多让逆序对个数减少一然后我们要找到一种合理的方法来达到这个下限,就......
  • P4770 [NOI2018] 你的名字 做题记录
    我永远喜欢数据结构题目传送门给出字符串\(s\)以及\(q\)个询问,第\(i\)个询问给出一个串\(t_i\)以及一个区间\([l_i,r_i]\)。记\(s[l,r]\)为字符串\(s\)第\(l\)位到第\(r\)位字符顺次拼接而成的子串。形式化地,\(s[l,r]=\overline{s_ls_{l+1}\dotss_r}\)......
  • CF1896D Ones and Twos 题解
    题意:思路:先考虑不带修:如果长度为$n$的序列$a$中无$1$,当且仅当$2\les\lesum(1,n)$时,一定有解;否则,一定无解。通过$set$维护序列$a$中每个$1$的位置,找到最靠左的$1$的位置$l$以及最靠右的$1$的位置$r$。对于区间$[l,n]$,由......
  • 代码随想训练营第五十二天(Python)| 300.最长递增子序列、674. 最长连续递增序列、718.
    300.最长递增子序列classSolution:deflengthOfLIS(self,nums:List[int])->int:iflen(nums)<=1:returnlen(nums)#dp数组代表以nums[i]结尾的最长递增子序列长度为dp[i]dp=[1]*len(nums)res=1......
  • react18 typeScript useSelector 提示state 类型未知
     解决方案store/index.tsximport{configureStore}from'@reduxjs/toolkit';import{useSelector,useDispatch}from'react-redux'importtype{TypedUseSelectorHook}from'react-redux'importuserfrom'./modules/user&#......
  • CF1835D Doctor's Brown Hypothesis 题解
    题目链接点击打开链接题目解法首先只有在一个强联通分量里的点对才可能合法,因此我们这里说的图默认为强联通图但是上面的条件成立只需要满足\(k\gen\),考虑用好\(k\)可以认为是极大的性质所以说我们可以通过图中所有的环\(+\)路径来凑出\(k\)不难发现,所有的环能构成的......