<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[dino.c]]></title><description><![CDATA[微软最有价值专家，Windows Developer]]></description><link>https://blog.csdn.net/cjh623</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; cjh623]]></copyright><item><title><![CDATA[[WPF] 使用 MVVM Toolkit 构建 MVVM 程序]]></title><link>https://blog.csdn.net/cjh623/article/details/119882567</link><guid>https://blog.csdn.net/cjh623/article/details/119882567</guid><author>cjh623</author><pubDate>Tue, 24 Aug 2021 09:18:23 +0800</pubDate><description><![CDATA[1. 什么是 MVVM Toolkit

模型-视图-视图模型 (MVVM) 是用于解耦 UI 代码和非 UI 代码的 UI 体系结构设计模式。 借助 MVVM，可以在 XAML 中以声明方式定义 UI，并使用数据绑定标记将 UI 链接到包含数据和命令的其他层。

微软虽然提出了 MVVM，但又没有提供一个官方的 MVVM 库（多年前有过 Prism，但已经离家出走了）。每次有人提起 MVVM 库，有些人会推荐 Prism（例如我），有些人会推荐 MVVMLight。可是现在 Prism 已经决定不再支持 ]]></description><category></category></item><item><title><![CDATA[[WPF] 使用 Visual Studio App Center 持续监视应用使用情况和问题]]></title><link>https://blog.csdn.net/cjh623/article/details/119882516</link><guid>https://blog.csdn.net/cjh623/article/details/119882516</guid><author>cjh623</author><pubDate>Tue, 24 Aug 2021 09:15:53 +0800</pubDate><description><![CDATA[1. 什么是AppCenter
Visual Studio App Center 是几个常见移动开发和云集成服务（如持续集成、持续交付和自动 UI 测试等服务）的集合。 这些 App Center 服务可以针对 iOS、Android、WPF/Winforms、通用 Windows 平台 (UWP) 和 tvOS 应用运行。
App Center 服务使开发人员可以轻松地生成、测试和分发应用程序。 应用由测试人员或客户使用之后，App Center 会提供服务来监视其应用的使用情况和问题。
作为一个桌面软件]]></description><category></category></item><item><title><![CDATA[[Azure DevOps] 如何使用任务组]]></title><link>https://blog.csdn.net/cjh623/article/details/118151267</link><guid>https://blog.csdn.net/cjh623/article/details/118151267</guid><author>cjh623</author><pubDate>Wed, 23 Jun 2021 13:38:01 +0800</pubDate><description><![CDATA[1. 使用 PowerShell 脚本
在上一篇文章中我们学会了怎么使用扩展在编译前实时更改版本号。有些情况下我们希望不适用扩展，例如喜欢发明轮子，或者根本没有安装扩展的权限。这时候我们可以自己写 PowerShell 解决这个问题。
在 Pipeline 中添加一个 PowerShell 的任务，Type 选择 Inline，然后在 Script 里输入这段 PowerShell 脚本：
$ComponentPath = $Env:Build_SourcesDirectory
$VersionNumber]]></description><category></category></item><item><title><![CDATA[[Azure DevOps] 编译时自动修改版本号]]></title><link>https://blog.csdn.net/cjh623/article/details/118151259</link><guid>https://blog.csdn.net/cjh623/article/details/118151259</guid><author>cjh623</author><pubDate>Wed, 23 Jun 2021 13:37:25 +0800</pubDate><description><![CDATA[1. 需求
在使用 Pipeline 自动化 CI/CD 流程的过程中，我还还需要自动修改程序集的版本号。这个功能 EdiWang 和LeoLaw 都写文章讲解过做法。不过我的项目基本都是 .Net Framework 项目，而且我的版本号规则也不一样，所以这里分享一下我的做法。
我用的规则版本号规则是 [Major].[Minor].[BuildId].0，其中：

进行不兼容的 API 更改时，Major 将会增加
以后向兼容方式添加功能时，Minor 将会增加
Buildid 是一个也称为运行 ID ]]></description><category></category></item><item><title><![CDATA[[Azure DevOps] 使用 Inno Setup 制作桌面软件安装包]]></title><link>https://blog.csdn.net/cjh623/article/details/118151221</link><guid>https://blog.csdn.net/cjh623/article/details/118151221</guid><author>cjh623</author><pubDate>Wed, 23 Jun 2021 13:35:41 +0800</pubDate><description><![CDATA[1. 桌面应用程序的 CI/CD
桌面应用程序的 CI/CD 过程和网站有一些不同，毕竟桌面应用程序的“部署”只是将安装包分发到目标位置，连应用商店都不用上，根据公司的管理流程可以很复杂，也可以很简单。在简单的情况下，Azure Pipelines 中一个桌面应用（WPF）的 CI/CD 过程如下：

触发器启动 Pipeline
构建 WPF 应用程序
启动单元测试以确保构建质量
创建安装包
将安装包复制到目标位置
通知用户新安装包已经可以获取

在使用 Azure Pipelines 实现 CI 这篇文]]></description><category></category></item><item><title><![CDATA[[Azure DevOps] 如何安装并配置 Build Agent]]></title><link>https://blog.csdn.net/cjh623/article/details/118151200</link><guid>https://blog.csdn.net/cjh623/article/details/118151200</guid><author>cjh623</author><pubDate>Wed, 23 Jun 2021 13:34:18 +0800</pubDate><description><![CDATA[1. 编译服务器
在 Azure Pipelines 中至少需要一个编译服务器的 Agent 才能编译代码或发布软件。Azure DevOps 本身已经提供了一个 Agent，但出于各种理由（需要特殊的编译打包环境、需要更高的性能、需要更多的控制权等）很多时候需要一些自托管代理。这篇文章将讲解如何在 Windows 系统上安装及配置 Build Agent（主要基于之前几篇文章所构建的环境）。
2. 下载 Agent 安装程序
首先进入要安装 Build Agent 的 Windows 系统，然后访问 Az]]></description><category></category></item><item><title><![CDATA[[Azure DevOps] 获取单元测试的代码覆盖率]]></title><link>https://blog.csdn.net/cjh623/article/details/118151183</link><guid>https://blog.csdn.net/cjh623/article/details/118151183</guid><author>cjh623</author><pubDate>Wed, 23 Jun 2021 13:33:24 +0800</pubDate><description><![CDATA[1. 获取代码覆盖率
上一篇文章里，我们在 Pipeline 中插入一个单元测试并把所有单元测试都通过作为 Pipeline 通过的硬性要求。除此以外，我们还可以获取单元测试的代码覆盖率，用作衡量代码质量的指标。代码覆盖率没有一个标准，各个项目有各个项目的造化，不一定更高的单元测试覆盖率就代表项目的代码质量高。不过通过观察代码覆盖率的趋势也可以从另一个角度衡量项目的代码质量。
在 Azure Devops 有不同的方式生成代码覆盖率，例如使用 .NET Core CLI  编译项目的话可以参考这篇文章生成代]]></description><category></category></item><item><title><![CDATA[[Azure DevOps] 使用 Azure Pipelines 实现 CI]]></title><link>https://blog.csdn.net/cjh623/article/details/118151172</link><guid>https://blog.csdn.net/cjh623/article/details/118151172</guid><author>cjh623</author><pubDate>Wed, 23 Jun 2021 13:32:13 +0800</pubDate><description><![CDATA[1. 什么是 Azure Pipelines
Azure Pipelines 会自动构建和测试代码项目，以将其提供给其他人。它适用于任何语言或项目类型。Azure Pipelines 结合了持续集成 （CI） 和持续交付 （CD），以持续不断地测试和构建您的代码，并将代码运送到任何目标。
在网上关于 Azure Pipelines 的教程很多，通常都是从 CI 到 CD 一条龙。但对于 WPF 来说也 CD 部分就有些尴尬，毕竟桌面应用通常不需要“部署”，所以这篇文章将只简单介绍如何创建编译 WPF 代码.]]></description><category></category></item><item><title><![CDATA[[Azure DevOps] 使用 Azure Boards 管理工作]]></title><link>https://blog.csdn.net/cjh623/article/details/118151158</link><guid>https://blog.csdn.net/cjh623/article/details/118151158</guid><author>cjh623</author><pubDate>Wed, 23 Jun 2021 13:31:24 +0800</pubDate><description><![CDATA[1. 什么是 Azure Boards
通过 Azure Boards 网络服务，团队可以管理其软件项目。它提供了丰富的功能，包括 Scrum 和看板的本地支持、可定制的仪表板和集成报告。这些工具可以随着业务的发展而扩展。
您可以快速轻松地开始跟踪与项目相关的用户故事、积压项目、任务、功能和错误。您通过根据项目可用的过程和工作项目类型添加工作项目来跟踪工作。
上面是官方的说明，简单来说 Azure Boards 是 Azure Devops 提供的在线敏捷工具。Azure Borads 提供了很多很多功能.]]></description><category></category></item><item><title><![CDATA[[Azure DevOps] 使用 Azure Boards 管理工作]]></title><link>https://blog.csdn.net/cjh623/article/details/118151146</link><guid>https://blog.csdn.net/cjh623/article/details/118151146</guid><author>cjh623</author><pubDate>Wed, 23 Jun 2021 13:30:37 +0800</pubDate><description><![CDATA[1. 什么是 Azure Boards
通过 Azure Boards 网络服务，团队可以管理其软件项目。它提供了丰富的功能，包括 Scrum 和看板的本地支持、可定制的仪表板和集成报告。这些工具可以随着业务的发展而扩展。
您可以快速轻松地开始跟踪与项目相关的用户故事、积压项目、任务、功能和错误。您通过根据项目可用的过程和工作项目类型添加工作项目来跟踪工作。
上面是官方的说明，简单来说 Azure Boards 是 Azure Devops 提供的在线敏捷工具。Azure Borads 提供了很多很多功能.]]></description><category></category></item><item><title><![CDATA[[Azure DevOps] Azure DevOps 入门]]></title><link>https://blog.csdn.net/cjh623/article/details/118151128</link><guid>https://blog.csdn.net/cjh623/article/details/118151128</guid><author>cjh623</author><pubDate>Wed, 23 Jun 2021 13:29:52 +0800</pubDate><description><![CDATA[1. 什么是 Azure DevOps
Azure DevOps 是由微软开发的服务平台，它提供了多种工具，可用于更好地进行团队协作。它还具有用于自动构建过程，测试，版本控制和程序包管理的工具。
Azure DevOps 提供了 5 个主要模块：


Azure Boards：这些是敏捷的工具，可以帮助我们规划、跟踪和讨论我们的工作，甚至与其他团队一起工作。


Azure Repos：提供无限的、云托管的私人和公共 Git 存储库。


Azure Pipelines：使用适用于任何语言、平台和云的 CI]]></description><category></category></item><item><title><![CDATA[[UWP] 模仿哔哩哔哩的一键三连]]></title><link>https://blog.csdn.net/cjh623/article/details/114824237</link><guid>https://blog.csdn.net/cjh623/article/details/114824237</guid><author>cjh623</author><pubDate>Mon, 15 Mar 2021 11:27:38 +0800</pubDate><description><![CDATA[1. 一键三连
什么是一键三连？

哔哩哔哩弹幕网中用户可以通过长按点赞键同时完成点赞、投币、收藏对UP主表示支持，后UP主多用“一键三连”向视频浏览者请求对其作品同时进行点赞、投币、收藏。

去年在云之幻大佬的 哔哩 项目里看到一键三连的 UWP 实现，觉得挺有趣的，这次参考它的代码重新实现一次，最终成果如下：

下面这些是一键三连的核心功能：

可以控制并显示进度
有普通状态和完成状态
可以点击或长按
当切换到完成状态时弹出写泡泡
点击切换状态
长按 2 秒钟切换状态，期间有进度显示

这篇文章将介绍如]]></description><category></category></item><item><title><![CDATA[使用 XAML 格式化工具：XAML Styler]]></title><link>https://blog.csdn.net/cjh623/article/details/114824181</link><guid>https://blog.csdn.net/cjh623/article/details/114824181</guid><author>cjh623</author><pubDate>Mon, 15 Mar 2021 11:26:21 +0800</pubDate><description><![CDATA[1. XAML 的问题
刚入门 WPF/UWP 之类的 XAML 平台，首先会接触到 XAML 这一新事物。初学 XAML 时对它的印象可以归纳为一个词：一坨。
随着我在 XAML 平台上工作的时间越来越长，我对 XAML 的了解就越来越深入，从语法、约束、扩展性等方方面面，我明白到 XAML 是桌面开发平台的一个最佳解决方案。这时候我已经对 XAML 有了改观，我重新用一个词归纳了我对它的印象：一大坨。
没错，这时候我已经是一个成熟的 XAML 工人了，经过我熟练的双手产生了一坨又一坨 XAML，它们成长]]></description><category></category></item><item><title><![CDATA[[WPF] 在单元测试中使用 Prism 的 EventAggregator，订阅到 ThreadOption.UIThread 会报错]]></title><link>https://blog.csdn.net/cjh623/article/details/114824143</link><guid>https://blog.csdn.net/cjh623/article/details/114824143</guid><author>cjh623</author><pubDate>Mon, 15 Mar 2021 11:25:37 +0800</pubDate><description><![CDATA[1. 问题
[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        ContainerLocator.Container.Resolve&lt;TestViewModel&gt;();
    }
}

public class TestViewModel
{
    public TestViewModel(IEventAggregator eventAggregat]]></description><category></category></item><item><title><![CDATA[分别使用 Python 和 Math.Net 调用优化算法]]></title><link>https://blog.csdn.net/cjh623/article/details/114823819</link><guid>https://blog.csdn.net/cjh623/article/details/114823819</guid><author>cjh623</author><pubDate>Mon, 15 Mar 2021 11:19:38 +0800</pubDate><description><![CDATA[1. Rosenbrock 函数
在数学最优化中，Rosenbrock 函数是一个用来测试最优化算法性能的非凸函数，由Howard Harry Rosenbrock 在 1960 年提出  。也称为 Rosenbrock 山谷或 Rosenbrock 香蕉函数，也简称为香蕉函数。
Rosenbrock 函数的定义如下：
f(x)=100(y−x2)2+(1−x)2
Rosenbrock 函数的每个等高线大致呈抛物线形，其全域最小值也位在抛物线形的山谷中（香蕉型山谷）。很容易找到这个山谷，但由于山谷内的值变化]]></description><category></category></item><item><title><![CDATA[在 Azure 上执行一些简单的 python 工作]]></title><link>https://blog.csdn.net/cjh623/article/details/114823762</link><guid>https://blog.csdn.net/cjh623/article/details/114823762</guid><author>cjh623</author><pubDate>Mon, 15 Mar 2021 11:18:51 +0800</pubDate><description><![CDATA[1. 公司禁用了 python
我的主业是桌面开发，偶尔也需要搞搞数据和算法。最近在用 python 处理一些工作，正搞得热火朝天，突然 python 就不能用了，一查记录原来是 IT 管理员禁止我使用 python。

不清楚为啥 IT 管理员会盯上 python，总之先提交了解封的需求。在等 IT 给我解封的期间我不想中断自己的工作，只好自己想办法运行 python。我知道有很多在线运行 python 的环境，而且微软自己也有 Codespaces 和 Remote Development Extens]]></description><category></category></item><item><title><![CDATA[[C#] 老古董的 Microsoft Chart Controls 也可以进行数据预测]]></title><link>https://blog.csdn.net/cjh623/article/details/114823732</link><guid>https://blog.csdn.net/cjh623/article/details/114823732</guid><author>cjh623</author><pubDate>Mon, 15 Mar 2021 11:18:22 +0800</pubDate><description><![CDATA[我要先声明，这篇文章介绍到的内容虽说不是不能用，但玩乐成分居多，大家看看就好，不要太认真。
1.  Microsoft Chart Controls 中的 FinancialFormula
在上一篇文章 使用 Math.Net 进行曲线拟合和数据预测 中，我介绍了如何使用 Math.Net ，这篇文章玩玩“新”花样，用古老的 Microsoft Chart Controls 实现相同的功能。

A long time ago in a galaxy far, far away… 微软推出了一套免费又强大的图]]></description><category></category></item><item><title><![CDATA[[C#] 使用 Excel 和 Math.Net 进行曲线拟合和数据预测]]></title><link>https://blog.csdn.net/cjh623/article/details/114823620</link><guid>https://blog.csdn.net/cjh623/article/details/114823620</guid><author>cjh623</author><pubDate>Mon, 15 Mar 2021 11:17:45 +0800</pubDate><description><![CDATA[以前在工作中遇到了一个数据错误的问题，顺便写下 用 Math.Net 解决的思路。
1. 错误的数据

上图是同一组探测器在同一天采集到的 19 次数据，总体来说重复性不错，但很明显最后 8 个探测器出了问题，导致采集到的数据在最后八个点一片混乱。即使把其中看起来最好的一组数据拿出来使用多项式拟合，也可以看出最后几个点没有落在拟合曲线上（只拟合最后 14 个点）：

虽然我知道这是硬件问题，但是遇到事情不能坐以待毙，软件方面也许可以做些什么。既然我从上图中得知出了最后几个点之外，其它数据都在拟合曲线上，那我]]></description><category></category></item><item><title><![CDATA[[WPF] 让第一个数据验证出错（Validation.HasError）的控件自动获得焦点]]></title><link>https://blog.csdn.net/cjh623/article/details/114823578</link><guid>https://blog.csdn.net/cjh623/article/details/114823578</guid><author>cjh623</author><pubDate>Mon, 15 Mar 2021 11:15:59 +0800</pubDate><description><![CDATA[1. 需求
在上一篇文章 《在 ViewModel 中让数据验证出错（Validation.HasError）的控件获得焦点》中介绍了如何让 Validation.HasError 的控件自动获得焦点，之后引申了另一个问题：如果有多个 HasError 的控件，如何只让第一个自动获得焦点。
这需求比较常见，所以我试着解决这个问题，最终完成了一个 Demo，XAML 如下：
&lt;StackPanel local:ValidationService.IsValidationScope="True"&gt;
]]></description><category></category></item><item><title><![CDATA[[WPF] 在 ViewModel 中让数据验证出错（Validation.HasError）的控件获得焦点]]></title><link>https://blog.csdn.net/cjh623/article/details/114823537</link><guid>https://blog.csdn.net/cjh623/article/details/114823537</guid><author>cjh623</author><pubDate>Mon, 15 Mar 2021 11:15:09 +0800</pubDate><description><![CDATA[1. 需求
在 MVVM 中 ViewModel 和 View 之间的交互通常都是靠 Icommand 和 INotifyPropertyChanged，不过有时候还会需要从 MVVM 中控制 View 中的某个元素，让它获得焦点，例如这样：

上面的 gif 是我在另一篇文章 《自定义一个“传统”的 Validation.ErrorTemplate》 中的一个示例，在这个示例中我修改了 Validation.ErrorTemplate，这样在数据验证出错后，相关的控件会显示一个红色的框，获得焦点后用 Po]]></description><category></category></item></channel></rss>