更新: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 (一次开发 多次适配 多处运行)

正文

配置步骤:

  1. 安装 dotnet core
    https://dotnet.microsoft.com/...
  2. 安装 GTK
    brew install gtk+3
  3. 安装 GTK# 的 template
    dotnet new --install GtkSharp.Template.CSharp
  4. 安装 Glade (RAD工具,快速拖拉控件) 1
    brew install glade
  5. 新建项目
    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

命令:
查看所有已安装的 templates
dotnet new --list
依据某个 template 建立项目,比如 console template
dotnet 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>

changsj
211 声望11 粉丝

changsj.