WPF最佳实践2021

目录

最佳实践

迁移到.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应用程序。此更新提供了增强的性能和效率优势。

拥抱AsyncAwait

AsyncAwait位于Task Parallel Library中,可与WPF很好地配合使用。如果您不喜欢较旧的函数,例如RunContinueWithInvoke,您可能更喜欢AsyncAwait函数。它们使生活变得更简单,因为它们更易于理解。

当您等待任务时,在当前作业完成之前,以下代码行不会执行。使用WPF,甚至可以为WPF事件(如按钮单击)提供异步方法处理程序。

让我们了解如何轻松使用AsyncAwait来替换旧功能。下面的代码是挂起线程直到任务完成的旧方法:

private void buttonClick(object s, RoutedEventArgs e)  
{  
    button.IsEnabled = false;  
    button.Text = "Starting task";  

    var task = Task.Run(() =>  
    {  
        Thread.Sleep(1000<a name="_Int_Pskp4/89">); /</a>/ 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";  
        });  
    });  
}

现在,比较以下代码,其中AsyncAwait用于简化代码并使其更具可读性:

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

使用awaitasync时,需要注意不要阻塞UI线程。您可以通过在不同的线程中处理UIMethod来安全地做到这一点,而不是保持在同一个线程中。

下面的示例代码演示了这一点。

简单的AsyncAwait函数

private async void Button_Click_3(object s, RoutedEventArgs e)  
{  
    var returnValue = await Task.Run(()=>
    functionToBeAwaited(this, intParam1, intParam2, intParam3));  
}

Async函数

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");  
}

调用函数来更新GUI

void UpdateWindow(string text)  
{  
    Dispatcher.Invoke(() =>  
    {  
        txt.Text += text;  
    });  
}

利用更智能的Intellisense

最新版本的Visual Studio带有WPF的重大改进。通过利用这些改进,我们可以更快、更明智地编写代码。

一个显着的改进是在输入项目的初始字符后建议最有价值的项目。例如,如果我们键入“Grid”Intellisense会将ColumnDefinitionsRowDefinitions放在建议列表的顶部。

然后,如果我们键入“ColumnDefinitions”“RowDefinitions”并添加一个空格,Intellisense会告诉我们是否必须使用WidthHeight。这些小细节可以帮助我们更快地编写代码。

设计时绑定

设计时绑定是.NET 5中引入的另一个功能。设计时绑定允许您将示例数据绑定到我们的表单控件,从而在创建应用程序时给您一种布局感。您无需运行应用程序——只需输入数据并更改TextInput的宽度。

另外,请记住您正在构建一个大型表单并且您将进行更改。如果您必须一直输入数据,您的工作将是乏味且耗时的。使用设计时绑定,您可以避免这种重复的工作。

上图有两个文本框,其中包含姓名TimCorey。在设计时绑定的帮助下,我们可以通过使用d:type声明值来绑定模板值以控制设计时绑定。

例如,我们可以看到Corey并不完全适合文本框。使用设计时绑定,我们可以简单地增加宽度变量的值。此外,设计时绑定不仅限于文本。

我们可以使用复选框、单选按钮、图像和许多其他东西。请参阅Microsoft官方 文档 以了解更多信息。

热重载和实时可视化树

Hot Reload是一项广为人知的功能,大多数语言都支持该功能。它会根据您更改的代码更新布局或功能,而无需重新启动整个应用程序。因此,一旦您保存代码,您的更改就会发生。您可以在WPF中启用此功能,方法是导航到 Tools,然后 Debugging,然后选择 Hot Reload

您可以启用的另一个功能是在 WPFUWP 选项集中。通过选择 在调试时预览 Live Visual Tree中的选定元素,您可以更轻松地在XAML元素之间导航,从而加快调试过程。此外,它还使您能够在UI屏幕上选择元素,例如Web开发检查器。

不要重新发明轮子

到目前为止,不重新发明某些东西是您可以实现的最佳开发人员实践之一。如果您正在做一些巨大的事情,并且您需要一个WPF不包含开箱即用解决方案的组件,那么从头开始构建它是一个坏主意。

这有两个原因:首先,您为什么要创建已经由其他人构建和维护的东西?在这上面投入时间是没有成效的——而且肯定是不愉快的。

其次,您可以通过利用许多 已经制作的开源WPF组件来利用在其他地方节省的时间。

开源组件通常制作精良,由开源社区维护。这意味着这些组件可能已经遵循与WPFXAML相关的最佳实践。因此,即使您没有找到所需的确切内容,也可以提取类似的开源组件并进行编辑以满足您的需求。

但是,如果您使用WPF构建专业的业务应用程序并需要经过微调的商业组件工具包,GrapeCity ComponentOne包含100多个支持.NET 5/6以及.NET Framework的专业级高级WPF组件。

即使您当前的应用程序使用的是旧的.NET FrameworkGrapeCity仍然可以满足您的需求。此外,开发专业人员构建了这些组件,因此他们在模型-视图-视图模型(MVVM)模式中提供了行业领先的最佳实践。

托管组件工具包的另一个令人信服的论点是它节省了开发时间——不仅仅是一个项目,而是多个项目。最后,定期实现新组件和增强现有组件具有显着优势。

结论

如您所见,桌面开发并未消亡。本文首先强调了使用.NET 5/5+的重要性,并讨论了在Arm设备上的Windows上本机运行的WPF应用程序如何帮助您编写一次并随处部署。

在整篇文章中,您看到AsyncAwait函数简化了复杂情况下的代码,并且您还可以将它们用于Async函数内的多个等待调用。

本文继续讨论如何利用.NET 5 XAML IntelliSense更快地编写代码,并展示了设计时绑定如何让您了解接口。然后,您了解了Hot-ReloadLive Visual Tree —最显着的提高生产力和易于开发的功能。

最后,也是最重要的,你了解到你不需要重新发明轮子。借助几个开源组件和 GrapeCity ComponentOne 等专业工具包,您将找到所需的一切,并通过应用最佳实践所提供的功能为您节省宝贵的开发时间。

https://www.codeproject.com/Articles/5320318/WPF-Best-Practices-2021

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值