02-WPF_基础(一)

发布于:2024-05-16 ⋅ 阅读:(57) ⋅ 点赞:(0)

 1、基础

各模块类型

链接:如何:向 Viewbox 的内容应用 Stretch 属性 - WPF .NET Framework | Microsoft Learn

WPF基础以及事件绑定与数据绑定的情况,,在学习XAML,数据结构以及一个项目学习平台来练手,网络编程与数据通信,空压机啥的项目。;

1、项目文件简介

1.1、AppConfig

配置文件或者数据库,连接字符串,配置信息

2、App.xaml

设置应用程序起始文件,系统级资源。

StartupUri="MainWindow.xaml">   意思为指定起始文件   为MianWindow.xaml

<Application.Resources>   定义整个WPF应用程序的相关资源。

一个xaml至少包括两个命名空间:默认的;带x前缀的;

3、App.xaml.cs 

app.xaml的后台类文件

4、MainWindow.xaml

Window--WPF应用程序界面与xaml设计文件

5、Mainwindow。xaml.cs  

xaml窗口文件的后台代码文件

2、事件驱动与数据驱动

1、事件驱动

Winform主要的模式

委托绑定

2.1、数据驱动

WPF主要的模式:数据驱动与绑定

1、MainWindow:

此时需要定义:mainViewModel  _mianViewModel=newmainViewModel();   

this.DataContext=_mainViewModel;

    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        mainViewModel mainViewModel = new mainViewModel();
        public MainWindow()
        {
            InitializeComponent();
            // mainViewModel = new mainViewModel(this);   //  实例化类,建立连接
           
            this.DataContext= mainViewModel;    //  实例化绑定连接
        }
        

        private void Button_Click(object sender, RoutedEventArgs e)
        {
              业务逻辑
            //mainViewModel.Value = "10";
        }
    }

上述是数据绑定的格式

2、mainViewModel

这个定义待绑定的事件:继承INotifyPropertyChanged

public  event PropertyChangedEventHandler PropertyChanged

PropertyChanged?.Invoke(this,new PropertyChangedEventArgs("具体需要执行的")

    public class mainViewModel:INotifyPropertyChanged
    {
        //  这种绑定方式

        //MainWindow _mainWindow;
        //public mainViewModel(MainWindow mainWindow)
        //{
        //    _mainWindow = mainWindow;
        //}
        
        public event PropertyChangedEventHandler PropertyChanged;  //  需要定义事件 event
        private string _value="ZHAOXI";
        public List<ValueModel> ValueList {  get; set; }=new List<ValueModel> { 
            new ValueModel{Value = "123", Name="AAA"},
            new ValueModel{Value="456", Name="BBB"}
        };
        public string Value 
        {
            get { return _value; }
            set
            {
                _value = value;
                //_mainwindow.tbName.text = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Value"));   //  此句放在属性改变后语句之后
                if (value == "10")
                {
                    ValueColor= Brushes.Red;
                    // this.txName.Foreground=Brushes.Red;
                }
                (this.ValueCommand as CommandBase).RaiseChanged();
            }
        }
        private Brush _valueColor = Brushes.Orange;
        public Brush ValueColor
        {
            get { return _valueColor; }
            set
            {
                _valueColor = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("ValueColor"));
                
            }
        }
        private ICommand valueCommand;
        //  属性
        public ICommand ValueCommand { 
            get 
            { 
                if(valueCommand==null)
                {
                    valueCommand = new CommandBase() { DoAction = new Action<object>(ValueCommandAction), DoCanExecute = new Func<object, bool>(CanExecute) };
                    
                }
                return valueCommand; }
            set { 
                valueCommand = value; }
            
        }
        private void ValueCommandAction(object obj)
        {
            Value = "10";
        }
        public bool CanExecute(object obj)
        {
            return !string.IsNullOrEmpty(Value);

         }

    }

3、ICommand

事件点击问题

    internal class CommandBase : ICommand
    {
        public event EventHandler CanExecuteChanged;
        //public event EventHandler CanExecuteChanged  //  此为事件定义和声明 也可为public event EventHandler CanExexuteChanged;
        //{
        //    add
        //    {
        //        throw new NotImplementedException();
        //    }

        //    remove
        //    {
        //        throw new NotImplementedException();
        //    }
        //}

        public bool CanExecute(object parameter)
        {
            // 绑定了这个命令的按钮是否能用
            return DoCanExecute?.Invoke(parameter)==true;  ///  当等于true才触发
        }

        public void Execute(object parameter)  //  parameer  这个参数为commandparameter这个控件属性
        {
            // 执行逻辑
            DoAction?.Invoke(parameter);
        }
        public Action<object> DoAction { get; set; }
        public Func<object, bool> DoCanExecute { get; set; }
        public void RaiseChanged()
        {
            CanExecuteChanged?.Invoke(this,new EventArgs());
        }

    }

4、ValueModel

此模块是为了在右边显示

    public class ValueModel
    {
        public string Value { get; set; }
        public string Name { get; set; }
    }

上述是数据绑定的格式:

后续包括:布局控件、资源样式、模板、依赖属性、数据绑定、图形、事件与行为、动画等。

2.3、路径

路径:imgPic.Source=new BitmapImage(new Uri("image/12window.png",UriKind.Relative);

URI:(全称:Uniform Resource Identifier)统一资源标识符,它是一个字符串用来标示抽象或物理资源。

Web上可用的每种资源( HTML文档、图像、音频、视频片段、程序等)都由一个通用资源标识符(Uniform Resource Identifier, 简称”URI”)进行定位。

URI的格式也由三部分组成:

  1. 访问资源的命名机制。
  2. 存放资源的主机名。
  3. 资源自身的名称,由路径表示。

相对路径

.资源的生成操作为Resource

//  相对路径
//  命名控件引入using System.Windows.Media.Imaging;才可以直接用
imgPic.Source = new BitmapImage(new Uri("image/12window.png", UriKind.Relative)); //  Source  --- ImageSource

绝对路径:  

WPF支持两种授权:pack URI方案 application:///和  siteoforigin:///。

但是用siteoforingin替换application时候需要将图片资源的属性面板里的生成操作里将Resource改为内容才可以执行。注意两种方式路径的书写方式

//  授权  指定包含不见得程序包的类型,而路径, 则指定部件在程序包中的位置。

//  绝对路径Absolute
            // WPF支持两种授权: pack://application:,,,/和  pack://siteoforigin:,,,//。
            //  授权  指定包含不见得程序包的类型,而路径, 则指定部件在程序包中的位置。


            // imgPic.Source = new BitmapImage(new Uri("pack://application:,,,/image/12window.png", UriKind.Absolute));
            imgPic.Source=new BitmapImage(new Uri("pack://application:,,,/image/12window.png",UriKind.Absolute));
            //imgPic.Source = new BitmapImage(new Uri("pack://siteoforigin:,,,//image//12window.png", UriKind.Absolute));

第三种方式:

// 第三种方式
// 实际读取的是E:\SoftStudy\C#\C#\基础\01WPF基础\02控件_1\bin\Debug路径里的image/12window.png文件,与image里的生成操作方式无关


        private void Button_Click(object sender, RoutedEventArgs e)
        {
            imgPic.Source=new BitmapImage(new Uri(AppDomain.CurrentDomain.BaseDirectory+"image/12window.png",UriKind.Absolute));
        }

 3.2、XAML

定义:为定义用户界面创建的一种新的“可扩展的程序标记语言”。

需要命名空间:但是不太一样

下图像网址一样:

xaml命名空间格式:引用命名空间:xmlns:(前缀名)=“命名空间描述”;

自定义类或程序集映射语法:xmlns:(必选前缀)=“clr-namespace:(命名空间); assemly=(程序集名称)”;