热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WPF循环显示列表

原文:WPF循环显示列表版权声明:本文为博主原创文章,未经博主允许不得转载。https:blog.csdn.netSANYUNIarticledetails7942370
原文: WPF 循环显示列表

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SANYUNI/article/details/79423707

项目需要类似手机上设置时间的控件,可以一直滚动显示的内容连续的。在WPF中找到的列表控件只能滚到最后再反向滚动。

基于ScrollViewer和StackPanel来改造,Xaml如下:

<Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="{Binding RelativeSource={RelativeSource AncestorType=local:ScrollList},Path=ItemHeight}"/>
            <RowDefinition/>
        Grid.RowDefinitions>
        <ScrollViewer x:Name="tt" Grid.RowSpan="3" PreviewMouseWheel="tt_PreviewMouseWheel" ScrollViewer.VerticalScrollBarVisibility="Hidden" >
            <StackPanel x:Name="stacktt" Background="Gray">
            StackPanel>
        ScrollViewer>

        <Rectangle Height="1" Fill="Red" Grid.Row="1" VerticalAlignment="Top"/>
        <Rectangle Height="1" Fill="Red" Grid.Row="1" VerticalAlignment="Bottom"/>
    Grid>

cs代码如下:

    public partial class ScrollList : UserControl
    {
        public ScrollList()
        {
            InitializeComponent();
            this.Loaded += ScrollList_Loaded;
        }

        private void ScrollList_Loaded(object sender, RoutedEventArgs e)
        {
            stacktt.Children.Clear();
            for (int index = 0; index new TextBlock() { Height=ItemHeight};
                stacktt.Children.Add(text);
            }
            RefreshData();
        }

        public List<int> DataSource
        {
            get { return (List<int>)GetValue(DataSourceProperty); }
            set { SetValue(DataSourceProperty, value); }
        }

        // Using a DependencyProperty as the backing store for DataSource. This enables animation, styling, binding, etc...
        public static readonly DependencyProperty DataSourceProperty =
            DependencyProperty.Register("DataSource", typeof(List<int>), typeof(ScrollList), new PropertyMetadata(new List<int>()));




        public int SelectData
        {
            get { return (int)GetValue(SelectDataProperty); }
            set { SetValue(SelectDataProperty, value); }
        }

        // Using a DependencyProperty as the backing store for SelectData. This enables animation, styling, binding, etc...
        public static readonly DependencyProperty SelectDataProperty =
            DependencyProperty.Register("SelectData", typeof(int), typeof(ScrollList), new PropertyMetadata(0));



        public int ItemHeight
        {
            get { return (int)GetValue(ItemHeightProperty); }
            set { SetValue(ItemHeightProperty, value); }
        }

        // Using a DependencyProperty as the backing store for ItemHeight. This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ItemHeightProperty =
            DependencyProperty.Register("ItemHeight", typeof(int), typeof(ScrollList), new PropertyMetadata(20));



        int ShowItemCount { get {
                return (int)ActualHeight / ItemHeight;
            } }

        int startIndex = 0;


        private void tt_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
        {
            Console.WriteLine("TimeStap={0} Delta={1}", e.Timestamp, e.Delta);

            if (DataSource.Count == 0)
                return;

            if (e.Delta > 0)
            {
                if ((startIndex + ShowItemCount) 1;
                }
                else
                {
                    startIndex = 0;
                }
            }
            else
            {
                if ((startIndex - ShowItemCount) <0)
                {
                    startIndex = DataSource.Count - 1;
                }
                else
                {
                    startIndex -= 1;
                }

            }

            RefreshData();

        }

        private void RefreshData()
        {
            if (DataSource.Count > 0)
            {
                int count = 0;
                foreach (var item in stacktt.Children)
                {
                    if ((startIndex + count) > (DataSource.Count - 1))
                    {
                        (item as TextBlock).Text = DataSource[startIndex + count - DataSource.Count].ToString();
                    }
                    else
                    {
                        (item as TextBlock).Text = DataSource[startIndex + count].ToString();
                    }
                    count += 1;
                }
                TextBlock selectText = (TextBlock)VisualTreeHelper.GetChild(stacktt, ShowItemCount / 2);

                if (ShowItemCount%2 != 0)
                {
                    selectText = (TextBlock)VisualTreeHelper.GetChild(stacktt, ShowItemCount / 2+1);
                }
                SelectData = Convert.ToInt32(selectText.Text);

            }
        }

    }

测试界面

代码链接地址


推荐阅读
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
  • 本文介绍了如何使用Flume从Linux文件系统收集日志并存储到HDFS,然后通过MapReduce清洗数据,使用Hive进行数据分析,并最终通过Sqoop将结果导出到MySQL数据库。 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 本文介绍了如何在AX2012中通过自定义查询在数据网格视图中显示所有记录的方法。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 本文详细介绍了在 Oracle 数据库中使用 MyBatis 实现增删改查操作的方法。针对查询操作,文章解释了如何通过创建字段映射来处理数据库字段风格与 Java 对象之间的差异,确保查询结果能够正确映射到持久层对象。此外,还探讨了插入、更新和删除操作的具体实现及其最佳实践,帮助开发者高效地管理和操作 Oracle 数据库中的数据。 ... [详细]
  • 深入解析C#中app.config文件的配置与修改方法
    在C#开发过程中,经常需要对系统的配置文件进行读写操作,如系统初始化参数的修改或运行时参数的更新。本文将详细介绍如何在C#中正确配置和修改app.config文件,包括其结构、常见用法以及最佳实践。此外,还将探讨exe.config文件的生成机制及其在不同环境下的应用,帮助开发者更好地管理和维护应用程序的配置信息。 ... [详细]
  • 深入理解 Java 控制结构的全面指南 ... [详细]
  • 计算当前记录与下一条记录之间的天数差异
    本文介绍如何使用SQL查询来计算当前记录与其下一条记录之间的天数差异,通过创建测试视图并使用分析函数LEAD和LAG来实现。 ... [详细]
  • Android 自定义 RecycleView 左滑上下分层示例代码
    为了满足项目需求,需要在多个场景中实现左滑删除功能,并且后续可能在列表项中增加其他功能。虽然网络上有很多左滑删除的示例,但大多数封装不够完善。因此,我们尝试自己封装一个更加灵活和通用的解决方案。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • 在Kohana 3框架中,实现最优的即时消息显示方法是许多开发者关注的问题。本文将探讨如何高效、优雅地展示flash消息,包括最佳实践和技术细节,以提升用户体验和代码可维护性。 ... [详细]
  • 本文详细介绍了在C#编程环境中绘制正方形图像的技术和实现方法,通过具体示例代码帮助读者理解和掌握相关技巧。内容涵盖从基础概念到实际应用的各个方面,适合初学者和有一定经验的开发者参考。希望对您的C#学习之旅有所帮助,并激发您进一步探索的兴趣。 ... [详细]
author-avatar
凯锐斯_372
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有