南通企业自助建站,网线水晶头的接线方法,网站开发的对联,公司要建立网站要怎么做1、创建项目
打开 VS2022 #xff0c;新建项目 Wpf_Examples#xff0c;创建各层级文件夹#xff0c;安装 CommunityToolkit.Mvvm 和 Microsoft.Extensions.DependencyInjectio NuGet包,完成MVVM框架搭建。搭建完成后项目层次如下图所示#xff1a; 这里如何实现 MVVM 框…1、创建项目
打开 VS2022 新建项目 Wpf_Examples创建各层级文件夹安装 CommunityToolkit.Mvvm 和 Microsoft.Extensions.DependencyInjectio NuGet包,完成MVVM框架搭建。搭建完成后项目层次如下图所示 这里如何实现 MVVM 框架可以参考本人 像 MvvmLight 一样使用 CommunityToolkit.Mvvm 工具包 的文章
2、整理项目
1、项目目录层级
在前面该案例前已经发布了两个案例为了后续不断推出的新案例我们先将项目整理成一个整体做成整套案例系统,后续所有的案例都在该项目上迭代更新。目前先做简单的归纳处理我们把所有案例都单独放在一个窗体主窗体做按钮菜单每个案例通过弹窗方式呈现。基于以上整理后得到系统文件层级分布如下所示 2、案例代码实现
1、主界面菜单实现
1、MainWindow.xaml 代码
Window x:ClassWpf_Examples.MainWindowxmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentationxmlns:xhttp://schemas.microsoft.com/winfx/2006/xamlxmlns:dhttp://schemas.microsoft.com/expression/blend/2008xmlns:mchttp://schemas.openxmlformats.org/markup-compatibility/2006xmlns:converterclr-namespace:Wpf_Examples.Convertersxmlns:localclr-namespace:Wpf_Examplesxmlns:ccclr-namespace:CustomControlLib;assemblyCustomControlLibDataContext{Binding Source{StaticResource Locator},PathMain}mc:IgnorabledTitleMainWindow Height450 Width800GridWrapPanelButton Width120 Height30 FontSize18 Content图片按钮 Command{Binding ButtonClickCmd} CommandParameter{Binding RelativeSource{RelativeSource ModeSelf},PathContent} Margin8/Button Width120 Height30 FontSize18 ContentLED效果灯 Command{Binding ButtonClickCmd} CommandParameter{Binding RelativeSource{RelativeSource ModeSelf},PathContent} Margin8/Button Width120 Height30 FontSize18 Content动态数字卡 Command{Binding ButtonClickCmd} CommandParameter{Binding RelativeSource{RelativeSource ModeSelf},PathContent} Margin8//WrapPanel/Grid
/Window
2、MainViewWindow. 代码
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media.Imaging;
using System.Windows.Threading;
using Wpf_Examples.Views;namespace Wpf_Examples.ViewModels
{public class MainViewModel : ObservableObject{public RelayCommandstring ButtonClickCmd { get; set; }public MainViewModel(){ButtonClickCmd new RelayCommandstring(FunMenu);}private void FunMenu(string obj){switch (obj){case 图片按钮:PopWindow(new ImageButtonWindow());break;case LED效果灯:PopWindow(new LEDStatusWindow());break;case 动态数字卡:PopWindow(new DataCardWindow());break;}}private void PopWindow(Window window){var mainWindowInstance App.Current.MainWindow; // 获取主窗口实例window.Owner mainWindowInstance;window.WindowStartupLocation WindowStartupLocation.CenterOwner;window.ShowDialog();}}
}
3、界面效果 2、案例一 图片按钮整理实现
1、ImageButtonWindow.xaml 代码
Window x:ClassWpf_Examples.Views.ImageButtonWindowxmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentationxmlns:xhttp://schemas.microsoft.com/winfx/2006/xamlxmlns:dhttp://schemas.microsoft.com/expression/blend/2008xmlns:mchttp://schemas.openxmlformats.org/markup-compatibility/2006xmlns:ccclr-namespace:CustomControlLib;assemblyCustomControlLibxmlns:converterclr-namespace:Wpf_Examples.Convertersxmlns:localclr-namespace:Wpf_Examples.ViewsDataContext{Binding Source{StaticResource Locator},PathImageButton}mc:IgnorabledTitleImageButtonWindow Height450 Width800Window.Resourcesconverter:InverseBooleanConverter x:KeyInverseBooleanConverter//Window.ResourcesGridGrid.RowDefinitionsRowDefinition/RowDefinition//Grid.RowDefinitionsStackPanel OrientationHorizontal VerticalAlignmentCenter HorizontalAlignmentRightTextBlock Text双按钮状态控制边框同时虚线实线切换 FontSize30 VerticalAlignmentCenter HorizontalAlignmentCenter Margin0 0 80 0/cc:ImageTextButton Text开始生产 ToolTip开始生产 IsDashedBorder{Binding SystemStatus} Command{Binding ButtonClickCmd} CommandParameter{Binding RelativeSource{RelativeSource ModeSelf},PathToolTip} Width70 Height70 Margin0,0,5,0 ImageSourcepack://application:,,,/Wpf_Examples;component/Assets/Images/Start.png/cc:ImageTextButton Text停止生产 ToolTip停止生产 IsDashedBorder{Binding SystemStatus,Converter{StaticResource InverseBooleanConverter}} Command{Binding ButtonClickCmd} CommandParameter{Binding RelativeSource{RelativeSource ModeSelf},PathToolTip} Width70 Height70 Margin0,0,5,0 ImageSourcepack://application:,,,/Wpf_Examples;component/Assets/Images/Stop.png//StackPanelStackPanel OrientationHorizontal VerticalAlignmentCenter HorizontalAlignmentRight Grid.Row1TextBlock Text单按钮状态控制切换背景图片和文本 FontSize30 VerticalAlignmentCenter HorizontalAlignmentCenter Margin0 0 80 0/cc:ImageTextButton Text{Binding ButtonName} Command{Binding SingleButtonClickCmd} ImageSource{Binding ImageSource} CommandParameter{Binding RelativeSource{RelativeSource ModeSelf},PathText} Width70 Height70 Margin0,0,5,0 //StackPanel/Grid
/Window
2、ImageButtonViewModel.cs 代码
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media.Imaging;namespace Wpf_Examples.ViewModels
{public class ImageButtonViewModel:ObservableObject{/// summary/// 生产状态按钮名称/// /summaryprivate string buttonName;public string ButtonName{get { return buttonName; }set { SetProperty(ref buttonName, value); }}/// summary/// 系统运行状态/// /summaryprivate bool systemStatus false;public bool SystemStatus{get { return systemStatus; }set { SetProperty(ref systemStatus, value); }}/// summary/// 产线状态/// /summaryprivate bool productStatus false;public bool ProductStatus{get { return productStatus; }set { SetProperty(ref productStatus, value); }}/// summary/// 生产状态背景图/// /summaryprivate BitmapImage imageSource;public BitmapImage ImageSource{get { return imageSource; }set { SetProperty(ref imageSource, value); }}public RelayCommand SingleButtonClickCmd { get; set; }public RelayCommandstring ButtonClickCmd { get; set; }public ImageButtonViewModel(){SingleButtonClickCmd new RelayCommand(StatusChange);ButtonClickCmd new RelayCommandstring(FunMenu);StatusChange();}private void FunMenu(string obj){switch (obj){case 开始生产:SystemStatus true;break;case 停止生产:SystemStatus false;break;}}private void StatusChange(){if (!ProductStatus){ButtonName 开始生产;ImageSource new BitmapImage(new Uri(pack://application:,,,/Wpf_Examples;component/Assets/Images/Start.png));ProductStatus true;}else{ButtonName 停止生产;ImageSource new BitmapImage(new Uri(pack://application:,,,/Wpf_Examples;component/Assets/Images/Stop.png));ProductStatus false;}}}
}
3、InverseBooleanConverter.cs 转换器代码
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;namespace Wpf_Examples.Converters
{public class InverseBooleanConverter : IValueConverter{public object Convert(object value, Type targetType, object parameter, CultureInfo culture){return !(value is bool boolValue) || !boolValue;}public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){return !(value is bool boolValue) || !boolValue;}}
}
3、案例二 LED灯整理实现
1、LEDStatusWindow.xaml 代码
Window x:ClassWpf_Examples.Views.LEDStatusWindowxmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentationxmlns:xhttp://schemas.microsoft.com/winfx/2006/xamlxmlns:dhttp://schemas.microsoft.com/expression/blend/2008xmlns:mchttp://schemas.openxmlformats.org/markup-compatibility/2006xmlns:converterclr-namespace:Wpf_Examples.Convertersxmlns:localclr-namespace:Wpf_Examples.ViewsDataContext{Binding Source{StaticResource Locator},PathLedStatus}mc:IgnorabledTitleLEDStatusWindow Height450 Width800Window.Resourcesconverter:StatusToColorConverter x:KeyStatusToColorConverter//Window.ResourcesGridGrid.ColumnDefinitionsColumnDefinition/ColumnDefinition/ColumnDefinition//Grid.ColumnDefinitionsStackPanel OrientationHorizontal VerticalAlignmentCenter HorizontalAlignmentRight TextBlock Text网络 FontSize16 ForegroundDarkGray Margin0 0 20 0/Ellipse Width20 Height20 Fill{Binding NetStatusValue, Converter{StaticResource StatusToColorConverter}}//StackPanelStackPanel Grid.Column1 OrientationHorizontal VerticalAlignmentCenter HorizontalAlignmentCenterTextBlock TextPLC FontSize16 ForegroundDarkGray Margin0 0 20 0/Ellipse Width20 Height20 Fill{Binding PLCStatusValue, Converter{StaticResource StatusToColorConverter}}//StackPanelStackPanel Grid.Column2 OrientationHorizontal VerticalAlignmentCenter HorizontalAlignmentLeftTextBlock Text相机 FontSize16 ForegroundDarkGray Margin0 0 20 0/Ellipse Width20 Height20 Fill{Binding DevStatusValue, Converter{StaticResource StatusToColorConverter}}//StackPanel/Grid
/Window
2、LEDStatusViewModel.cs 代码
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Threading;namespace Wpf_Examples.ViewModels
{public class LEDStatusViewModel: ObservableObject{/// summary/// 网络状态按钮名称/// /summaryprivate int netStatusValue 2;public int NetStatusValue{get { return netStatusValue; }set { SetProperty(ref netStatusValue, value); }}/// summary/// PLC状态按钮名称/// /summaryprivate int plcStatusValue 1;public int PLCStatusValue{get { return plcStatusValue; }set { SetProperty(ref plcStatusValue, value); }}/// summary/// 设备状态/// /summaryprivate int devStatusValue 0;public int DevStatusValue{get { return devStatusValue; }set { SetProperty(ref devStatusValue, value); }}/// summary/// 系统运行状态/// /summaryprivate bool systemStatus false;public bool SystemStatus{get { return systemStatus; }set { SetProperty(ref systemStatus, value); }}public LEDStatusViewModel(){CreateTimer();}private void DispatcherTimer_Tick(object sender, EventArgs e){DevStatusValue StatusChange(DevStatusValue);NetStatusValue StatusChange(NetStatusValue);PLCStatusValue StatusChange(PLCStatusValue);}private void CreateTimer(){#region 每秒定时器服务DispatcherTimer cpuTimer new DispatcherTimer{Interval new TimeSpan(0, 0, 0, 3, 0)};cpuTimer.Tick DispatcherTimer_Tick;cpuTimer.Start();#endregion}private int StatusChange(int value){int outVal 0;//状态变化if (value 0){outVal 1;}else if (value 1){outVal 2;}else{outVal 0;}return outVal;}}
}
3、StatusToColorConverter.cs 转换器代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
using System.Windows.Media;namespace Wpf_Examples.Converters
{public class StatusToColorConverter : IValueConverter{public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture){if (value is int statusValue){switch (statusValue){case 0:return Brushes.Red;case 1:return #E5D21C;case 2:return Brushes.Green;default:return Brushes.Green; // 默认颜色}}return Brushes.Gray;}public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture){throw new NotImplementedException();}}
}
4、动态数字卡实现
1、DataCardWindow.xaml 界面代码实现
Window x:ClassWpf_Examples.Views.DataCardWindowxmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentationxmlns:xhttp://schemas.microsoft.com/winfx/2006/xamlxmlns:dhttp://schemas.microsoft.com/expression/blend/2008xmlns:mchttp://schemas.openxmlformats.org/markup-compatibility/2006xmlns:localclr-namespace:Wpf_Examples.ViewsDataContext{Binding Source{StaticResource Locator},PathDataCard}mc:IgnorabledTitleDataCardWindow Height450 Width800 Background#2B2B2BGrid!--第二列--StackPanel OrientationHorizontal VerticalAlignmentCenter HorizontalAlignmentCenterStackPanel.ResourcesDataTemplate x:KeymachineCountBorder Width15 Background#99D40B0B Margin2,0TextBlock Text{Binding} VerticalAlignmentCenter HorizontalAlignmentCenter ForegroundWhite FontSize16/TextBlock/Border/DataTemplate/StackPanel.ResourcesTextBlock Text机台#13;总数 Foreground#99ffffff Margin10,0 VerticalAlignmentCenter FontSize10/TextBlockItemsControl ItemsSource{Binding MachineCount} ItemTemplate{StaticResource machineCount}ItemsControl.ItemsPanelItemsPanelTemplateStackPanel OrientationHorizontal/StackPanel/ItemsPanelTemplate/ItemsControl.ItemsPanel/ItemsControlTextBlock Text生产计数 Foreground#99ffffff VerticalAlignmentCenter FontSize10 Margin20,0/TextBlockItemsControl ItemsSource{Binding ProductCount} ItemTemplate{StaticResource machineCount}ItemsControl.ItemsPanelItemsPanelTemplateStackPanel OrientationHorizontal/StackPanel/ItemsPanelTemplate/ItemsControl.ItemsPanel/ItemsControlTextBlock Text不良计数 Foreground#99ffffff Margin20,0 VerticalAlignmentCenter FontSize10/TextBlockItemsControl ItemsSource{Binding BadCount} ItemTemplate{StaticResource machineCount}ItemsControl.ItemsPanelItemsPanelTemplateStackPanel OrientationHorizontal/StackPanel/ItemsPanelTemplate/ItemsControl.ItemsPanel/ItemsControl/StackPanel/Grid
/Window
2、DataCardViewModel.cs 代码实现
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Messaging.Messages;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Threading;namespace Wpf_Examples.ViewModels
{public class DataCardViewModel:ObservableObject{#region 计数/// summary/// 机台总数/// /summaryprivate string _MachineCount 02981;/// summary/// 机台总数/// /summarypublic string MachineCount{get { return _MachineCount; }set{SetProperty(ref _MachineCount, value);}}/// summary/// 生产计数/// /summaryprivate string _ProductCount 16403;/// summary/// 生产计数/// /summarypublic string ProductCount{get { return _ProductCount; }set{SetProperty(ref _ProductCount, value);}}/// summary/// 不良计数/// /summaryprivate string _BadCount 0403;/// summary/// 不良计数/// /summarypublic string BadCount{get { return _BadCount; }set{SetProperty(ref _BadCount, value);}}#endregionpublic DataCardViewModel(){CreateTimer();}private void CreateTimer(){#region 每秒定时器服务DispatcherTimer cpuTimer new DispatcherTimer{Interval new TimeSpan(0, 0, 0, 2, 0)};cpuTimer.Tick DispatcherTimer_Tick;cpuTimer.Start();#endregion}private void DispatcherTimer_Tick(object sender, EventArgs e){ValueChanged();}private void ValueChanged(){Random random new Random();ProductCount random.Next(100, 9999).ToString();BadCount random.Next(100, 999).ToString();}}
}
3、效果展示 4.源代码
CSDN下载链接WPFMVVM案例实战三- 动态数字卡片效果实现