WinUI3踩坑记录

1.概述:

先来看看官方对WinUI3解释:

WinUI 3 是本机 UI 平台组件,随附 Windows 应用 SDK(与 Windows SDK 完全分离)。 Windows 应用 SDK 提供了一组统一的 API 和工具,可用于创建面向 Windows 10 及更高版本且可发布到 Microsoft Store 的生产桌面应用。

相信使用WinUI3的朋友,大多有WPF的开发经验。下面将WinUI3和WPF做一点简单对比,让大家了解两者之间的差别:

从应用的组成来看:WinUI3(后续用“它”替代)是包含一个Window和多个Page组成的,WPF通常是多窗口。
从代码结构来看:它仍然是采用XAML+C#的前后端模式,同样也支持MVVM绑定。
从界面美观来看:它的界面相较于WPF而言更加简洁、友好。

1.1 安装

WinUI3官方扩展,请前往官网下载扩展并安装,再次重启Visual Studio,创建项目就可以看见WinUI3的项目模板了。

2.主要内容:

  通过简单的对比可知,它和WPF非常相似,下面讲讲我在开发时遇到与WPF开发不太一致的“坑”。

2.1 Xaml预览

  大家创建WinUI3项目后,是否发现与WPF的最大差异:没有Xaml预览界面。这里需要启动调试模式,即可动态修改UI界面。

2.2 Frame

  Frame只能导航到Page页面,如果是窗口则会出现异常,无法导航。

ContentFrame.Navigate(pageType, null, new SlideNavigationTransitionInfo()
{ Effect = slideNavigationTransitionEffect }); // 这里ContentFrame是Frame的X:Name
2.3 ContentDialog

  WinUI3提供的消息框,与WPF不同的是该消息框提供了遮罩层并在屏幕中央显示。但在xaml或window使用时,需要传入XamlRoot,否则会抛出异常。这里的Root需要从具体的控件或者窗体获取,可以拿到主窗体的XamlRoot传入。

public static async Task<ContentDialogResult> ShowXamlAsync(XamlRoot root, string message, string title = "xxx")
{
    ContentDialog dialog = new()
    {
        Title = title,
        Content = message,
        PrimaryButtonText = "确定",
        CloseButtonText = "取消",
        XamlRoot = root
    };
    ContentDialogResult result = await dialog.ShowAsync();
    return result;
}

ps:同一时刻只能有一个ContentDialog消息框,WinUI3不支持同时有多消息框的。我认为这点就有点难受,大家可以自定义消息框。

2.4 跨线程调用UI控件

很多时候我们需要在子线程中更新UI线程的控件,WPF是通过Dispatcher.Invoke()或App.Current…Dispatcher.Invoke()调用的,WinUI3却不太相同。具体代码如下:

DispatcherQueue.TryEnqueue(()=>{
    Hide(); // 这里的Hide()是我隐藏ContentDialog的方法,大家可以任意替换UI操作
});

如果需要在ViewModel或其他非控件、窗体中跨线程调用UI控件,请使用你要更新的窗体的DispatcherQueue。例如:MainWindow.DispatcherQueue.TryEnqueue();

2.5 数据绑定

  在WPF中,通常是通过{Binding xxx}来实现绑定的。但在WinUI3中,保留了WPF的绑定方式外提供了{x:Bind yyy}的方式来绑定。示例代码如下:

<control:DataGrid ItemsSource="{x:Bind ParamList, Mode=OneWay}" ScrollViewer.VerticalScrollBarVisibility="Auto" />

这里我给DataGrid的ItemsSource绑定了一个集合,在WPF中如果我们不使用如下代码来绑定DataContext,你通过F12是跳转不过去的,没有产生映射。但WinUI3可以直接跳转,我认为这里相对于WPF的交互是有提升的(ps:具体的实现逻辑还没研究过)。

d:DataContext="{d:DesignInstance Type=local:ParamListPage}"

ps:当你的绑定需要从后台动态修改前端控件,需要设置Mode为OneWay,否则更新不生效,WPF默认单向绑定(后台修改影响前台,前台修改不会影响后台)。

补充一句:WinUI3没有DataGrid控件,需要手动添加CommunityToolkit.WinUI.UI.Controls.DataGrid的Nuget包.

<think>好的,我现在要帮用户解决关于JetBrains Rider对WinUI3的支持以及如何在Rider中使用WinUI3的问题。首先,我需要确认用户的需求。用户可能是在开发跨平台桌面应用,并且想使用WinUI3框架,同时偏好使用Rider作为IDE。需要了解Rider是否支持WinUI3项目,以及如何配置和开发。 接下来,我需要回忆相关的知识。WinUI3是微软推出的Windows UI库,用于构建现代Windows应用。而JetBrains Rider是一个跨平台的.NET IDE,支持多种框架。根据引用[1]和[2],微软已经将WinUI开源,这可能促进了第三方工具的支持。引用[1]提到Uno Platform支持WinUI3的方式,可能涉及到跨平台开发,但用户的问题集中在Rider和WinUI3的集成,而不是跨平台。 我需要检查Rider的官方文档或更新日志,看看是否有对WinUI3的支持。由于WinUI3相对较新,可能Rider的支持还在完善中。通常,Rider通过支持对应的项目类型(如.csproj文件)和SDK来提供功能。如果WinUI3项目基于.NET Core或.NET 5+,Rider应该能处理,但可能需要额外配置。 另外,用户可能需要安装特定的SDK或模板。比如,Visual Studio有WinUI3项目模板,但Rider可能需要手动配置项目文件或使用插件。需要确认在Rider中是否可以创建WinUI3项目,或者是否需要从VS创建后导入。 还可能涉及调试和设计界面的支持。WinUI3的设计器可能在Rider中不可用,但开发者可以手动编辑XAML。另外,构建和依赖项管理是否正常,NuGet包是否能正确安装。 需要分步骤解答:首先说明Rider对WinUI3的支持现状,然后详细步骤如何在Rider中配置和开发WinUI3应用,包括项目创建、依赖管理、调试等。可能还需要提到已知的限制或问题,比如设计器支持不足,建议结合Visual Studio使用。 最后,生成相关问题,帮助用户进一步探索,比如调试技巧、项目配置问题、与其他框架的整合等。</think>关于JetBrains Rider对WinUI3的支持,以下是关键信息整理: ### 1. **当前支持状态** - **基础编译支持**:Rider 2023.3及以上版本已支持WinUI3项目的基本编译和调试功能,但需要手动配置项目文件[^2] - **设计器限制**:目前仍缺少可视化XAML设计器,建议通过实时XAML预览插件或配合Visual Studio使用 - **项目创建**:需先通过Visual Studio生成WinUI3项目模板,再在Rider中打开(截止2024年Q2) ### 2. **配置步骤** ```xml <!-- 手动编辑.csproj文件确保包含 --> <PropertyGroup> <WindowsPackageType>None</WindowsPackageType> <TargetFramework>net8.0-windows10.0.19041.0</TargetFramework> <Platforms>x64;arm64</Platforms> </PropertyGroup> ``` 1. 安装.NET 8 SDK和Windows App SDK 1.5+ 2. 在Visual Studio中创建新项目 » 选择"Blank App, Packaged (WinUI 3 in Desktop)" 3. 用Rider打开解决方案文件 4. 通过NuGet安装Microsoft.Windows.SDK.BuildTools ### 3. **调试配置** ```text 调试配置需设置: - 启动类型:Executable - 目标路径:选择项目目录下\bin\x64\Debug\net8.0-windows10.0.19041.0\win10-x64\App.exe ``` ### 4. **已知问题处理** - **MSBuild报错**:在Rider设置中启用"Experimental MSBuild support" - **资源加载失败**:将XAML文件属性设置为"Page" - **热重载限制**:需安装Rider插件"Hot Reload for WinUI"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值