更新:WPF 是否跨平台?
3. 问:Is there a roadmap to "upgrade" WPF to .Net Core 5?
答:There are currently no plans to port either WinForms or WPF to .NET Core.
和第一个问题一样,微软没打算把 WinForms 和 WPF 的代码添加到 .NET Core 中
https://www.cnblogs.com/xishuai/p/mono-dotnetcore.html
.NET Core 的早期版本主要专注于基于 Web 的应用程序(ASP.NET Core)
作为一个操作系统,客户端软件是很重要的, win 客户端软件的受重视度是很高的
所以 WPF 和 WinForms 这种客户端技术在 MS 主推的 .NET 5 上的支持是不用担心
客户端程序员也不用担心饭碗
对 WPF app 再怎么提升支持也仅仅是在 win 平台的努力
https://www.infoq.cn/article/sghvadglovu0reo4xvkx
也就是说 服务器端程序员 反而不能默认自己(在跨平台SDK的助力下)可以将轻易跨行到 客户端程序员
也就是说, WPF 是否收到优先支持 和 WPF 是否跨平台是两回事
WPF (以及 WinForms) 可以受到极高优先等级的优先支持, 且死也不跨平台
MS 以此是接受 WPF 用户的奖励的,它完成了工作量很大的作业
只能嘬糖等待的肯定不是 win WPF 用户群而是 linux WPF 用户群, 然后留给后者的选项有 要么傻等 要么用 build with cross-platform in mind 的桌面开发 SDK 比如 Avalonia 或 Xamarin Forms
https://dotnet.libhunt.com/compare-avalonia-vs-xamarin-forms
- WPF 是 MS 深耕已久的桌面技术,这样的一个桌面技术,MS 投入了超过 1000人的开发团队,这是桌面技术SDK研发的一个工作量估计。参考 link 1 2 3
- 关于 .NET Core (以及未来的 .NET 5),它的跨平台,是一个 ASP .NET 概念上的跨平台。在这个概念里,如果未包含了 GUI 跨平台,那么它的实现里,也不会包括跨平台的 GUI SDK
- 目前 .NET Core 的官方概念里,未包含 GUI 跨平台的概念;只有当它的官方概念里 包括了 GUI 跨平台 (把 GUI 跨平台当作一个目标),才值得期待一个来自 MS 的跨平台 GUI SDK 的可能性
- 基于官方概念的存在,在将来,一个来自 MS 的跨平台 GUI SDK 技术会 对标 Java Swing, JavaFX 。这只有在官方概念里已包含 GUI 跨平台的概念的情况下,才后发生
- 目前 MS 官方概念里的 “.NET 跨平台”,未包含 “GUI SDK 跨平台” 的概念,也没有它的实现
- 任何第三方开源社区贡献的 GUI SDK 玩具,尚不及 Xamarin 团队多年深耕,更不要说比得上 1000多人的 WPF 团队了 ( 也即,它根本不值得你的时间,包括呼声最高的 Avalonia,它不值得你的时间 )
- Before working with something you must know what that thing is. 1
之前的话
背景:
GUI 设计可能会遇到的两个阶段:
- 界面复杂度,按照对于 既有控件的依赖度,分为 简单项目、复杂项目。简单项目 不涉及 custom control, 只用自带的控件就可以满足项目要求;复杂项目,需要自己做 custom control
- 在 做简单项目(不涉及 custom control, 只用自带的控件,例子 1) 的时候,RAD tool 里 有很多 既有控件,可以直接快速拖出界面,快速快在这里
- 在 custom control 的时候 (做复杂项目)(例子 1 2),一定会用到代码,这时候 最后有大量的教程参考 反而能提高开发速度,快速快在这里
评估 GTK#
- 缺点:在纯代码堆图 (在第二阶段,设计自定义模块(代码画图, custom control )) 的时候,教程太少了 (远不及 System.Windows.Forms 的 自定义模块 / custom control 的 教程 多)(甚至不及 WPF (XAML based WPF 是什么 1 2 ) )
- 优点:Glade 作为 RAD tool ,在第一阶段,对 既有控件 可以有快速拖拉出效果的感觉
对 使用 GTK# 的警告 ⚠️
如果你需要做复杂界面 / 复杂项目 (参考上面的例子),那么 在没有大量教程参考的情况下,你只能对照 GTK C++ 教程 自己去琢磨对应的 GTK# C# 的实现。
你会哭死。
下一集聊一聊 C# + GTK 开发的另一种方式: Xamarin.Forms.Platform.GTK
这里 Xamarin Forms 是一个 Renderer
https://github.com/jsuarezruiz/xamarin-forms-gtk-samples
https://github.com/jsuarezruiz/forms-gtk-progress
https://docs.microsoft.com/en-us/xamarin/xamarin-forms/platform/other/gtk
https://www.nuget.org/packages/Xamarin.Forms.Platform.GTK
对比,看看你喜欢哪个风味 的 API :
GTK# 那一套玩意 ->
http://zetcode.com/gui/gtksharp
主要 GUI 组件包 是 GTK# (一次开发 多处运行)
Xamarin Forms 那一套玩意 ->
https://github.com/jsuarezruiz/xamarin-forms-gtk-samples
主要 GUI 组件包 是 Xamarin Forms
涉及到 GTK 的部分仅仅是 “适配” 到 GTK (一次开发 多次适配 多处运行)
正文
配置步骤:
- 安装 dotnet core
https://dotnet.microsoft.com/... - 安装 GTK
brew install gtk+3
- 安装 GTK# 的 template
dotnet new --install GtkSharp.Template.CSharp
- 安装 Glade (RAD工具,快速拖拉控件) 1
brew install glade
- 新建项目
dotnet new gtkapp -o MyApp1
cd MyApp1
dotnet run
参考:
https://github.com/GtkSharp/G...
dotnet core 可安装的模板 1
dotnet core 自定义安装模板 2 2
<TargetFramework>netcoreapp2.1</TargetFramework> 是什么 1
GTK+3 1
Glade for GTK+3 1
命令:
查看所有已安装的 templatesdotnet new --list
依据某个 template 建立项目,比如 console templatedotnet new console -o myApp
GTK#
GtkSharpTutorials 1
更好的办法:
Xamarin Forms 作为 GTK# 的 wrapper,这样就不用学习 GTK 那一套玩意了
参考 https://www.reddit.com/r/dotn...
-=-=-
另一个理由,为什么不用 GTK# ,而用 Xamarin.Forms.Platform.GTK :
同样是 标记语言布局技术, xaml 的可读性 比 glade 好多啦
// 选自 `dotnet new console -o myApp` 生成的 MainWindow.glade
// 这是 GUI 组件 主要生效自的地方
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="3.18"/>
<object class="GtkWindow" id="MainWindow">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Example Window</property>
<property name="default_width">480</property>
<property name="default_height">240</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">4</property>
<property name="margin_right">4</property>
<property name="margin_top">4</property>
<property name="margin_bottom">4</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="_label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Hello World!</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="_button1">
<property name="label" translatable="yes">Click me!</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
// Xamarin.Forms.Platform.GTK 里,由 Xamarin Forms 负责 GUI 组件包
// 这是 GUI 组件 主要生效自的地方
// https://github.com/jsuarezruiz/xamarin-forms-gtk-samples/blob/master/BoxView/TextDecoration/TextDecoration/TextDecoration/MainPage.xaml
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:TextDecoration"
x:Class="TextDecoration.MainPage">
<ContentPage.Padding>
<OnPlatform x:TypeArguments="Thickness">
<On Platform="iOS" Value="0, 20, 0, 0" />
</OnPlatform>
</ContentPage.Padding>
<ContentPage.Resources>
<ResourceDictionary>
<Style TargetType="BoxView">
<Setter Property="Color" Value="Black" />
</Style>
</ResourceDictionary>
</ContentPage.Resources>
<ScrollView Margin="15">
<StackLayout>
<AbsoluteLayout>
<BoxView AbsoluteLayout.LayoutBounds="0, 10, 200, 5" />
<BoxView AbsoluteLayout.LayoutBounds="0, 20, 200, 5" />
<BoxView AbsoluteLayout.LayoutBounds="10, 0, 5, 65" />
<BoxView AbsoluteLayout.LayoutBounds="20, 0, 5, 65" />
<Label Text="Stylish Header"
FontSize="24"
AbsoluteLayout.LayoutBounds="30, 25, AutoSize, AutoSize"/>
</AbsoluteLayout>
<Label>
<Label.FormattedText>
<FormattedString>
<Span Text="The " />
<Span Text="Label"
FontAttributes="Italic" />
<Span Text=" and four " />
<Span Text="BoxView"
FontAttributes="Italic" />
<Span Text=" elements shown above are children of an " />
<Span Text="AbsoluteLayout"
FontAttributes="Italic" />
<Span Text=". This allows the text and its decorations to be precisely sized and positioned." />
</FormattedString>
</Label.FormattedText>
</Label>
<StackLayout HorizontalOptions="Center">
<Label Text="Underlined Text"
FontSize="24" />
<BoxView HeightRequest="2" />
</StackLayout>
<Label>
<Label.FormattedText>
<FormattedString>
<Span Text="The underlined " />
<Span Text="Label"
FontAttributes="Italic" />
<Span Text=" above shares a " />
<Span Text="StackLayout"
FontAttributes="Italic" />
<Span Text=" with a " />
<Span Text="BoxView"
FontAttributes="Italic" />
<Span Text=", whose width is governed by the " />
<Span Text="Label"
FontAttributes="Italic" />
<Span Text=". Unfortunately, you can't use this technique to underline a single word in a paragraph." />
</FormattedString>
</Label.FormattedText>
</Label>
<BoxView HeightRequest="3" />
<Label>
<Label.FormattedText>
<FormattedString>
<Span Text="You can also use a " />
<Span Text="BoxView"
FontAttributes="Italic" />
<Span Text=" for a horizontal line. Specify a height but let the width fill the horizontal dimensions of the container." />
</FormattedString>
</Label.FormattedText>
</Label>
<StackLayout Orientation="Horizontal">
<BoxView WidthRequest="4"
Margin="0, 0, 10, 0" />
<Label>
<Label.FormattedText>
<FormattedString>
<Span Text="Similarly, you can use a " />
<Span Text="BoxView"
FontAttributes="Italic" />
<Span Text=" to mark off a paragraph of text, for example, to indicate a quotation. In this case, the " />
<Span Text="Label"
FontAttributes="Italic" />
<Span Text=" and " />
<Span Text="BoxView"
FontAttributes="Italic" />
<Span Text=" also share a " />
<Span Text="StackLayout"
FontAttributes="Italic" />
<Span Text=", but with a horizontal orientation." />
</FormattedString>
</Label.FormattedText>
</Label>
</StackLayout>
<Label>
<Label.FormattedText>
<FormattedString>
<Span Text="What can you use " />
<Span Text="BoxView"
FontAttributes="Italic" />
<Span Text=" for?" />
</FormattedString>
</Label.FormattedText>
</Label>
</StackLayout>
</ScrollView>
</ContentPage>
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。