自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(52)
  • 收藏
  • 关注

原创 访问修饰符

public和public static是两种不同的访问修饰符,它们在访问权限和使用方式上有一些区别。2、public static 访问修饰符。

2024-01-16 15:33:28 431

原创 MVVM模型的BindableBase类

在MVVM模式中,视图模型是连接视图(View)和模型(Model)之间的桥梁,通过数据绑定,视图模型可以将模型中的数据传递到视图上,并将用户的操作反馈给模型,BindableBase类可以帮助我们更方便地实现这种数据绑定。使用BindableBase类可以大大简化视图模型的代码,使得视图模型类更清晰、易读、易于维护。同时也可以提高代码的可复用性,避免在多个视图模型类中重复编写相同的代码。它通常是其他视图模型类的父类,提供了一些常用的属性和方法。简化了视图模型的开发和管理。

2024-01-16 10:42:00 442

原创 C#:ImportingConstructor特性

上述代码中,MyClass 类的构造函数被标记为 ImportingConstructor,并接收一个类型为 IMyDependency 的参数。这样,我们就可以通过依赖注入来提供 MyClass 所需的依赖项。在使用依赖注入的框架中,我们可以通过标记构造函数上的ImportingConstructor特性,告诉框架该构造函数需要进行依赖注入。当容器需要创建一个对象时,它会查找带有ImportingConstructor特性的构造函数,并自动解析并提供所需的依赖项。

2024-01-03 11:29:24 596

原创 WPF中的KeyGesture类

例如,KeyGesture(Key.S, ModifierKeys.Control) 表示了按下 Ctrl+S 的键盘快捷键。使用 KeyGesture 类,您可以轻松地定义和处理各种键盘快捷键,以增强应用程序的交互性和易用性。KeyGesture类位于System.Windows.Input命名空间中,它提供了一种方便的方式来定义和处理用户通过键盘操作执行的命令或操作。KeyGesture 类还提供了一些方法和事件,用于检查快捷键是否被按下、解析键盘输入以及处理快捷键的相关逻辑。

2024-01-03 11:15:21 420

原创 C#中的readonly关键字

与Const关键字不同的是,readonly字段的值可以在运行时通过构造函数进行初始化,并且每个实例可以具有不同的值,而const字段的值在编译时就被确定,并且在所有实例中都是相同的。1、修饰字段:当将readonly关键字用于字段时,表示该字段只能在声明时或构造函数中进行赋值,并且不能再修改。也就是说,只能对readonly字段进行初始化,之后不能改变它的值。2、修饰局部变量:将readonly关键字用于局部变量时,表示该变量只能在声明时进行初始化,并且不能再修改。

2024-01-03 10:06:33 460

原创 C# 委托

以这种方式使用委托时,使用委托的代码不需要了解所使用方法的实现。若要注册事件,收件人需要创建一个旨在处理该事件的方法,然后为该方法创建一个委托,并将该委托传递给事件源。调用委托将调用附加到委托实例的方法。调用方传递给委托的参数将传递给该方法,并且该方法的返回值(如果有)将由委托返回给调用方。除了它包装的方法之外,委托不知道实例类型,因此委托可以引用任何类型的对象,只要该对象上有一个与委托签名匹配的方法。委托是一种安全封装方法的类型,有点类似于C和C++中的函数指针,委托是面向对象的、类型安全的。

2024-01-02 16:49:55 685

原创 浅谈命令模式

总结起来,在MVVM模式中,接收者就是ViewModel,负责执行具体的操作。调用者是View或者XAML页面,负责创建和发送命令给接收者执行。而客户端指的是整个应用程序,负责创建和配置命令对象,并将命令对象发送给接收者(ViewModel)执行。总结起来,命令模式通过将请求封装成对象,实现了请求发送者和接收者之间的解耦,提供了更灵活和可扩展的方式来处理操作请求。命令模式是一种行为设计模式,用于将一个请求封装成一个对象,从而使得请求的发送者和接收者解耦,并支持对请求进行参数化、队列化、撤销和重做等操作。

2024-01-02 10:10:45 841

原创 MultiTrigger触发条件满足后执行的行为Setter和EnterActions

总的来说,Setter用于简单地设置目标属性的值,而EnterActions则用于执行更复杂的动画或多步骤的行为。可以根据具体的需求选择使用哪种方式来定义触发条件满足时的行为。

2023-12-28 10:39:03 383

原创 Trigger和MultiTrigger的区别

Trigger和MultiTrigger都是用于根据属性值的变化来出发一系列操作的WPF触发器。是针对多个属性的触发器。如果需要在多个属性的值同时满足特定条件时触发操作,可以使用。如果只需要监视单个属性的值并触发操作,可以使用。主要区别在于它们所监视的属性和条件的数量。是针对单个属性的触发器,而。

2023-12-27 13:18:37 333

原创 关于TextBox的一些样式

以上代码通过使用x:Key属性,为该样式指定了一个唯一的键值"TextBoxStyle",以便在其他地方引用和应用这个样式。TargetType属性指定了该样式的目标类型为TextBox,表示这个样式将应用于所有TextBox类型的元素。

2023-12-27 10:08:27 432

原创 DataGridTemplateColumn和DataGridTextColumn是WPF中用于在DataGrid控件中定义列的两种不同方式

则适合于需要定制化布局和交互的情况。适合于简单的文本数据显示,而。

2023-12-26 15:24:15 936

原创 BindingData涉及的三个关键元素:数据源 路径 目标

将TextBolck视为数据绑定的目标,通过设置Binding的Path属性来指定从数据源中获取数据的方式.数据就会自动地在数据源发生变化时更新到TextBolck上。

2023-12-26 15:07:16 376

原创 DataGrid.InputBindings

XAML标签,用于定义DataGrid控件的输入绑定。输入绑定允许你在特定的输入事件(如按键或鼠标操作)发生时执行特定的命令或逻辑。在<DataGrid.InputBindings>中可以定义多个<InputBinding>元素,每个元素表示一个输入绑定。

2023-12-26 11:23:52 485

原创 DataGrid

WPF的一个控件,用于显示和编辑表格数据。它提供了丰富的功能,使用户能够以可视化和交互的方式浏览、排序、筛选和编辑数据。

2023-12-26 10:31:32 334

原创 Grid和StackPanel不同的特点和区别

Grid适合于复杂的网格布局,可以精确控制控件的位置和大小;而StackPanel适合于简单的线性布局,按照水平或垂直方向堆叠控件。

2023-12-25 19:30:23 744

原创 ControlTemplate.Triggers和Style.Triggers在WPF中有不同的作用

ControlTemplate.Triggers允许我们在控件模板内部定义触发器,当特定条件满足时,触发器可以改变控件的外观或行为。与ControlTemplate.Trigger不同,Style.Triggers用于在控件的外观样式中定义触发器,以根据特定条件修改控件的外观属性。ControlTemplate.Triggers用于自定义控件模板中的触发器定义,而Style.Triggers用于控件外观样式中的触发器定义。两者都是WPF中用于响应条件并改变控件行为或外观的重要机制。

2023-12-25 19:03:41 492

原创 XAML中引用资源的两种不同形式:StaticResource和DynamicResource

故,当你需要使用一个能够在运行时根据资源值的更改而自动更新的属性时,如背景颜色,你应该使用DynamicResource。这样,如果你在应用程序中更改了按钮的默认背景资源,所有使用该资源的按钮会自动更新其背景颜色。当然,如果资源的值在运行时不会发生变化,并且你希望在编译时就将其解析为静态值,那么你可以使用 StaticResource。这样可以提高应用程序的性能,因为资源只需解析一次。DynamicResource用于需要动态更新的属性,而StaticResource用于不需要动态更新的属性。

2023-12-25 15:46:05 502

原创 WPF之 UserControl和Windows的区别

1、UserControl是一个可重用的自定义控件,它通常是由多个内置控件组成的,并提供里一定程度的功能和逻辑。3、UserControl 不支持直接设置窗口样式、调整大小、移动位置等窗口级别的操作,因为它是一个控件;而Window具有与窗口相关的特性,例如标题、最大化、最小化、关闭等。4、UserControl中通常不包含窗口级别的时间处理逻辑,例如窗口关闭事件、窗口激活事件等。UserControl更适合实现某个特定的控件或模块,而 Window更适合作为应用程序的顶级容器。

2023-12-25 13:35:27 584

原创 NUnit测试框架

但是,在某些情况下,测试方法需要接受任何类型的参数,例如对于某些通用的测试方法。同时,由于测试方法可以接受任何类型的参数,因此需要在测试方法中进行参数类型检查和转换,以确保测试数据的正确性。但是,对于非托管内存,CLR无法自动释放它们。第二个参数通常指定需求的编号,可以是任何标识符,例如SRQ-123、FRQ-456、NFR-789等,这个编号通常是由需求管理工具自动生成的,也可以是手动指定的。标记一个方法,该方法将在每个测试方法之前执行,可以在该方法中进行一些初始化操作,例如创建测试对象、设置测试环境。

2023-12-20 17:25:16 388

原创 System.NotSupportedException异常

Moq只能对虚拟成员进行验证。

2023-12-20 13:35:56 505

原创 System.InvalidOperationException:调用线程必须为STA,因为许多UI组件都需要

根据提示的错误信息,测试方法需要在STA(单线程单元)模式下运行。这通常发生在使用WPF或WinFroms的UI测试时,由于UI组件需要在STA模式下运行,因此直接在非STA线程上创建UI对象会引发该异常。增加[STAThhread]特性来将测试方法标记为需要在STA模式下运行。这样在测试方法执行时会自动创建一个STA线程来运行测试方法,并且可以安全地创建UI对象。为了解决这个问题,我们可以通过使用STAThread特性来将测试方法标记为需要在STA模式下运行。如果你的测试不涉及UI交互,则无需该属性。

2023-12-20 11:09:25 737

原创 Assert断言

调用Assert.Throws<NotlmplementedException>来验证是否抛出了NotlmplementedException异常。如果方法抛出了该异常,测试将通过;如果没有抛出该异常,测试将失败。2、Assert.Throws<NotlmplementedException>(()=>实例.函数(参数));TExpected是期望的类型,actual是实际的对象。验证actual是否是TExpected类型的实例,

2023-12-12 20:11:37 365

原创 MVVM:用于建构用户界面的软件架构模式

在MVVM结构中,视图通过数据绑定将其显示的数据和用户输入与视图模型关联起来。视图模型从模型中获取数据,并将其转换为适合视图显示的形式。通过这种方式,视图和视图模型实现了双向的数据交互,使得应用程序的界面与数据保持同步。视图模型(ViewModel):视图模型是视图和模型之间的中介,负责处理视图的交互逻辑、数据转换和数据绑定。MVVM架构通过数据绑定机制实现视图和视图模型之间的解耦,使得视图的更新和用户交互能够自动反映在视图模型上,而不需要显式的代码处理。模型可以是实体类、数据库、网络服务或其他数据源。

2023-12-12 11:17:53 347

原创 项目中的Config文件

通过将配置信息存储到config文件中,我们可以在不修改代码的情况下更改应用程序的行为,而只需编辑config文件即可。config文件提供了一种方便的方式来管理应用程序的配置设置。在运行时,应用程序可以通过读取配置文件中的配置节来获取相应的配置信息,然后根据这些配置信息进行相应的处理。config文件用于存储应用程序的配置信息,提供了一种灵活和可扩展的方式来管理应用程序的行为和设置。配置文件可以包含多个配置节(Section),每个配置节对应一个特定的配置信息。

2023-12-12 10:05:05 493

原创 C#方法注释

param> 对方法的参数进行说明 <param name="xxxx">value<param>对于一个方法 输入///后,会自动添加<summary>、<param>、<returns><summary>:对共有类型的类、方法、属性、字段进行注释。<returns>定义方法的返回值。

2023-12-07 16:23:09 428

原创 单元测试Nunit的几种断言

2. Assert.IsTrue/Assert.IsFalse:验证一个条件是否为真或者是否为假。3. Assert.IsNull/Assert.IsNotNull:验证一个对象是否为null或者是否不为null。8. Assert.That:使用更灵活的语法来编写更复杂的断言。6. Assert.Greater/Assert.Less:判断一个数值是否大于/小于另一个数值。7. Assert.Contains:验证集合中是否包含某个元素。4. Assert.Throws:验证是否抛出了指定的异常。

2023-12-07 13:55:49 782

原创 wpf:路由事件与直接事件的区别

路由事件:事件拥有者和事件响应者之间则没有直接显示的订阅关系。事件的拥有者只负责激发事件,事件将由谁响应它并不知道,事件的响应者则安装有事件侦听器,针对某类事件进行侦听,当有此类事件传递至此时事件响应者就使用事件处理器来响应事件并决定事件是否可以继续传递。直接事件激发时,发送者直接将消息通过事件订阅交送给事件响应者,事件响应者使用其事件处理器方法对事件的发生做出响应、驱动程序逻辑按客户需求运行。

2023-12-05 11:40:59 497

原创 整理了一些WPF的布局

在StackPanel中放入TextBox。在DockPanel里放TextBox。在Canvas里放入TextBox。

2023-12-05 09:28:28 959

原创 依赖属性(Dependency Property)

用一句话概括DependencyProperty对象的创建与注册,那就是:创建一个DependencyProperty实例并用它的CLR属性名和宿主类型名生成hash code,最后把hash code 和DependencyProperty实例作为Key-Value存入全局的、名为PropertyFromName的Hashtable中,这样,WPF属性系统通过CLR属性名和宿主类型名就可以从这个全局的Hashtable中检索出对应的DependencyProperty实例。这句话的函数嵌套比较深,展开。

2023-12-04 16:34:17 706

原创 C#:内存分配

垃圾回收器(Garbage Collector):CLR中的垃圾回收器负责周期性地扫描托管堆,标记和释放不再使用的对象。非托管资源管理问题:尽管托管内存机制可以自动管理托管堆中的对象,但对于非托管资源(如文件句柄、数据库连接等),开发人员仍需要手动管理它们。例如,如果托管堆中包含大量的对象,垃圾回收器的操作可能会导致明显的延迟和资源占用。额外的内存开销:与手动管理内存相比,托管内存需要更多的内存来存储垃圾回收器、托管堆等CLR组件。垃圾回收器定期扫描托管堆,删除不再使用的对象并释放它们占用的内存。

2023-12-04 10:21:08 513

原创 MultiBinding(多路Binding)

有时候UI要需要显示的信息由不止一个数据来源决定,这个时候就需要用到MultiBinding。效果图:主要看一下button!用一个小例子介绍一下。

2023-12-01 16:40:12 379

原创 使用Binding的RelativeSource

但是有的时候我们不能确定作为Source的对象叫什么名字,但知道它与作为Binding目标的对象在UI上有相对关系,比如:空间自己关联自己的某个数据、关联自己某级容器的数据。一个Binding有明确的数据来源 可以通过Source或ElementName赋值的方法让Binding与之关联。把TextBox的Text属性关联到外层容器的Name属性上 在XAML中插入代码。也可以在窗体的构造器中创建RelativeSource的对象再进行Binding。

2023-12-01 15:07:41 427

原创 把空间作为Binding源与Binding标记扩展

【代码】把空间作为Binding源与Binding标记扩展。

2023-12-01 14:35:52 353 1

原创 如何让属性具备通知Binding值已经改变的能力?

在属性的set语句中激发一个PropertyChanged事件,这个事件不需要我们声明,我们要做的是让作为数据源的类实现System.ComponentModel名称空间中的INotifyPropertyChanged接口。当Binding设置了数据源后,Binding就会自动侦听来自这个接口的PropertyChanged事件。

2023-12-01 14:33:10 369 1

原创 DataBinding学习之如何通过XAML来构建后台类对象?

如果不在同一个程序集需要加上";assembly=程序集名称"。我们需要为Student类重写一个合适的ToString。ok然后就能运行出来了!1、首先在XAML中增加一个映射。如何在XAML中访问这个类?首先分清wpf中的类。

2023-12-01 14:26:52 609 1

原创 TextBox各部分的颜色

BorderBrush:边框颜色 CaretBrush:光标颜色 BackGroud:背景颜色

2023-12-01 14:18:56 486 1

原创 Button控件属于ContentControl类只能由单一元素充当其内容,换句话说,Button只能接受有一个元素作为它的Content,如果需要一个带图标的Button该怎么办?

控件的内容也可以是空间。先用一个可以包含多个元素的布局空间把图片和文字包装起来,再把这个布局空间作为Button的内容。

2023-12-01 14:17:00 362 1

原创 wpf如何更改启动页面

情况一:新xaml文件和App.xaml文件位于同一级目录,可以直接更改App.xaml中的StartupUri=“xxx”1、更改App.xaml中的StartupUri=“xxx”,位于window目录。2、在App.xaml.cs中添加Application_Startup方法。情况二:新xaml文件和App.xaml文件位于不同目录。

2023-12-01 14:14:49 572 1

原创 C#:高级篇学习

Obsolete.Net允许创建自定义特性,用于存储声明性的信息,且可在运行时被检索。该信息根据设计标准和应用程序需要,可与任何目标元素相关声明构建在目标程序元素上应用通过反射访问特性。

2023-11-29 09:21:20 920 1

转载 2323-11-23:C#基础篇学习(转载)

访问修饰符>(参数列表)方法主体;

2023-11-26 19:13:10 37 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除