# WPFDevelopers.Minimal **Repository Path**: WPFDevelopersOrg/WPFDevelopers.Minimal ## Basic Information - **Project Name**: WPFDevelopers.Minimal - **Description**: 这是一款WPF客户端基础控件,欢迎使用 - **Primary Language**: C# - **License**: MIT - **Default Branch**: main - **Homepage**: https://gitee.com/WPFDevelopersOrg - **GVP Project**: No ## Statistics - **Stars**: 91 - **Forks**: 27 - **Created**: 2022-01-22 - **Last Updated**: 2025-06-10 ## Categories & Tags **Categories**: desktop-ui **Tags**: WPF, UI, XAML ## README
[English](https://github.com/WPFDevelopersOrg/WPFDevelopers.Minimal/blob/master/README.md) ## Welcome to WPFDevelopers.Minimal ![.net >= 4.0](https://img.shields.io/badge/.net-%3E%3D4.0-blue) ![Visual Studio 2019](https://img.shields.io/badge/Visual%20Studio%20-2019-blueviolet) nuget-version nuget-version WPFDevelopers.Minimal ![Downloads](https://img.shields.io/nuget/dt/WPFDevelopers.Minimal?color=%23409EF) ### 停止更新,不建议使用,请跳转[自定义控件库](https://github.com/WPFDevelopersOrg/WPFDevelopers) https://github.com/WPFDevelopersOrg/WPFDevelopers ### [码云](https://gitee.com/WPFDevelopersOrg) https://gitee.com/WPFDevelopersOrg ### 加入QQ群:458041663 ### 欢迎关注微信公众号 ### 捐助 如果您觉得我们的开源软件对你有所帮助,请扫下方二维码打赏我们一杯咖啡。 | 支付宝 | 微信 | |----|-----| | | | ### 贡献者 ChisterWu ChisterWu ### .Net Version | .Net Version | Status | | ---- | ---- | | Net40 | ✅ | | net45 | ✅ | | net46 | ✅ | | net47 | ✅ | | net48 | ✅ | | netcoreapp3.0 | ✅ | | net5.0-windows | ✅ | | net6.0-windows | ✅ | # __最新请使用预览版Nuget包__ ### 效果展示 ![light](https://gitee.com/WPFDevelopersOrg/ResourcesCache/raw/main/resources/WPFDevelopers.Minimal/0.png) ![dark](https://gitee.com/WPFDevelopersOrg/ResourcesCache/raw/main/resources/WPFDevelopers.Minimal/dark.png) ### Nuget 版本大于等于 3.2.3 效果展示 [Blue](#Blue) [Green](#Green) [Red](#Red) [Orange](#Orange) [Purple](#Purple) ### 第一步: 添加 nuget; ``` Install-Package WPFDevelopers.Minimal ``` ### 第二步: App.xaml中增加节点: ```xaml 注意:从旧版升级报错时把 xmlns:ws="https://github.com/WPFDevelopersOrg.WPFDevelopers.Minimal" 改成xmlns:ws="https://github.com/WPFDevelopersOrg/WPFDevelopers.Minimal" ``` ` xmlns:ws="https://github.com/WPFDevelopersOrg/WPFDevelopers.Minimal" ` ``` XAML ``` ### 第三步:添加命名空间: `xmlns:ws="https://github.com/WPFDevelopersOrg/WPFDevelopers.Minimal"` ### 使用方法 [数据源](#数据源) [NotifyIcon](#NotifyIcon) [Window](#Window) [Loading](#Loading) [MessageBox](#MessageBox) [Menu|ContextMenu](#Menu|ContextMenu) [Button](#Button) [RadioButton](#RadioButton) [Checkbox](#Checkbox) [TextBox](#TextBox) [PasswordBox](#PasswordBox) [ComboBox](#ComboBox) [ToggleButton](#ToggleButton) [DatePicker](#DatePicker) [Slider](#Slider) [ProgressBar](#ProgressBar) [DataGrid](#DataGrid) [ListBox](#ListBox) [ListView](#ListView) [TreeView](#TreeView) [Expander](#Expander) [GroupBox](#GroupBox) [TabControl](#TabControl) [GridSplitter](#GridSplitter) ### 数据源 1)数据源 ``` C# using System; using System.Collections.ObjectModel; using System.Linq; using System.Windows; using WPFDevelopers.Minimal.Sample.Models; namespace WPFDevelopers.Minimal.Sample.ExampleViews { public partial class MainView : WPFDevelopers.Minimal.Net40.Window { #region DataSource public ObservableCollection UserCollection { get { return (ObservableCollection)GetValue(UserCollectionProperty); } set { SetValue(UserCollectionProperty, value); } } public static readonly DependencyProperty UserCollectionProperty = DependencyProperty.Register("UserCollection", typeof(ObservableCollection), typeof(MainView), new PropertyMetadata(null)); public bool AllSelected { get { return (bool)GetValue(AllSelectedProperty); } set { SetValue(AllSelectedProperty, value); } } public static readonly DependencyProperty AllSelectedProperty = DependencyProperty.Register("AllSelected", typeof(bool), typeof(MainView), new PropertyMetadata(AllSelectedChangedCallback)); private static void AllSelectedChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) { var view = d as MainView; var isChecked = (bool)e.NewValue; if ((bool)e.NewValue) view.UserCollection.ToList().ForEach(y => y.IsChecked = isChecked); else view.UserCollection.ToList().ForEach(y => y.IsChecked = isChecked); } #endregion public MainView() { InitializeComponent(); this.Loaded += MainView_Loaded; } private void MainView_Loaded(object sender, RoutedEventArgs e) { var time = DateTime.Now; UserCollection = new ObservableCollection(); for (int i = 0; i < 4; i++) { UserCollection.Add(new UserModel { Date = time, Name = "WPFDevelopers", Address = "No. 189, Grove St, Los Angeles", Children = new System.Collections.Generic.List() { new UserModel { Name= "WPFDevelopers.Minimal1.1" }, new UserModel { Name = "WPFDevelopers.Minimal1.2" }, new UserModel { Name = "WPFDevelopers.Minimal1.3" }, new UserModel { Name= "WPFDevelopers.Minimal1.4" }, new UserModel { Name = "WPFDevelopers.Minimal1.5" }, new UserModel { Name = "WPFDevelopers.Minimal1.6" }, } }); time = time.AddDays(2); } } } } ``` ### NotifyIcon 1)XAML ``` XML ``` 2)CS code ``` C# private void Quit_Click(object sender, RoutedEventArgs e) { Application.Current.Shutdown(); } private void About_Click(object sender, RoutedEventArgs e) { new AboutWindow().Show(); } private void SendMessage_Click(object sender, RoutedEventArgs e) { NotifyIcon.ShowBalloonTip("Message", " Welcome to WPFDevelopers.Minimal ",NotifyIconInfoType.None); } private void Twink_Click(object sender, RoutedEventArgs e) { WpfNotifyIcon.IsTwink = !WpfNotifyIcon.IsTwink; menuItemTwink.IsChecked = WpfNotifyIcon.IsTwink; } ``` ![NotifyIcon](https://gitee.com/WPFDevelopersOrg/ResourcesCache/raw/main/resources/WPFDevelopersResource/NotifyIcon.gif) ### Window 1)XAML ``` XML ws:Window x:Class="WpfApp.MainWindow" ``` 2)去除.cs文件中的继承 ``` C# public partial class MainWindow ``` ![Window](https://gitee.com/WPFDevelopersOrg/ResourcesCache/raw/main/resources/WPFDevelopers.Minimal/Window.png) ### Loading 1).cs ``` C# var task = new Task(() => { //Things to wait for Thread.Sleep(5000); }); task.ContinueWith((previousTask) => { WPFDevelopers.Minimal.Controls.Loading.Close(); },TaskScheduler.FromCurrentSynchronizationContext()); WPFDevelopers.Minimal.Controls.Loading.Show(); task.Start(); ``` 2)Exit Task ``` C# var tokenSource = new CancellationTokenSource(); var cancellationToken = tokenSource.Token; var task = new Task(() => { for (int i = 0; i < 5; i++) { //这里做自己的事情 if (tokenSource.IsCancellationRequested)return; Thread.Sleep(1000); } }, cancellationToken); task.ContinueWith(previousTask => { if (tokenSource.IsCancellationRequested)return; Loading.Close(); }, TaskScheduler.FromCurrentSynchronizationContext()); Loading.Show(true); Loading.LoadingQuitEvent += delegate { tokenSource.Cancel(); }; task.Start(); ``` ![Loading](https://gitee.com/WPFDevelopersOrg/ResourcesCache/raw/main/resources/WPFDevelopers.Minimal/loading.gif) ### MessageBox 1).cs 使用如下 ``` C# WPFDevelopers.Minimal.Controls.MessageBox.Show("文件删除成功。", "消息",MessageBoxButton.OK,MessageBoxImage.Information); WPFDevelopers.Minimal.Controls.MessageBox.Show("当前文件不存在!", "警告", MessageBoxImage.Warning); WPFDevelopers.Minimal.Controls.MessageBox.Show("当前文件不存在。", "错误", MessageBoxImage.Error); WPFDevelopers.Minimal.Controls.MessageBox.Show("当前文件不存在,是否继续?", "询问", MessageBoxButton.OKCancel, MessageBoxImage.Question); ``` ![MessageBox](https://gitee.com/WPFDevelopersOrg/ResourcesCache/raw/main/resources/WPFDevelopers.Minimal/MessageBox.gif) ### Menu|ContextMenu 1)XAML ``` XML ``` ![Menu](https://gitee.com/WPFDevelopersOrg/ResourcesCache/raw/main/resources/WPFDevelopers.Minimal/Menu.gif) ### Button 1)XAML ``` XML