WPF用户控件User Control的使用-在MVVM架构下实现能量条效果

一、用户控件介绍

定义

  • 用户控件是由一组现有的WPF控件组成,并在一个XAML文件中定义的可重用的控件。
  • 它可以包含多个控件、布局和行为,形成一个独立的、可在应用程序中多次使用的模块。

特点

  • 可重用性:用户控件的设计目的是提高代码的重用性,使得界面元素的组合和布局能够在应用程序中重复利用。
  • 模块化:通过将界面划分为多个独立的用户控件,可以实现更好的模块化设计,有助于代码的维护和管理。
  • 易于扩展:用户控件可以根据需要轻松地进行扩展,包括添加新的控件、更改布局或修改逻辑等。

二、效果展示

通过数据绑定添加相关的逻辑,实现能量条的动态显示。

三、实现过程

1.创建用户控件

根据下图在项目中创建用户控件

2.编辑用户控件

在用户控件的Xaml文件中编辑添加所需要的元素

html 复制代码
<StackPanel Orientation="Vertical">
    <ProgressBar Orientation="Vertical" Maximum="{Binding Max}" Minimum="0" Value="{Binding Value}" Height="300" Width="100"/>
</StackPanel>

3.把用户控件放入主窗口

在用户控件编辑完成后,注意需要对项目进行重新生成,然后打开工具箱,就可将用户控件拖入主窗口

html 复制代码
<Grid Background="White">
    <local:UserControl1 HorizontalAlignment="Left" Margin="300,60,0,0" VerticalAlignment="Top" DataContext="{Binding Page4Model.Count[0]}"/>
</Grid>

4.在model中创建数据类型数据

cs 复制代码
public class Page4Model : NotifyBase
 {
     private Dictionary<int, Detail> _count = new Dictionary<int, Detail>();
     public Dictionary<int, Detail> Count
     {
         get { return _count; }
         set { _count = value; OnPropertyChanged(nameof(Count)); }
     }


 }

 public class Detail : NotifyBase
 {
     private int value;

     public int Value { get => value; set {this.value = value; OnPropertyChanged(nameof(value));}}
     

     private int max;
     public int Max { get => max; set {max = value; OnPropertyChanged(nameof(Max)); } }
 }

你如果没有INotifyPropertyChanged接口,可以用这个

cs 复制代码
  public class NotifyBase:INotifyPropertyChanged
  {
      //数值更改进行界面的同时
      public event PropertyChangedEventHandler? PropertyChanged;
      public void OnPropertyChanged(string propertyName)
      {
          if (PropertyChanged != null)
          {
              PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
          }
      }
  }

5.创建ViewModel,对数据进行赋值更新

cs 复制代码
public class Page4ViewModel
{        
    public Page4Model Page4Model { get; set; } = new Page4Model();

    bool a=false;

    public Page4ViewModel() 
    {
        Page4Model.Count.Add(0,new Detail() {Max=100, Value=0 });

        Task.Run(async () =>
        {
            while (true)
            {
                await Task.Delay(500);
                if (a)
                {
                    Page4Model.Count[0].Value++;
                    if (Page4Model.Count[0].Value > 99) { a= false; }
                }else { Page4Model.Count[0].Value--;
                    if (Page4Model.Count[0].Value < 1) { a = true; }
                }
                
                //因为Conut是个字典 是属于引用类型 更改引用类型,则需要new 盏内存是不会改变到的
                Page4Model.Count = new Dictionary<int, Detail>(Page4Model.Count);
            }
        });

    }


}

最后不要忘记在xaml.cs调用Viewmodel

相关推荐
向宇it14 分钟前
【从零开始入门unity游戏开发之——unity篇02】unity6基础入门——软件下载安装、Unity Hub配置、安装unity编辑器、许可证管理
开发语言·unity·c#·编辑器·游戏引擎
yngsqq1 小时前
一键打断线(根据相交点打断)——CAD c# 二次开发
windows·microsoft·c#
TENET信条2 小时前
day53 第十一章:图论part04
开发语言·c#·图论
anlog3 小时前
C#在自定义事件里传递数据
开发语言·c#·自定义事件
向宇it4 小时前
【从零开始入门unity游戏开发之——unity篇01】unity6基础入门开篇——游戏引擎是什么、主流的游戏引擎、为什么选择Unity
开发语言·unity·c#·游戏引擎
仰望大佬0075 小时前
Avalonia实例实战五:Carousel自动轮播图
数据库·microsoft·c#
糖朝5 小时前
c#读取json
c#·json
向宇it10 小时前
【从零开始入门unity游戏开发之——C#篇26】C#面向对象动态多态——接口(Interface)、接口里氏替换原则、密封方法(`sealed` )
java·开发语言·unity·c#·游戏引擎·里氏替换原则
Java Fans14 小时前
C# 中串口读取问题及解决方案
开发语言·c#
盛派网络小助手14 小时前
微信 SDK 更新 Sample,NCF 文档和模板更新,更多更新日志,欢迎解锁
开发语言·人工智能·后端·架构·c#