在.NET Core(预览版)上尝试WPF


介绍

本文是C#Advent Calendar 2018的第08天

最后,您可以在.NET Core上开发桌面。
在本文中,我们将尝试在.NET Core上运行WPF。
我们还将尝试使用最新的C#8.0功能和.NET Framework库。

使用的版本是预览版本。
此外,.NET Core在Linux或Mac上也不起作用。

如何安装

下载并安装VisualStudio 2019预览版。
顺便说一句,Visual Studio 2019与其他2017年完全不同,因此您可以一起安装和使用它。

  • .NET桌面开发
  • .NET Core跨平台开发

选中

进行安装。

还要下载并安装.NET Core 3.0 Preview。

你好,世界

您尚不能从Visual Studio创建新的.NET Core WPF,因此请从命令中创建它。
首先,创建一个具有任意项目名称的文件夹,然后在其中执行以下命令。

1
dotnet new wpf

然后从Visual Studio 2019打开生成的.csproj文件。
Xaml预览和属性窗口不起作用。

無題5.png

如果照原样执行,...

無題.png

安全显示。
UI调试器(例如,Live Properties Explorer)不起作用,但是普通调试器可以工作,因此您可以在断点处停止。

关闭Visual Studio一次。
关闭时,将出现一个对话框,询问您是否要创建.sln文件,因此请创建它。

使用.NET Core API

重新打开解决方案。
尝试使用C#8语法。
首先,默认更改构建设置。
项目属性>构建>高级>语言版本
到C#8.0。

無題.png

这次我将使用Range。
稍微更改MainWindow。

MainWindow.xaml

1
2
3
4
5
6
7
8
9
<Window x:Class="WpfNetCoreVSPre.MainWindow"
...
        Title="MainWindow" Height="450" Width="800">
   <StackPanel>
      <TextBlock Text="" x:Name="tbSelected" FontSize="72"/>
      <Button Content="Select Center"  Click="ButtonSelectCenter_Click"/>
      <Button Content="Select Last"  Click="ButtonSelectLast_Click"/>
   </StackPanel>
</Window>

MainWindow.xaml.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public partial class MainWindow : Window
{
    private int[] source = new int[] { 0, 10, 20, 30, 40, 50 };

    public MainWindow()
    {
        InitializeComponent();
    }

    private void ButtonSelectCenter_Click(object sender, RoutedEventArgs e)
    {
        tbSelected.Text = String.Join(' ', source[2..5]);
    }

    private void ButtonSelectLast_Click(object sender, RoutedEventArgs e)
    {
        tbSelected.Text = $"{source[^1]}";
    }
}

source[2..5]source[^1]后面的MainWindow代码是Range函数。
当按下按钮时,此功能可从原始数组的末尾获取第二至第四和第一。

执行结果。

無題3.png

使用.NET Framework库

接下来,我们使用一个与.NET Core官方不兼容的.NET Framework库。
这次MaterialDesignInXamlToolkit
使用。

使用Nuget将以下两个添加到您的项目中。

  • 材质设计颜色
  • 材质设计主题

由于它仅支持

.NET Framework,因此将发出警告,但我暂时将其忽略。
与MaterialDesignInXamlToolkit教程一起进行一些更改。

将ResourceDictionary添加到App.xaml。
我选择了深色主题:BlueGrey口音:青色。

应用程式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<Application x:Class="WpfNetCoreVSPre.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfNetCoreVSPre"
             StartupUri="MainWindow.xaml">
   <Application.Resources>
      <ResourceDictionary>
         <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Dark.xaml" />
            <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />
            <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.Bluegrey.xaml" />
            <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.Cyan.xaml" />
         </ResourceDictionary.MergedDictionaries>
      </ResourceDictionary>
   </Application.Resources>
</Application>

接下来,稍微更改"视图"。隐藏代码不会更改。
我用卡片包围了TextBlock,更改了下面按钮的样式,并将Content更改为PackIcon。

MainWindow.xaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<Window x:Class="WpfNetCoreVSPre.MainWindow"
        ...
        xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
        TextElement.Foreground="{DynamicResource MaterialDesignBody}"
        Background="{DynamicResource MaterialDesignPaper}"
        Title="MainWindow" Height="450" Width="800">
   <StackPanel>
      <materialDesign:Card Margin="5">
         <TextBlock Text="" x:Name="tbSelected" FontSize="72" Margin="5"/>
      </materialDesign:Card>
      <Button Content="Select Center"  Click="ButtonSelectCenter_Click" Margin="5"/>
      <Button Click="ButtonSelectLast_Click" Style="{StaticResource MaterialDesignFloatingActionMiniAccentButton}" Margin="5">
         <materialDesign:PackIcon Kind="PageLast"/>
      </Button>
   </StackPanel>
</Window>

执行结果。它工作正常。

無題4.png

到目前为止,除了警告消息外,它与.NET Framework没有任何区别。

概要

因此,我能够使用Visual Studio 2019和.NET Core 3.0同时使用最新的C#8.0语法和.NET Framework库。
从WinForm到UWP,Windows桌面开发有多种选择,但是.NET Core上的WPF似乎值得考虑作为新选择。

整个源代码位于以下位置。
https://github.com/soi013/WpfNetCoreVSPre

环境

Visual Studio 2019 16.0.0预览版1.0
.NET Core 3.0(测试版)
MaterialDesignThemes 2.5.0.1205

参考

将Windows桌面应用更新为.NET Core 3.0.100-preview-009754 –应用咨询团队

使用.NET Core 3.0进行桌面开发-Kazuki的博客@ hatena

宣布.NET Core 3预览版1和开放源代码Windows桌面框架| .NET博客

C#8.0范围| C; //身份不明的航班C博客