
WPF
文章平均质量分 91
dino.c
这个作者很懒,什么都没留下…
展开
-
[WPF] 使用 MVVM Toolkit 构建 MVVM 程序
1. 什么是 MVVM Toolkit模型-视图-视图模型 (MVVM) 是用于解耦 UI 代码和非 UI 代码的 UI 体系结构设计模式。 借助 MVVM,可以在 XAML 中以声明方式定义 UI,并使用数据绑定标记将 UI 链接到包含数据和命令的其他层。微软虽然提出了 MVVM,但又没有提供一个官方的 MVVM 库(多年前有过 Prism,但已经离家出走了)。每次有人提起 MVVM 库,有些人会推荐 Prism(例如我),有些人会推荐 MVVMLight。可是现在 Prism 已经决定不再支持原创 2021-08-24 09:18:23 · 1686 阅读 · 0 评论 -
[WPF] 使用 Visual Studio App Center 持续监视应用使用情况和问题
1. 什么是AppCenterVisual Studio App Center 是几个常见移动开发和云集成服务(如持续集成、持续交付和自动 UI 测试等服务)的集合。 这些 App Center 服务可以针对 iOS、Android、WPF/Winforms、通用 Windows 平台 (UWP) 和 tvOS 应用运行。App Center 服务使开发人员可以轻松地生成、测试和分发应用程序。 应用由测试人员或客户使用之后,App Center 会提供服务来监视其应用的使用情况和问题。作为一个桌面软件原创 2021-08-24 09:15:53 · 563 阅读 · 0 评论 -
[Azure DevOps] 如何使用任务组
1. 使用 PowerShell 脚本在上一篇文章中我们学会了怎么使用扩展在编译前实时更改版本号。有些情况下我们希望不适用扩展,例如喜欢发明轮子,或者根本没有安装扩展的权限。这时候我们可以自己写 PowerShell 解决这个问题。在 Pipeline 中添加一个 PowerShell 的任务,Type 选择 Inline,然后在 Script 里输入这段 PowerShell 脚本:$ComponentPath = $Env:Build_SourcesDirectory$VersionNumber原创 2021-06-23 13:38:01 · 381 阅读 · 1 评论 -
[Azure DevOps] 编译时自动修改版本号
1. 需求在使用 Pipeline 自动化 CI/CD 流程的过程中,我还还需要自动修改程序集的版本号。这个功能 EdiWang 和LeoLaw 都写文章讲解过做法。不过我的项目基本都是 .Net Framework 项目,而且我的版本号规则也不一样,所以这里分享一下我的做法。我用的规则版本号规则是 [Major].[Minor].[BuildId].0,其中:进行不兼容的 API 更改时,Major 将会增加以后向兼容方式添加功能时,Minor 将会增加Buildid 是一个也称为运行 ID原创 2021-06-23 13:37:25 · 625 阅读 · 0 评论 -
[Azure DevOps] 使用 Inno Setup 制作桌面软件安装包
1. 桌面应用程序的 CI/CD桌面应用程序的 CI/CD 过程和网站有一些不同,毕竟桌面应用程序的“部署”只是将安装包分发到目标位置,连应用商店都不用上,根据公司的管理流程可以很复杂,也可以很简单。在简单的情况下,Azure Pipelines 中一个桌面应用(WPF)的 CI/CD 过程如下:触发器启动 Pipeline构建 WPF 应用程序启动单元测试以确保构建质量创建安装包将安装包复制到目标位置通知用户新安装包已经可以获取在使用 Azure Pipelines 实现 CI 这篇文原创 2021-06-23 13:35:41 · 402 阅读 · 0 评论 -
[Azure DevOps] 如何安装并配置 Build Agent
1. 编译服务器在 Azure Pipelines 中至少需要一个编译服务器的 Agent 才能编译代码或发布软件。Azure DevOps 本身已经提供了一个 Agent,但出于各种理由(需要特殊的编译打包环境、需要更高的性能、需要更多的控制权等)很多时候需要一些自托管代理。这篇文章将讲解如何在 Windows 系统上安装及配置 Build Agent(主要基于之前几篇文章所构建的环境)。2. 下载 Agent 安装程序首先进入要安装 Build Agent 的 Windows 系统,然后访问 Az原创 2021-06-23 13:34:18 · 847 阅读 · 0 评论 -
[Azure DevOps] 获取单元测试的代码覆盖率
1. 获取代码覆盖率上一篇文章里,我们在 Pipeline 中插入一个单元测试并把所有单元测试都通过作为 Pipeline 通过的硬性要求。除此以外,我们还可以获取单元测试的代码覆盖率,用作衡量代码质量的指标。代码覆盖率没有一个标准,各个项目有各个项目的造化,不一定更高的单元测试覆盖率就代表项目的代码质量高。不过通过观察代码覆盖率的趋势也可以从另一个角度衡量项目的代码质量。在 Azure Devops 有不同的方式生成代码覆盖率,例如使用 .NET Core CLI 编译项目的话可以参考这篇文章生成代原创 2021-06-23 13:33:24 · 437 阅读 · 0 评论 -
[Azure DevOps] 使用 Azure Pipelines 实现 CI
1. 什么是 Azure PipelinesAzure Pipelines 会自动构建和测试代码项目,以将其提供给其他人。它适用于任何语言或项目类型。Azure Pipelines 结合了持续集成 (CI) 和持续交付 (CD),以持续不断地测试和构建您的代码,并将代码运送到任何目标。在网上关于 Azure Pipelines 的教程很多,通常都是从 CI 到 CD 一条龙。但对于 WPF 来说也 CD 部分就有些尴尬,毕竟桌面应用通常不需要“部署”,所以这篇文章将只简单介绍如何创建编译 WPF 代码.原创 2021-06-23 13:32:13 · 2896 阅读 · 2 评论 -
[Azure DevOps] 使用 Azure Boards 管理工作
1. 什么是 Azure Boards通过 Azure Boards 网络服务,团队可以管理其软件项目。它提供了丰富的功能,包括 Scrum 和看板的本地支持、可定制的仪表板和集成报告。这些工具可以随着业务的发展而扩展。您可以快速轻松地开始跟踪与项目相关的用户故事、积压项目、任务、功能和错误。您通过根据项目可用的过程和工作项目类型添加工作项目来跟踪工作。上面是官方的说明,简单来说 Azure Boards 是 Azure Devops 提供的在线敏捷工具。Azure Borads 提供了很多很多功能.原创 2021-06-23 13:31:24 · 698 阅读 · 1 评论 -
[Azure DevOps] 使用 Azure Boards 管理工作
1. 什么是 Azure Boards通过 Azure Boards 网络服务,团队可以管理其软件项目。它提供了丰富的功能,包括 Scrum 和看板的本地支持、可定制的仪表板和集成报告。这些工具可以随着业务的发展而扩展。您可以快速轻松地开始跟踪与项目相关的用户故事、积压项目、任务、功能和错误。您通过根据项目可用的过程和工作项目类型添加工作项目来跟踪工作。上面是官方的说明,简单来说 Azure Boards 是 Azure Devops 提供的在线敏捷工具。Azure Borads 提供了很多很多功能.原创 2021-06-23 13:30:37 · 441 阅读 · 0 评论 -
使用 XAML 格式化工具:XAML Styler
1. XAML 的问题刚入门 WPF/UWP 之类的 XAML 平台,首先会接触到 XAML 这一新事物。初学 XAML 时对它的印象可以归纳为一个词:一坨。随着我在 XAML 平台上工作的时间越来越长,我对 XAML 的了解就越来越深入,从语法、约束、扩展性等方方面面,我明白到 XAML 是桌面开发平台的一个最佳解决方案。这时候我已经对 XAML 有了改观,我重新用一个词归纳了我对它的印象:一大坨。没错,这时候我已经是一个成熟的 XAML 工人了,经过我熟练的双手产生了一坨又一坨 XAML,它们成长原创 2021-03-15 11:26:21 · 1200 阅读 · 0 评论 -
[WPF] 在单元测试中使用 Prism 的 EventAggregator,订阅到 ThreadOption.UIThread 会报错
1. 问题[TestClass]public class UnitTest1{ [TestMethod] public void TestMethod1() { ContainerLocator.Container.Resolve<TestViewModel>(); }}public class TestViewModel{ public TestViewModel(IEventAggregator eventAggregat原创 2021-03-15 11:25:37 · 699 阅读 · 3 评论 -
[WPF] 让第一个数据验证出错(Validation.HasError)的控件自动获得焦点
1. 需求在上一篇文章 《在 ViewModel 中让数据验证出错(Validation.HasError)的控件获得焦点》中介绍了如何让 Validation.HasError 的控件自动获得焦点,之后引申了另一个问题:如果有多个 HasError 的控件,如何只让第一个自动获得焦点。这需求比较常见,所以我试着解决这个问题,最终完成了一个 Demo,XAML 如下:<StackPanel local:ValidationService.IsValidationScope="True">原创 2021-03-15 11:15:59 · 795 阅读 · 0 评论 -
[WPF] 在 ViewModel 中让数据验证出错(Validation.HasError)的控件获得焦点
1. 需求在 MVVM 中 ViewModel 和 View 之间的交互通常都是靠 Icommand 和 INotifyPropertyChanged,不过有时候还会需要从 MVVM 中控制 View 中的某个元素,让它获得焦点,例如这样:上面的 gif 是我在另一篇文章 《自定义一个“传统”的 Validation.ErrorTemplate》 中的一个示例,在这个示例中我修改了 Validation.ErrorTemplate,这样在数据验证出错后,相关的控件会显示一个红色的框,获得焦点后用 Po原创 2021-03-15 11:15:09 · 674 阅读 · 1 评论 -
总结 Visual Studio 2019 发布以来 XAML 工具的改进
不知不觉,Visual Studio 2019 已经出到 16.8 和 16.9 Preview 了。虽然每次更新都林林总总地一大堆新功能和改进,但关于 XAML 的内容总是,always,每次都只有一点点。其实 Xamarin 相关的内容有在使劲地更新,不过和我做的 WPF/UWP 关系又不大。总算是积少成多,随着 Visual Studio 持续更新,现在 XAML 编辑器的使用体验已经比去年有了很大的改善。这篇文章就来总结下 Visual Studio 2019 发布后 XAML 工具的各个主要改变。原创 2020-12-17 21:12:08 · 697 阅读 · 2 评论 -
WinUI 3 Preview 3 发布了,再一次试试它的性能
1. WinUI 3在微软 Build 2020 开发者大会上,WinUI 团队宣布可公开预览的 WinUI 3 Preview 1,它让开发人员可以在 Win32 中使用 WinUI。最终 XAML 的新功能不再和 Windows SDK 绑定,所有新的 XAML 功能都将作为 WinUI 的一部分发布。 作为 OS 的一部分发布的现有 UWP XAML API 将不会再收到新的功能更新。 但是,它们会在 Windows 10 支持生命周期内继续收到安全更新和关键修复程序。2. WinUI 3 第三.原创 2020-12-17 21:11:22 · 1833 阅读 · 0 评论 -
[Windows] 在 Microsoft Docs 网站中挖掘 MVVM 的各种学习资源
最近写了一些 MVVM 框架的文章,翻了一些 Microsoft Docs 的文档,顺便就对 MVVM 本身来了兴致,想看看更多当年相关的文档。在 MVVM 出现后十多年,我在不同的场合见到过多种 MVVM 的实现方式,也看到过各种 MVVM 框架的多次改进(这些框架通常包含多个用于实现解耦体系结构的服务,在一定程度上使 MVVM 的确切定义变得模糊),这些都让我对 MVVM 的理解变得多样化。这种情况下重温一下 MVVM 的文档也并不是毫无意义。在 Microsoft Docs 网站上搜 “MVVM”.原创 2020-12-17 21:10:33 · 160 阅读 · 0 评论 -
[Windows] Prism 8.0 入门(下):Prism.Wpf 和 Prism.Unity
1. Prism.Wpf 和 Prism.Unity这篇是 Prism 8.0 入门的第二篇文章,上一篇介绍了 Prism.Core,这篇文章主要介绍 Prism.Wpf 和 Prism.Unity。以前做 WPF 和 Silverlight/Xamarin 项目的时候,我有时会把 ViewModel 和 View 放在不同的项目,ViewModel 使用 可移植类库项目,这样 ViewModel 就与 UI 平台无关,实现了代码复用。这样做还可以强制 View 和 ViewModel 解耦。现在,即原创 2020-12-17 21:09:55 · 1808 阅读 · 1 评论 -
[Windows] Prism 8.0 入门(上):Prism.Core
1. Prism 简介Prism 是一个用于构建松耦合、可维护和可测试的 XAML 应用的框架,它支持所有还活着的基于 XAML 的平台,包括 WPF、Xamarin Forms、WinUI 和 Uwp Uno。Prism 提供了一组设计模式的实现,这些模式有助于编写结构良好且可维护的 XAML 应用程序,包括 MVVM、依赖项注入、命令、事件聚合器等。Prism 是一个有10年以上历史的框架,而上个月才刚发布了它的 8.0 版本,这意味着现在网上能找到的大部分 Prism 的资料都已经有点过时,连 官原创 2020-12-17 21:09:19 · 1695 阅读 · 2 评论 -
WinUI 3 试玩报告
1. 什么是 WinUI 3在微软 Build 2020 开发者大会上,WinUI 团队宣布可公开预览的 WinUI 3 Preview 1,它让开发人员可以在 Win32 中使用 WinUI。WinUI 3 Preview 1 包含新的 VisualStudio 项目模板,可以创建面向 .NET 5 的 C# 和 C++/Win32 项目。从技术上讲,WinUI 3 将 UWP 的 XAML、Composition 和 Input 层分离,并通过NuGet将它们独立分发给针对Windows 10 版本.原创 2020-06-08 09:14:53 · 4669 阅读 · 5 评论 -
[WPF]总结一些我在开发WPF时常用的工具
我从一万二千年前开始写XAML,这么多年用了很多各式各样的工具,现在留在电脑里的、现在还在用的、在写WPF时用的也就那么几个。这篇文章总结了这些工具,希望这些工具可以让WPF开发者事半功倍。1. Visual StudioVisual Studio应该无需介绍,它是“面向任何开发者的同类最佳工具”。对WPF来说Visual Studio既是鸡又是蛋,WPF开发者甚至有时会反编译它的代码参考参...原创 2020-03-31 09:49:00 · 1289 阅读 · 0 评论 -
[WPF 自定义控件]自定义一个“传统”的 Validation.ErrorTemplate
1. 什么是Validaion.ErrorTemplate数据绑定模型允许您将与您Binding的对象相关联ValidationRules。 如果用户输入的值无效,你可能希望在应用程序 用户界面 (UI) 上提供一些有关错误的反馈。 提供此类反馈的一种方法是设置Validation.ErrorTemplate附加到自定义ControlTemplate的属性。有关验证的详细讨论, 请参阅数据绑...原创 2020-03-23 12:50:55 · 791 阅读 · 0 评论 -
[WPF 自定义控件]在MenuItem上使用RadioButton
1. 需求上图这种包含多选(CheckBox)和单选(RadioButton)的菜单十分常见,可是在WPF中只提供了多选的MenuItem。顺便一提,要使MenuItem可以多选,只需要将MenuItem的IsCheckable属性设置为True:<MenuItem IsCheckable="True"/>不知出于何种考虑,WPF没有为MenuItem提供单选的功能。为了在M...原创 2020-03-23 12:50:29 · 801 阅读 · 0 评论 -
[WPF 自定义控件]创建包含CheckBox的ListBoxItem
1. 前言Xceed wpftoolkit提供了一个CheckListBox,效果如下:不过它用起来不怎么样,与其这样还不如参考UWP的ListView实现,而且动画效果也很好看:它的样式如下:<ListViewItemPresenter ContentTransitions="{TemplateBinding ContentTransitions}" x:Name="R...原创 2020-03-23 12:46:22 · 1320 阅读 · 0 评论 -
[WPF自定义控件库] 模仿UWP的ProgressRing
1. 为什么需要ProgressRing虽然我认为这个控件库的控件需要模仿Aero2的外观,但总有例外,其中一个就是ProgressRing。ProgressRing是来自UWP的控件,部分代码参考了 这里。ProgressRing的使用方式运行效果如下:<kino:ProgressRing IsActive="True" Height="4...原创 2019-10-21 09:19:14 · 316 阅读 · 0 评论 -
[WPF自定义控件库]使用WindowChrome自定义RibbonWindow
1. 为什么要自定义RibbonWindow自定义Window有可能是设计或功能上的要求,可以是非必要的,而自定义RibbonWindow则不一样:如果程序使用了自定义样式的Window,为了统一外观需要把RibbonWindow一起修改样式。为了解决RibbonWindow的BUG。如上图所示,在Windows 10 上运行打开RibbonWindow,可以看到标题栏的内容(包括分...原创 2019-06-13 09:20:07 · 771 阅读 · 0 评论 -
[WPF自定义控件库]简单的表单布局控件
1. WPF布局一个表单<Grid Width="400" HorizontalAlignment="Center" VerticalAlignment="Center"> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition H...原创 2019-05-29 10:14:05 · 909 阅读 · 0 评论 -
[WPF自定义控件]从ContentControl开始入门自定义控件
1. 前言我去年写过一个在UWP自定义控件的系列博客,大部分的经验都可以用在WPF中(只有一点小区别)。这篇文章的目的是快速入门自定义控件的开发,所以尽量精简了篇幅,更深入的概念在以后介绍各控件的文章中实际运用到才介绍。ContentControl是WPF中最基础的一种控件,Window、Button、ScrollViewer、Label、ListBoxItem等都继承自ContentCont...原创 2019-05-17 23:06:15 · 1037 阅读 · 0 评论 -
[WPF自定义控件库]以Button为例谈谈如何模仿Aero2主题
1. 为什么选择Aero2除了以外观为卖点的控件库,WPF的控件库都默认使用“素颜”的外观,然后再提供一些主题包。这样做的最大好处是可以和原生控件或其它控件库兼容,而且对于大部分人来说模仿原生的主题也比自己设计一套好看的UI容易得多。WPF有以下几种原生主题:主题文件桌面主题Classic.xamlWindows XP 操作系统上的经典 Windows 外观(Wind...原创 2019-05-27 11:06:34 · 298 阅读 · 0 评论 -
[WPF自定义控件库] 自定义控件的代码如何与ControlTemplate交互
1. 前言WPF有一个灵活的UI框架,用户可以轻松地使用代码控制控件的外观。例设我需要一个控件在鼠标进入的时候背景变成蓝色,我可以用下面这段代码实现:protected override void OnMouseEnter(MouseEventArgs e){ base.OnMouseEnter(e); Background = new SolidColorBrush(Col...原创 2019-05-22 20:13:16 · 442 阅读 · 0 评论 -
[WPF自定义控件] 开始一个自定义控件库项目
1. 目标我实现了一个自定义控件库,并且打算用这个控件库作例子写一些博客。这个控件库主要目标是用于教学,希望通过这些博客初学者可以学会为自己或公司创建自定义控件,并且对WPF有更深入的了解。控件库已放在Github上,并且也以发布到NuGet。现阶段我的目标是实现一些简单的控件,由于我并不是打算重复造轮子,所以我会挑些Extended Wpf Toolkit没有的功能实现,之后再根据常用的...原创 2019-05-13 09:56:57 · 1128 阅读 · 0 评论 -
[WPF自定义控件库]了解如何自定义ItemsControl
1. 前言对WPF来说ContentControl和ItemsControl是最重要的两个控件。顾名思义,ItemsControl表示可用于呈现一组Item的控件。大部分时候我们并不需要自定义ItemsControl,因为WPF提供了一大堆ItemsControl的派生类:HeaderedItemsControl、TreeView、Menu、StatusBar、ListBox、ListView...原创 2019-05-20 22:11:16 · 2249 阅读 · 0 评论 -
[WPF]如何使用代码创建DataTemplate(或者ControlTemplate)
1. 前言上一篇文章([UWP]如何使用代码创建DataTemplate(或者ControlTemplate))介绍了在UWP上的情况,这篇文章再稍微介绍在WPF上如何实现。2. 使用FrameworkElementFactoryFrameworkElementFactory用于以编程的方式创建模板,虽然文档中说不推荐,但WPF中常常使用这个类,例如DisplayMemberTemplate...原创 2019-01-17 09:07:09 · 917 阅读 · 0 评论 -
[UWP]如何使用代码创建DataTemplate(或者ControlTemplate)
1. 前言在UWP中DataTemplate是一个十分重要的功能,并且几乎无处不在,例如DataGrid中的DataGridTemplateColumn:<controls:DataGridTemplateColumn.CellTemplate> <DataTemplate> <StackPanel Orientation="Horizon...原创 2019-01-16 09:37:59 · 505 阅读 · 0 评论 -
[WPF自定义控件库] 让Form在加载后自动获得焦点
1. 需求加载后让第一个输入框或者焦点是个很基本的功能,典型的如“登录”对话框。一般来说“登录”对话框加载后“用户名”应该马上获得焦点,用户只需输入用户名,点击Tab,再输入密码,点击回车就完成了登录操作。在WPF中要让一个控件在加载时获得焦点应该很简单,只需要在Loaded事件后调用Focus()就行了。但有时表单是动态添加的,或者第一个表单元素会根据某些条件显示或隐藏,这时很难简单地让第一...原创 2019-06-02 14:42:41 · 523 阅读 · 0 评论 -
[WPF自定义控件]Window(窗体)的UI元素及行为
1. 前言本来打算写一篇《自定义Window》的文章,但写着写着发觉内容太多,所以还是把使用WindowChrome自定义Window需要用到的部分基础知识独立出来,于是就形成了这篇文章。无论是桌面编程还是日常使用,Window(窗体)都是最常接触的UI元素之一,既然Window这么重要那么多了解一些也没有坏处。2.标准Window这篇文章主要讨论标准的Window,不包括奇形怪状的无边...原创 2019-06-10 10:28:55 · 435 阅读 · 0 评论 -
[WPF自定义控件]使用WindowChrome自定义Window Style
1. 为什么要自定义Window对稍微有点规模的桌面软件来说自定义的Window几乎是标配了,一来设计师总是克制不住自己想想软件更个性化,为了UI的和谐修改Window也是必要的;二来多一行的空间可以添加很多功能,尤其是上边缘,因为被屏幕限制住鼠标的移动所以上边缘的按钮很容易选中。做桌面开发总有一天会遇到自定义Window的需求,所以我在控件库中也提供了一个简单的自定义Window。2. 我想...原创 2019-06-11 09:01:42 · 966 阅读 · 0 评论 -
[WPF自定义控件库] 关于ScrollViewr和滚动轮劫持(scroll-wheel-hijack)
1. 什么是滚动轮劫持这篇文章介绍一个很简单的继承自ScrollViewer的控件:public class ExtendedScrollViewer : ScrollViewer{ protected override void OnMouseWheel(MouseWheelEventArgs e) { if (ViewportHeight + Vertic...原创 2019-08-29 11:13:02 · 352 阅读 · 0 评论 -
[WPF自定义控件库] 给WPF一个HyperlinkButton
1. 在WPF怎么在UI上添加超级链接这篇文章的目的是介绍怎么在WPF里创建自定义的HyperlinkButton控件。很神奇的,WPF居然连HyperlinkButton都没有,不过它提供了另一种方式用于在UI上添加超级链接:<TextBlock FontSize="20"> <Hyperlink NavigateUri="http://www...原创 2019-08-22 11:05:04 · 374 阅读 · 0 评论 -
[WPF自定义控件库]自定义Expander
1. 前言上一篇文章介绍了使用Resizer实现Expander简单的动画效果,运行效果也还好,不过只有展开/折叠而缺少了淡入/淡出的动画(毕竟Resizer模仿Expander只是附带的功能)。这篇继续Measure的话题,自定义了一个带有动画的ExtendedExpander。2. ExtendedExpander的需求使用Resizer实现的简易Expander没办法在折叠时做淡出动画...原创 2019-07-24 22:14:27 · 966 阅读 · 0 评论