跨平台.NET应用开发探索

随着技术的发展,跨平台应用开发的需求日益增长。微软在2010年宣布将Silverlight转向HTML5,而Moonlight项目在2011年被放弃,但开发跨平台.NET应用的愿望并未减弱。Mono和MonoDevelop项目依然活跃,微软在2014年11月宣布并发布了.NET Core 5.0以改善跨平台和开源支持。Xamarin通过Mono支持iOS和Android平台,包括Xamarin.Forms、Xamarin.iOS和Xamarin.Android。

在这种背景下,开发基于Linux/Unix桌面的MVVM/XAML应用程序似乎是一个不错的选择。共享尽可能多的代码将带来诸多好处。目前,主流的Linux/Unix平台如GTK+和Qt并不支持MVVM/XAML。Roma Widget Set虽然提供了MVVM/XAML的支持,但其功能仅限于小部件,且基于Xlib/X11和X11扩展。

为了与微软基于DirectX的WPF实现相竞争,需要一个等效的基础,例如OpenGL。已经有两项初步研究探讨了这种方法:"在MONO/.NET中使用OpenGL/OpenTK开始严肃应用"和"在MONO/.NET中使用OpenGL/OpenTK进行文本渲染的摘要"。结果看起来很有希望,因此开始追求这个愿景:OpenGL Presentation Foundation。

对这个想法有什么看法?非常乐意听到评论!

使用代码

请阅读文章"在MONO/.NET中使用OpenGL/OpenTK开始严肃应用"以获取最小开发环境设置(Mesa, Mono+MonoDevelop, OpenTK)的信息。与此同时,转向了openSUSE Leap 42并更新了MonoDevelop到5.10版本。(建议仔细阅读下载信息,并从Mono:Factory通过1 Click install下载Linux发行版包,而不是Xamarin包。)

openSUSE Leap 42包含的MonoDevelop版本5.0.1在调试会话期间经常崩溃。MonoDevelop版本5.10要稳定得多(即使它被宣布为可能不稳定的包)。希望在不久的将来能获得一个与旧的32位版本2.4.1一样稳定和高效的MonoDevelop 64位版本。

对于文本输出,使用了增强版的FtFont类(详情请阅读文章"在MONO/.NET中使用OpenGL/OpenTK进行文本渲染的摘要")。

使用OpenGL Presentation Foundation的第一个严肃应用程序 - OpfDesigner-01

示例应用程序展示了非常基本的控件实现,如DockPanel、Menu、MenuItem和Button,以及MouseOver行为和Click回调。解决方案包括两个项目:OpfPreprocessor(包含XAML预处理器的源代码)和OpfDesigner(包含示例应用程序的源代码)以及References文件夹(包含OpenTK和OpenGLPresentationFoundation的引用程序集)。

要了解OpfPreprocessor的工作原理,请阅读"编写X11的XAML对话框应用程序"文章的"逐步指导"章节。

首先查看的XAML文件是App.xaml。

<Application x:Class="OpfDesigner.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:OpfDesigner" StartupUri="MainWindow.xaml"> <Application.Resources> </Application.Resources> </Application>

XAML代码完全与Microsoft® WPF兼容。

对应的C#代码文件是App.xaml.cs。

using System; using System.Diagnostics; // Replica using System.Windows; namespace OpfDesigner { /// <summary> /// Interaction logic for App.xaml /// </summary> public partial class App : Application { // ############################################################################### // ### M E T H O D S // ############################################################################### #region Methods #endregion Methods } }

完整的代码背后完全与Microsoft® WPF兼容。

第二个要查看的XAML文件是MainWindow.xaml。

<Window x:Class="OpfDesigner.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:OpfDesigner" Title="MainWindow" Height="350" Width="525"> <DockPanel Name="MainDock"> <Menu x:Name="MainMenu" DockPanel.Dock="Top"> <MenuItem Name="File_MainMenuItem" Header="File"> </MenuItem> <MenuItem Name="Edit_MainMenuItem" Header="Edit"> </MenuItem> </Menu> <Button Name="Button1" Content="Button 1" IsEnabled="False"> </Button> <Button Name="Button2" Content="Button 2"> </Button> <Button Name="Button3" Content="Click me to close the window!" FontSize="16" Click="Button3_Click"> </Button> </DockPanel> </Window>

完整的XAML代码完全与Microsoft® WPF兼容。

对应的C#代码文件是MainWindow.xaml.cs。它包含了Button控件的Click委托。

using System; // Replica using System.Windows; using System.Windows.Controls; namespace OpfDesigner { public partial class MainWindow : Window { /// <summary> /// The default constructor. /// </summary> public MainWindow () { InitializeComponent (); // will be called after construction by generated code! } private void Button3_Click(object sender, RoutedEventArgs e) { Close(); } } }

完整的代码背后完全与Microsoft® WPF兼容。

接下来的挑战

对话框窗口、弹出菜单等。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485