目录
最佳实践
迁移到.NET 5+
拥抱Async和Await
简单的Async和Await函数
Async函数
调用函数来更新GUI
利用更智能的Intellisense
设计时绑定
热重载和实时可视化树
不要重新发明轮子
结论
从医疗保健到会计再到教育,现在几乎每个组织都有自己的网站。我们学习、工作和分享的方式如此深入地沉浸在网站中,以至于您可能认为Web开发已经完全超越了桌面开发。
但是,即使网站变得如此流行,开发人员每年仍会创建数千个桌面应用程序。这表明桌面开发行业仍然生机勃勃。许多专业组织、跨国公司,甚至是普通用户,仍然依靠桌面软件来完成工作。
开发人员通常使用Windows窗体(WinForms)创建Windows应用程序。但是,当您构建复杂的现代应用程序时,WinForms会受到限制。Windows Presentation Foundation(WPF)旨在克服这些障碍并提供附加功能。
因此,出现了WPF控件,为网站开发人员提供高级特性和功能。GrapeCity的ComponentOne WPF版本也不例外,它为开发人员提供了100多个基本的WPF控件来创建令人惊叹的桌面应用程序。
WPF在桌面开发行业拥有超过15年的经验,取得了进步和进步——他们的最佳实践也是如此。为了帮助您跟上WPF的步伐并进一步了解它的现状,本文将探讨一些适用于WPF开发人员的最佳实践,它们将在现在、2021年及以后为您提供帮助。
最佳实践本节讨论了几个关键的最佳实践,像您这样的桌面开发人员在使用WPF时可以实现。
迁移到.NET 5+Microsoft .NET 5+是前进的官方方式,因为Microsoft .NET仅支持.NET 5+。它提供灵活的部署、强大的性能和构建桌面应用程序的现代方式。.NET 5+提供的性能几乎是旧的.NET框架的两倍。
此外,随着.NET 6的引入,可以利用C# 10编写更高效、更简洁的代码。基于.NET 5+构建的WPF应用程序也可以在Arm设备上的Windows上本机运行。这部分地使您在开发WPF应用程序时只需编写一次并随处部署。
如果您的应用程序当前不在.NET 5上,则可以使用 升级助手轻松升级WPF应用程序。此更新提供了增强的性能和效率优势。
拥抱Async和AwaitAsync和Await位于Task Parallel Library中,可与WPF很好地配合使用。如果您不喜欢较旧的函数,例如Run、ContinueWith或Invoke,您可能更喜欢Async和Await函数。它们使生活变得更简单,因为它们更易于理解。
当您等待任务时,在当前作业完成之前,以下代码行不会执行。使用WPF,甚至可以为WPF事件(如按钮单击)提供异步方法处理程序。
让我们了解如何轻松使用Async和Await来替换旧功能。下面的代码是挂起线程直到任务完成的旧方法:
private void buttonClick(object s, RoutedEventArgs e)
{
button.IsEnabled = false;
button.Text = "Starting task";
var task = Task.Run(() =>
{
Thread.Sleep(1000); // making task sleep for 1 Second
});
task.ContinueWith((t) => // executed after 1 Second of sleep
{
Dispatcher.Invoke(() => // Dispatcher consist queued items
{
button.IsEnabled = true;
button.Text = "Completed task";
});
});
}
现在,比较以下代码,其中Async和Await用于简化代码并使其更具可读性:
private async void buttonClick(object s, RoutedEventArgs e)
{
button.IsEnabled = false;
button.Text = "Starting task";
var result = await Task.Run(() => // awaiting the task
{
Thread.Sleep(1000); e
return "Completed long task";
});
button.IsEnabled = true;
button.Text = result;
}
如您所见,第一步要求您将async关键字放在函数中的访问修饰符之后。如果你不使用async,它会抛出一个错误,因为async函数是唯一可以调用await的函数。
然后,您等待要执行的任务。一旦等待的作业完成,在等待之后输入的代码就会自动执行。
另一个方便的功能是能够等待多个任务,然后执行以下语句。您可以通过使用WhenAll来完成。
...Functions
var results = await Task.WhenAll(buttonClick, eventClick);
...Next Statements
使用await和async时,需要注意不要阻塞UI线程。您可以通过在不同的线程中处理UI和Method来安全地做到这一点,而不是保持在同一个线程中。
下面的示例代码演示了这一点。
简单的Async和Await函数private async void Button_Click_3(object s, RoutedEventArgs e)
{
var returnValue = await Task.Run(()=>
functionToBeAwaited(this, intParam1, intParam2, intParam3));
}
internal void functionToBeAwaited (MainWindow gui, int param1, int param2, int param3)
{
gui.UpdateWindow("Work Started");
while (true)
{
gui.UpdateWindow(".");
System.Threading.Thread.Sleep(50);
}
gui.UpdateWindow("Done and Done");
}
void UpdateWindow(string text)
{
Dispatcher.Invoke(() =>
{
txt.Text += text;
});
}
最新版本的Visual Studio带有WPF的重大改进。通过利用这些改进,我们可以更快、更明智地编写代码。
一个显着的改进是在输入项目的初始字符后建议最有价值的项目。例如,如果我们键入“Grid”,Intellisense会将ColumnDefinitions和RowDefinitions放在建议列表的顶部。
然后,如果我们键入“ColumnDefinitions”或“RowDefinitions”并添加一个空格,Intellisense会告诉我们是否必须使用Width或Height。这些小细节可以帮助我们更快地编写代码。
设计时绑定设计时绑定是.NET 5中引入的另一个功能。设计时绑定允许您将示例数据绑定到我们的表单控件,从而在创建应用程序时给您一种布局感。您无需运行应用程序——只需输入数据并更改TextInput的宽度。
另外,请记住您正在构建一个大型表单并且您将进行更改。如果您必须一直输入数据,您的工作将是乏味且耗时的。使用设计时绑定,您可以避免这种重复的工作。
上图有两个文本框,其中包含姓名Tim和Corey。在设计时绑定的帮助下,我们可以通过使用d:type声明值来绑定模板值以控制设计时绑定。
例如,我们可以看到Corey并不完全适合文本框。使用设计时绑定,我们可以简单地增加宽度变量的值。此外,设计时绑定不仅限于文本。
我们可以使用复选框、单选按钮、图像和许多其他东西。请参阅Microsoft官方 文档 以了解更多信息。
热重载和实时可视化树Hot Reload是一项广为人知的功能,大多数语言都支持该功能。它会根据您更改的代码更新布局或功能,而无需重新启动整个应用程序。因此,一旦您保存代码,您的更改就会发生。您可以在WPF中启用此功能,方法是导航到 Tools,然后 是Debugging,然后选择 Hot Reload。
您可以启用的另一个功能是在 WPF和UWP 选项集中。通过选择 在调试时预览 Live Visual Tree中的选定元素,您可以更轻松地在XAML元素之间导航,从而加快调试过程。此外,它还使您能够在UI屏幕上选择元素,例如Web开发检查器。
不要重新发明轮子到目前为止,不重新发明某些东西是您可以实现的最佳开发人员实践之一。如果您正在做一些巨大的事情,并且您需要一个WPF不包含开箱即用解决方案的组件,那么从头开始构建它是一个坏主意。
这有两个原因:首先,您为什么要创建已经由其他人构建和维护的东西?在这上面投入时间是没有成效的——而且肯定是不愉快的。
其次,您可以通过利用许多 已经制作的开源WPF组件来利用在其他地方节省的时间。
开源组件通常制作精良,由开源社区维护。这意味着这些组件可能已经遵循与WPF和XAML相关的最佳实践。因此,即使您没有找到所需的确切内容,也可以提取类似的开源组件并进行编辑以满足您的需求。
但是,如果您使用WPF构建专业的业务应用程序并需要经过微调的商业组件工具包,GrapeCity ComponentOne包含100多个支持.NET 5/6以及.NET Framework的专业级高级WPF组件。
即使您当前的应用程序使用的是旧的.NET Framework,GrapeCity仍然可以满足您的需求。此外,开发专业人员构建了这些组件,因此他们在模型-视图-视图模型(MVVM)模式中提供了行业领先的最佳实践。
托管组件工具包的另一个令人信服的论点是它节省了开发时间——不仅仅是一个项目,而是多个项目。最后,定期实现新组件和增强现有组件具有显着优势。
结论如您所见,桌面开发并未消亡。本文首先强调了使用.NET 5/5+的重要性,并讨论了在Arm设备上的Windows上本机运行的WPF应用程序如何帮助您编写一次并随处部署。
在整篇文章中,您看到Async和Await函数简化了复杂情况下的代码,并且您还可以将它们用于Async函数内的多个等待调用。
本文继续讨论如何利用.NET 5 XAML IntelliSense更快地编写代码,并展示了设计时绑定如何让您了解接口。然后,您了解了Hot-Reload和Live Visual Tree —最显着的提高生产力和易于开发的功能。
最后,也是最重要的,你了解到你不需要重新发明轮子。借助几个开源组件和 GrapeCity ComponentOne 等专业工具包,您将找到所需的一切,并通过应用最佳实践所提供的功能为您节省宝贵的开发时间。
https://www.codeproject.com/Articles/5320318/WPF-Best-Practices-2021