如果你正在使用WPF开发桌面应用程序,可能会遇到一个共同的痛点:默认的WPF控件看起来太"古老"了。微软的Fluent Design System已经发展了很多年,但原生的WPF控件却迟迟没有跟上现代设计趋势。这就是WPF UI这个开源控件库诞生的背景。
WPF UI目前在GitHub上获得了超过6.7k的star,采用宽松的MIT许可证,这意味着你可以在商业项目中自由使用它。我最近在一个客户管理系统的项目中使用这个库,仅用两天时间就让原本老旧的界面焕然一新,客户看到效果后非常满意。
这个库最大的价值在于,它让WPF应用能够轻松获得与Windows 11风格一致的现代化界面,包括流畅的动画效果、现代化的控件样式、深色/浅色主题切换等特性。而且它完全兼容现有的WPF项目,不需要你重写整个应用架构。
要在项目中使用WPF UI,首先需要通过NuGet安装它。打开Visual Studio的包管理器控制台,运行以下命令:
powershell复制Install-Package WPF-UI
安装完成后,我们需要在App.xaml中配置资源字典。这是让WPF UI控件正常显示的关键步骤:
xml复制<Application ... xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ui:ThemesDictionary Theme="Dark" />
<ui:ControlsDictionary />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
注意Theme属性可以设置为"Light"或"Dark",这决定了应用的初始主题。我在实际项目中发现,最好在应用设置中保存用户选择的主题偏好,这样下次启动时可以保持一致。
让我们从一个简单的按钮开始。在MainWindow.xaml中添加命名空间引用后,可以这样使用WPF UI的按钮控件:
xml复制<Window ... xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml">
<Grid>
<ui:Button
Content="点击我"
Icon="{ui:SymbolIcon Fluent24}"
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Grid>
</Window>
这个简单的代码就会生成一个带有图标的现代化按钮。WPF UI提供了数百个Fluent风格的图标,你只需要将"Fluent24"替换为其他图标名称即可更换图标。
WPF UI几乎重新设计了所有常见的WPF控件,包括但不限于:
我特别喜欢它的Snackbar控件,可以轻松实现现代化的消息提示:
xml复制<ui:Snackbar x:Name="MainSnackbar" />
然后在代码中这样使用:
csharp复制MainSnackbar.Show("操作成功", "您的设置已保存", SymbolRegular.Checkmark24);
WPF UI内置了完善的深色/浅色主题支持。切换主题非常简单:
csharp复制Wpf.Ui.Appearance.Theme.Apply(
Wpf.Ui.Appearance.ThemeType.Dark, // 或ThemeType.Light
Wpf.Ui.Appearance.BackgroundType.Mica, // 背景效果
true); // 是否立即应用
在实际项目中,我通常会创建一个设置页面,让用户选择喜欢的主题。WPF UI会自动处理所有控件的样式切换,开发者几乎不需要额外工作。
WPF UI完美支持MVVM模式。以它的NavigationView控件为例,可以这样与ViewModel绑定:
xml复制<ui:NavigationView
x:Name="RootNavigation"
PaneDisplayMode="LeftCompact"
IsBackEnabled="{Binding ViewModel.IsBackEnabled, Mode=OneWay}"
IsPaneOpen="{Binding ViewModel.IsPaneOpen, Mode=TwoWay}"
SelectedItem="{Binding ViewModel.SelectedItem, Mode=TwoWay}"
MenuItems="{Binding ViewModel.MenuItems}"
FooterMenuItems="{Binding ViewModel.FooterMenuItems}">
<Frame x:Name="RootFrame" />
</ui:NavigationView>
在ViewModel中,你需要定义相应的属性和命令。这种模式让界面逻辑与业务逻辑清晰分离,便于维护和测试。
虽然WPF UI很强大,但在复杂界面中可能会遇到性能问题。以下是我总结的几个优化技巧:
例如,优化后的ListView应该这样写:
xml复制<ui:ListView
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling"
ScrollViewer.IsDeferredScrollingEnabled="True">
<!-- 列表项模板 -->
</ui:ListView>
即使是最好的库也会遇到问题。我在使用WPF UI过程中积累了一些调试经验:
当控件显示不正常时,首先检查:
对于复杂的样式问题,可以使用WPF Inspector或Snoop这类工具实时检查可视化树和属性值。WPF UI的GitHub仓库issue区也是一个宝贵的资源,很多常见问题都有解决方案。
一个典型的例子是图标不显示的问题。我遇到过几次,发现通常是因为图标名称拼写错误或图标资源未正确加载。这时候可以检查调试输出窗口,通常会有相关错误信息。
WPF UI提供了几个高质量的Demo项目,这是学习的最佳资源:
我建议先运行Wpf.Ui.Gallery,这是一个功能齐全的控件浏览器,你可以:
微软商店还提供了独立的WPF UI Gallery应用,安装后可以随时参考,不需要启动Visual Studio。
虽然WPF UI提供了丰富的默认样式,但你可能需要根据品牌风格进行自定义。好消息是,它完全支持样式重写。
例如,要自定义按钮样式,可以在App.xaml中这样定义:
xml复制<Style TargetType="ui:Button" BasedOn="{StaticResource {x:Type ui:Button}}">
<Setter Property="Background" Value="#FF0066" />
<Setter Property="Foreground" Value="White" />
<Setter Property="CornerRadius" Value="8" />
</Style>
对于更复杂的自定义,可以直接修改控件模板。WPF UI的源代码结构清晰,很容易找到默认模板作为起点。
我在一个医疗项目中就深度定制了所有控件样式,使其符合医疗行业的严肃风格,同时保留了WPF UI的现代化特性。整个过程比从零开始设计要高效得多。