随着技术的发展,跨平台应用开发的需求日益增长。微软在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进行文本渲染的摘要")。
示例应用程序展示了非常基本的控件实现,如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兼容。
对话框窗口、弹出菜单等。