`
lindexi-gd
  • 浏览: 139469 次
社区版块
存档分类
最新评论

win10 uwp 通知列表

 
阅读更多

经常看到小伙伴问,问已经绑定列表,在进行修改时,不会通知界面添加或删除。这时问题就在,一般使用的列表不会在添加时通知界面,因为他们没有通知。

本文:知道什么是通知的列表,如何去写一个通知列表

<!--more-->

在 C# 很少直接使用数组,因为数组难以指定类型,需要指定类型的,一般都会使用 List<T> 。而 List 我就叫他列表,继承 ICollection 的类,一般就可以叫列表。

但是在使用 ListView 直接给 List 作为 Source ,那么只会在初次显示,之后无论对 List 进行什么修改,都不会导致界面的列表项修改。

当然如果列表使用的类的属性有通知,对他进行修改,还是可以看到界面修改。

如果希望对列表修改时,界面也变化,那么简单方法是使用 ObservableCollection

不需要对 ObservableCollection 的属性进行通知,也就是 下面代码实际是不需要的

        public ObservableCollection<string> ObservableCollection
        {
            set
            {
                _observableCollection = value;
                OnPropertyChanged();
            }
            get
            {
                return _observableCollection;
            }
        }

        private ObservableCollection<string> _observableCollection;

如果需要修改项,只需要进行和List一样的添加或移除元素就可以。

如果想问,为何使用 ObservableCollection 就可以通知界面修改了元素,而使用 List 就不可以。

其实因为 ObservableCollection 继承了 INotifyCollectionChanged ,他可以通知 ListView 说修改了项。

如果对于上面的说法觉得还是不行,那么深一点,来解释一下 ListView 是如何知道 ObservableCollection 修改了。

首先在给 Source 值的时候,会自动判断是不是有 INotifyCollectionChanged ,如果是的话,自动监听。

因为 ListView 的 Source 大概就是这样,下面代码和真的 Source 是不一样,但是大概也是这样的

         /// <summary>
        /// 标识 <see cref="Source"/> 的依赖项属性。
        /// </summary>
        public static readonly DependencyProperty SourceProperty = DependencyProperty.Register(
            "Source", typeof(object), typeof(MainPage), new PropertyMetadata(default(object), (s, e) =>
            {
                var c = s as INotifyCollectionChanged;
                if (c != null)
                {
                    c.CollectionChanged += (sender, args) =>
                    {
                        switch (args.Action)
                        {
                            case NotifyCollectionChangedAction.Add:
                                break;
                            case NotifyCollectionChangedAction.Move:
                                break;
                            case NotifyCollectionChangedAction.Remove:
                                break;
                            case NotifyCollectionChangedAction.Replace:
                                break;
                            case NotifyCollectionChangedAction.Reset:
                                break;
                            default:
                                throw new ArgumentOutOfRangeException();
                        }
                    };
                }
            }));

        /// <summary>
        /// 获取或设置
        /// </summary>
        public object Source
        {
            get { return (object) GetValue(SourceProperty); }
            set { SetValue(SourceProperty, value); }
        }

判断传入的是不 INotifyCollectionChanged ,如果是的话,获取他修改时,是什么,添加或删除,修改的元素是哪个。

于是这样就可以绑定时,进行修改 列表就可以让界面得到。

那么 ObservableCollection 缺少了很多东西,如添加多个元素,需要每次都进行 遍历,是不是可以自己写一个和 ObservableCollection 差不多的?

于是我就来写一个,很简单的代码

首先需要给他一个名字,这里是随意给的。

但是命名是需要时间,经过很久,我想到诡异的名字。

需要做一个泛型,然后继承 Collection 和通知。继承 Collection 可以少写代码,因为基本的添加他做了。

    public class AvaloniaCol<T> : Collection<T>, INotifyCollectionChanged

那么继承了 Collection 不可以直接写添加函数,如何做?实际他可以直接 InsertItem 就是添加会调用。

         protected override void InsertItem(int index, T item)
        {
            base.InsertItem(index, item);
            CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, index));
        }

需要做的就是使用 原来的方法,但是加一个通知,通知时需要告诉当前是添加和添加的元素

写了添加自然需要写删除

         protected override void RemoveItem(int index)
        {
            var temp = this[index];
            base.RemoveItem(index);
            CollectionChanged?.Invoke(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, temp, index));
        }

代码就这么简单,在界面写个按钮,用于添加或移除

可以看到界面就是进行变换,就这么简单写通知列表。

代码:http://download.csdn.net/detail/lindexi_gd/9826807

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    win10 uwp 轻量级 MVVM 框架入门 2.1.5.3199 例子

    总结来说,"win10 uwp 轻量级 MVVM 框架入门 2.1.5.3199 例子"提供了一个实际操作的平台,让开发者学习如何在UWP环境中利用MVVM模式进行开发。通过分析和实践这个框架,你将能够更好地理解MVVM的工作原理,以及如何...

    易语言win10弹窗通知模块

    易语言win10弹窗通知模块是专门为在Windows 10操作系统上创建和显示桌面通知而设计的一个功能组件。这个模块通过易语言的接口与Windows 10的API进行交互,从而实现用户界面中的通知功能。 在Windows 10操作系统中,...

    Python-微软已经引入了一项开源UWP社区工具包帮助开发者通过Win10SDK进行互相合作

    微软推出的开源UWP社区工具包(Windows Community Toolkit)是一个关键的资源,它旨在简化和加速开发流程,使得开发者能够更高效地利用Win10 SDK进行编程。 UWP社区工具包是一个集合了各种辅助工具、组件和示例代码...

    Uwp中的换肤

    在MVVM中,换肤可以通过ViewModel来控制,ViewModel负责接收用户的选择并通知View进行更新。 8. **VisualStateManager与ControlTemplate**:VisualStateManager用于管理控件在不同状态下的外观,ControlTemplate则...

    Xamarin.Forms构建Windows10通用应用程序(UWP)

    然后为每个目标平台(包括UWP)创建一个平台特定的项目,用于处理特定于平台的功能,如本地通知、文件系统访问等。 4. **XAML界面设计** 使用XAML,开发者可以轻松地定义控件布局、样式和数据绑定。在UWP项目中,...

    Win10SDK_10.0.19041,version=10.0.19041.1.zip

    4. 开发跨平台的UWP应用,充分利用Windows 10的特性如Live Tiles、通知中心等。 总的来说,Windows 10 SDK 10.0.19041.1是一个强大的开发工具集合,它不仅为开发者提供了构建高质量Windows应用所需的一切,还通过...

    UWP-Demo:UWP桌面应用程序的演示

    “UWP-Demo”作为一个桌面应用程序,可能使用了桌面应用桥(Desktop App Converter)工具,该工具允许传统Win32应用转换为UWP包装,从而获得UWP的一些优势,如Windows Store分发、现代权限管理等。 **7. 调试和测试...

    安信Windows驱动开发教程:什么是通用 Windows 平台 (UWP) 应用程序?有什么功能?.docx

    - WinUI 是一套现代化的 UI 控件和 XAML 控件库,专为 Windows 10 设计,可用于 UWP 和 Win32 应用程序。 2. **MSIX:** - MSIX 是一种新的应用程序打包格式,支持传统 Win32 应用程序和 UWP 应用程序的安装和...

    DirectShow打开摄像头(Win10+SV2102)

    在这个场景中,"DirectShow打开摄像头(Win10+SV2102)"指的是使用DirectShow库在Windows 10系统环境下,结合特定版本(SV2102)的SDK或者更新,来访问和操作摄像头设备。 在Windows 10中,DirectShow仍然是一个...

    dotnet-GankUWP为gankio的UWP版第三方客户端

    描述中提到的“gank.io首个win10客户端,支持磁贴、通知、小娜……已发布到应用商店,欢迎下载。”意味着这款应用不仅具有常规的客户端功能,还充分利用了UWP平台的特点。它支持Windows 10的动态磁贴,可以实时展示...

    基于C++实现(UWP)大学旅游信息管理系统【100011547】

    该项目已经进行了升级,采用了Win UI 2.8库,这是一项重要的更新,因为Win UI使得开发者能够创建更加现代化、高性能且具有统一用户界面的UWP应用。Win UI 2.8包含了最新的UI控件和设计元素,提升了应用的视觉效果和...

    win10使用教程

    - **Modern UI 的演变**:Windows 10 中的 Modern UI(现称为 UWP 应用)在设计上进行了调整,旨在提供更加统一且流畅的用户体验。 - **适应性设计**:Modern UI 的应用能够更好地适应不同屏幕尺寸和设备类型,无论...

    win32背景图

    - WPF(Windows Presentation Foundation)和UWP(Universal Windows Platform):这两种是现代Windows应用开发框架,提供了更高级的图形渲染和用户体验,但它们也有自己的方式来设置背景图,与Win32 API有所不同。...

    WinToast:WinToast是一个用C ++编写的轻量级库,它完全集成了Windows 8和Windows 10的现代Toast通知。Toast通知使您的应用可以通知用户应了解的相关信息和及时事件并对其采取行动。在您的应用程序内部,例如新的即时消息,新的好友请求,突发新闻或日历事件

    这个轻量级的库使得开发者能够轻松地在Windows 8和Windows 10系统上集成通知功能,以便向用户传达重要的信息和实时事件。这些通知通常会出现在屏幕的右下角,允许用户快速查看和对这些信息做出响应,而无需离开当前...

    Win API的平台示例-main.rar Windows-universal-samples-main

    通用Windows平台(Universal Windows Platform, UWP)是微软为开发者提供的一个统一的框架,允许应用程序在各种Windows 10设备上运行,包括PC、手机、Xbox、HoloLens等。 首先,让我们关注Win API的核心组成部分:...

    Win32 API中文帮助文档及中文查询工具

    Win32 API是Windows平台开发的基础,虽然现代的.NET Framework、Windows Runtime(WinRT)和Universal Windows Platform(UWP)提供了新的开发方式,但Win32 API仍然在很多场合被广泛使用,特别是在需要底层系统控制...

    developing windows applications c#.pdf

    以下内容将详细介绍Windows 10的通用Windows平台(UWP)的开发,包括但不限于XAML基础、布局设计、用户交互、样式、资源和主题、图形、变换和动画、数据绑定、导航和窗口管理以及动态磁贴和通知等方面的开发技术。...

    win10-guisample:Windows 10示例应用程序显示了新OS中对XAML和用户体验设计的关键更改

    6. **Live Tiles和通知**:Windows 10的应用可以使用Live Tiles实时更新内容,提供动态的通知。通过XAML和C#,开发者可以实现这些功能,提高应用的互动性和吸引力。 7. **Xamarin集成**:虽然标签中只提到了C#,但...

    构建 Windows 电脑的桌面应用开发指南.pdf

    此外,还可以使用UWP组件来扩展桌面应用的功能,例如添加Windows 10特有的用户活动和通知。 Fluent Design System是微软推荐的设计语言,用于创建符合现代审美、具有良好交互性的应用界面。它包含了诸如深度、运动...

    C#ble低功耗蓝牙

    6. **配置文件与项目结构:** 提供的文件列表中,`App.config`用于配置应用程序,`BLECode.cs`包含了BLE相关的代码,`Form1.Designer.cs`和`Form1.cs`定义了WinForm界面和逻辑,`Program.cs`是程序入口,`...

Global site tag (gtag.js) - Google Analytics