。
对contentnbsp表;{A}{A4}{A5}{A6}{A7}
{A9}{A10}{A11}{A12}{A13}{A14}{A15}{A16}
{A17}{A19}{A20}{A21}{A22}{A23}{A24}{A25}
{A27}{A28}{A29}{A30}{A31}{A32}{A33}
本文介绍如何,我们可以用我们的编程技巧来实现。NET框架GNOME面板小程序。整个开发过程进行了与IDE的使用MonoDevelop的Ubuntu操作系统,所以你可以找到一些有关此操作系统和IDE的信息。
文章的第一部分是从各种来源(如书籍和网站)收集到的信息,第二部分是一个小程序创建的描述,在选定的位置显示当前天气。
的文章的主要思想是兴趣的开发工作在独立于平台的的代码。在文章的末尾你可以找到的所有引用。{A34}的一部分吗??理论{A35}
我觉得。NET开发人员,这在以往的开发工具的经验和技术,如Microsoft基础类,活动模板库,组件对象模型,很多人可能会惊讶的事实。NET Framework是独立于平台的。我们可以编译和执行,不仅在Microsoft Windows操作系统NET程序集。使用开源的。NET实现,如Mono,Portable.NET。使其成为可能。
跨平台应用程序,用这些。NET实现的帮助编写的,不一定是简单的控制台应用程序。我们可以使用ADO.NET,ASP.NET,XML Web服务和核心命名空间和语言功能等诸多优点。
在其中。NET的跨平台的本质是实现的方式是由Sun Microsystems的Java编程平台的处理方法不同。与Java不同,微软本身不提供的Mac,Linux等相反,微软已经发布了一套正式的规格,其他实体,可以使用作为一个为他们选择的平台building.NET分布道路地图NET的安装程序。ECMA - 334,它定义了C#编程语言的语法和语义ECMA - 335,它定义了许多细节。NET平台{A36}CLI网站说明单声道http://www.mono-project.comMono是一个开源的和商业支持分布。NET的赞助由Novell公司。便携式NET http://www.dotgnu.org便携式的。NET是分布在GNU通用公共许可证。
每个CLI的实现提供了一个全功能的C#编译器,大量的命令行开发工具,一个全局程序集缓存实施,示例代码,有用的文档,和几十个组件构成的基类库。
除了分区第四ECMA - 335,单声道和实施的核心定义的库便携式的。NET提供的mscorlib.dll中,System.Data.dll中微软兼容的实现,System.Web.dll中,System.Drawing.dll,System.Windows.Forms.dll的(等等)。此外,单声道和便携式分发蚊帐,也附带的一些集会专门针对Unix / Linux和Mac OS X作业系统。
在我的示例应用程序中,我使用Mono CLI的实现,因此我们将研究这是什么。{A37}
由于前面提到的,Mono是一个软件平台,旨在使开发人员能够轻松创建跨平台的应用。 "微软。Net框架基于ECMA标准为C#和通用语言运行时的一个开源实现。{A38}有弥补单声道几个组件:C#编译器 - C#编译器编译C#1.0和2.0(ECMA)的完成,还包含许多的C#3.0特性的功能。Mono运行时 - 运行时实现了ECMA通用语言基础结构(CLI)。运行时提供了一个实时(JIT)编译器,一个超前的实时编译器(AOT),库装载机,垃圾收集,线程系统和互操作功能。基类库 - Mono平台提供了一套全面,提供了坚实的基础来构建应用程序的类。这些类是与微软的。NET Framework类兼容。单类库 - Mono还提供了许多超出由微软提供的基类图书馆类。这是有用的,尤其是在构建Linux应用程序,提供额外的功能。有些例子是GTK,Zip文件,LDAP,OpenGL中,开罗,POSIX等类{A39}
Mono的当前发行版本是2.6。 (2009年12月发布)的最简单的方式来描述单声道目前支持什么是:"一切都在,有限的WCF WPF和WF 3.5 NET的除外。
如果您已经编写的应用程序。NET,您可以扫描您的应用程序的Mono迁移分析仪(MOMA),以确定是否您的应用程序使用任何不支持由单音。
AnonSVN目前只能从用户和尚未公布此外了单即将推出的版本有:C#4.0中LINQ的4.0ASP.NET 4.0(部分实施){A40}{A41}
,我们可以在Mono开发的应用程序,使用以下IDE:微软Visual Studio(http://go-mono.com/monotools/)与外接SharpDevelop(http://www.icsharpcode.net/OpenSource/SD/)MonoDevelop的(http://monodevelop.com/)
在这篇文章中我将介绍使用MonoDevelop的{A42}
MonoDevelop的主要是C#和其他。NET语言设计了一个IDE。 MonoDevelop的使开发人员能够快速地写在Linux,Windows和Mac OSX桌面和ASP.NET Web应用程序。 MonoDevelop的端口。NET应用程序使用Visual Studio中对Linux创建和维持一个单一的代码库,适用于所有平台的开发者更容易。
你也可以打开MonoDevelop的与微软的Visual Studio项目。 MonoDevelop的csproj扩展项目文件是一个有效的MSBuild文件。
发布了MonoDevelop的版本是2.2.1{A43}
(我在{A44}生活在我国)有与使用许可的软件文化的一些问题。所以我主要的家庭作业系统是Ubuntu 9.10 Karmic中。 Ubuntu是基于Debian GNU / Linux发行的计算机操作系统。它是由世界各地的专家开发团队和包含你需要的所有应用程序:Web浏览器,办公套件,媒体应用程序,即时消息和更。 Ubuntu是一个开源的Windows和Office替代。
Ubuntu的思想:Ubuntu将永远是免费的,随着其正常的企业发布和安全更新Ubuntu的来自世界各地的规范和完整的商业支持数百家企业Ubuntu提供最好的翻译和辅助功能,自由软件社区提供Ubuntu的核心应用程序都是免费和开源。
GNOME是在Ubuntu的默认用户桌面。这是我的桌面screenshoot:{A45}
{A46}项目提供了两件事情:GNOME桌面环境,为用户直观和有吸引力的的桌面,GNOME开发平台,用于构建应用程序集成到桌面的其余部分的广泛框架。
作为开发人员,我们在GTK库感兴趣。 GTK是基层图书馆,它是用来建造在GNOME应用程序的用户界面。让我们conside这个库的便携版本。{A47}
Gtk#的单声道是一个图形用户界面工具包。NET。该项目结合{A48}。
{A49}
在这部分的文章中,我们已经考虑用Mono使用的理论方面的一些应用程序的开发。我不久也认为Ubuntu的,GNOME和GTK# {A50}
,在这部分,我会考虑为GNOME PanelApplet的实施将显示在选定的location.nbsp当前的天气;{A51}
Applet是一个小型应用程序,设计,提供快捷方便地访问的控制,如音量控制或天气衡量,坐在在GNOME面板。从技术上来说,applet是{A52}嵌入在GNOME面板。这意味着有一个独立的GNOME程序的一些细微的差别。{A53}
每个applet需要一个"服务器"文件,其中包含的Bonobo能力的描述。让我们看看在我们的服务器上的文件。
NB。 oaf_server标签定义我们的可执行文件的位置,类型为"EXE。在这个例子中,我们的可执行文件被称为weatherApplet.exe,是摆在quot; / home/aidan/Projects/appletGDK/appletSource1/bin/Debug /??此外,我们定义我们的applet"工厂",weatherApplet工厂的名称。这是服务器上的文件的名称,通常是放置在的/ usr / lib中/倭/服务器/。{A54}
PanelApplet类是用来创建一个applet使用Mono。关于这个类的正式文件是可用{A55}。
要创建小程序,我们必须创建自己的类,将继承PanelApplet类,并实现下面的方法和属性:
创建()无效??正在创建一个applet时,这种方法被称为字符串的IID这个属性返回的OAFIID串,这是用来约束与倭服务器filenbsp??;字符串FactoryIID - 这个属性返回的OAFIID串,其中定义倭工厂
让我们看看在我们的创作()实现。
首先,我们定义的GTK#用户标签命名的元素的控制,并把它添加到画布:{C}
然后我们定义了一个上下文菜单。我们添加两个菜单项,给他们的名字出现在点击鼠标右键时的菜单:string menuItemTemplate = "<menuitem name=\"{0}\" verb=\"{1}\" _label=\"_{2}\" pixtype=\"stock\" pixname=\"gtk-properties\"/>";
StringBuilder menuBuilder = new StringBuilder();
menuBuilder.Append("<popup name=\"button3\">");
menuBuilder.AppendFormat(menuItemTemplate,"Properties","LabelChange","Change label");
menuBuilder.AppendFormat(menuItemTemplate,"Properties","Preferences","Preferences");
menuBuilder.Append("</popup>");
最后,我们添加了这个菜单中描述的PanelApplet:
属性的实现很简单:我们就返回字符串,这在以前是在服务器的文件中定义:public override string IID {
get {
return "OAFIID:appletWeather";
}
}
public override string FactoryIID {
get {
return "OAFIID:appletWeather_Factory";
}
}
此外,我们将鼠标点击添加额外的功能。要做到这一点,我们可以使用OnButtonPressEvent:protected override bool OnButtonPressEvent (EventButton evnt)
{
//see http://www.go-mono.com/docs/index.aspx?link=P%3AGdk.EventButton.Time
//1 - left
//2 - middle
//3 - right
if(evnt.Button == 1)
{
if(w!=null)
w.Destroy();
w = new MyWindow();
}
return base.OnButtonPressEvent (evnt);
}
在此方法中,我们创建mywindow的对象时,按下鼠标左键。{A56}
要注册我们的applet,我们必须在Main方法中添加下面的代码:
{A57}
PanelAppletFactory.Register(typeof (PanelAppletClass));
我从http://www.webserviceX.NET使用的网络服务。要获得关于天气的信息。它提供了以下方法: GetCitiesByCountry - 所有主要城市的国名(全/兼职) 的GetWeather - 获取世界各地的所有主要城市的天气报告。
WSDL模式是本网站提供的。{A58}
单声道提供具体的工具,使我们能够从WSDL文件生成相应的C#源文件。此文件包含的类可以调用Web服务方法。生成此文件,运行在命令行中的WSDL公用事业:{S3}
该实用程序将生成GlobalWeather的类,它包含GetCitiesByCountry GetWeather方法返回的数据的GetWeather methods.The例如:
{A59}由于它是从例子中看到的数据是XML格式返回。让我们创建一个类来表示在任何一个城市当前的天气:要创建这个类的XML对象,我们添加了一个工厂方法创建。在此方法中,我们使用XmlSerializer的System.Xml.Serialization和System.IO命名空间提供的MemoryStream类:<currentweather>
<location>Minsk, Belarus (UMMS) 53-56N 027-38E 231M</location>
<time>Mar 04, 2010 - 08:00 AM EST / 2010.03.04 1300 UTC</time>
<wind> from the SW (230 degrees) at 9 MPH (8 KT) gusting to 16 MPH (14 KT) (direction variable):0</wind>
<visibility> greater than 7 mile(s):0</visibility>
<skyconditions> mostly cloudy</skyconditions>
<temperature> 30 F (-1 C)</temperature>
<wind>Windchill: 21 F (-6 C):1</wind>
<dewpoint> 17 F (-8 C)</dewpoint>
<relativehumidity> 58%</relativehumidity>
<pressure> 29.80 in. Hg (1009 hPa)</pressure>
<status>Success</status>
</currentweather>
要隐藏这些实现细节,我创建了一个类WeatherService。这个类提供了两个相同的方法:??的GetWeather调用Web服务,解析响应和返回CurrentWeather对象,表示在适当的国家和城市的天气:public static CurrentWeather Create(string xml)
{
if (String.IsNullOrEmpty(xml))
return new CurrentWeather();
try
{
XmlSerializer sr = new XmlSerializer(typeof(CurrentWeather));
MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(xml));
return (CurrentWeather)sr.Deserialize(memoryStream);
}
catch
{
return new CurrentWeather();
}
}
??GetCitiesByCountry返回城市名单:public static CurrentWeather GetWeather(string country, string city)
{
string xml = service.GetWeather(city, country);
XElement root = XElement.Parse(xml);
return CurrentWeather.Create(root.ToString());
}
这里我使用LINQ的功能是在Mono。在这两种方法的XElement类是用于解析XML文件。这个类中出现。NET Framework 3.0和Mono的支持太。{A60}{A61}要的任何位置,我创建了一个特殊的窗口显示当前天气:private static GlobalWeather service = new GlobalWeather();
private static Dictionary<string, IEnumerable<string>>
citiesOfcountry = new Dictionary<string, IEnumerable<string>>();
public static IEnumerable<string> GetCitiesByCountry(string country)
{
if(!citiesOfcountry.ContainsKey(country))
{
string xml = service.GetCitiesByCountry(country);
XElement root = XElement.Parse(xml);
IList<string> cities = new List<string>();
citiesOfcountry.Add(country,
(from city in root.Elements()
orderby city.Element("City").Value
select city.Element("City").Value));
}
return citiesOfcountry[country];
}
在这里,我宣布mywindow的内置Gtk.Window类继承的类。另外,我在这个类中添加标签,会显示目前选定的位置天气信息。在施工中,我呼吁createControls()方法在哪些控件添加到窗口中:public class MyWindow:Window
{
private Label lblLocation = new Label();
private Label lblTime = new Label();
private Label lblWind = new Label();
private Label lblVisibility = new Label();
private Label lblSkyConditions = new Label();
private Label lblTemperature = new Label();
private Label lblDewPoint = new Label();
private Label lblRelativeHumidity = new Label();
private Label lblPressure = new Label();
public MyWindow():base("Center")
{
CreateControls();
ShowAll();
}
...
}
{A62} private void CreateControls()
{
SetDefaultSize(400, 200);
Fixed fix = new Fixed();
fix.Put(new Label("Location"), 10, 10 );
fix.Put(lblLocation, 180, 10 );
fix.Put(new Label("Pressure"), 10, 170 );
fix.Put(lblPressure, 180, 170 );
...
this.Add(fix);
}
GTK库提供的TreeView控件。我用我的小程序,它显示一个国家与城市的树:让我们可以考虑如何建立一个国家的树:创建滚动窗口:
创建TreeView和lable显示的是当前选择ScrolledWindow sw = new Gtk.ScrolledWindow ();
创建一个盒子举行入学和树Gtk.TreeView tree = new Gtk.TreeView ();
filterEntry = new Gtk.Label ();
新增的部件框Gtk.VBox box = new Gtk.VBox ();
创建列box.PackStart(filterBox, false, false, 5);
sw.Add (tree);
box.PackStart(sw, true, true, 5);
加选择处理程序
Gtk.TreeViewColumn countriesColumn = new Gtk.TreeViewColumn ();
countriesColumn.Title = "Countries";
Gtk.CellRendererText countriesNameCell = new Gtk.CellRendererText ();
countriesColumn.PackStart (countriesNameCell, true);
tree.AppendColumn (countriesColumn);
countriesColumn.AddAttribute(countriesNameCell, "text", 0);
创建国家名单tree.Selection.Changed += OnSelectionChanged;
BuildTree方法创建TreeStore的对象,它代表国家的树:tree.Model = BuildTree();
SetCountryCities方法追加单个节点城市:private TreeStore BuildTree()
{
Gtk.TreeStore countryListStore = new Gtk.TreeStore(typeof (string));
Gtk.TreeIter europe = countryListStore.AppendValues ("Europe");
SetCountryCities("Belarus", europe, ref countryListStore);
SetCountryCities("Russia", europe, ref countryListStore);
return countryListStore;
}
让我们看看在树选择处理程序:private void SetCountryCities(string country,TreeIter region, ref TreeStore store)
{
TreeIter countryIter = store.AppendNode(region);
store.SetValue(countryIter,0, country);
foreach(var city in WeatherService.GetCitiesByCountry(country))
store.AppendValues (countryIter, city);
}
在这里,我们得到用户的选择,更改标签,并保存它使用SettingStore。在这里我们可以保存applet的设置?这在GNOME环境的目的,我们可以使用{A63}。{A64}GConf是一个用于存储应用程序首选项的系统。它是针对用户的喜好,而不是配置的东西,比如Apache,或任意数据。这正是我们所需要的:void OnSelectionChanged (object o, EventArgs args)
{
TreeIter iter;
TreeModel model;
if (((TreeSelection)o).GetSelected (out model, out iter))
{
if(model.IterHasChild(iter)) return;
TreeIter parent;
model.IterParent(out parent, iter);
string state = (string) model.GetValue (parent, 0);
string city = (string) model.GetValue (iter, 0);
filterEntry.Text = String.Format("{0}-{1} was selected", state, city);
SettingsStore.Set("state", state);
SettingsStore.Set("city", city);
}
}
using GConf;
public static class SettingsStore
{
//path in gconf-editor
private const string APPLICATION_KEY = "/apps/appletweather/";
//gconf object
private static Client client = new Client();
//set value
public static void Set(string key, object val)
{
client.Set(APPLICATION_KEY+key, val);
}
//get value
public static object Get(string key)
{
return client.Get(APPLICATION_KEY+key);
}
}
其实我认为这是非常相似,在Windows的注册工具:{五}{A65}为了注册系统中的applet,我们必须做以下步骤:设置在服务器的文件执行文件的位置添加文件服务器的/ usr / lib中/倭/服务器的目录添加图标文件是由服务器文件到/ usr /共享/ pixmaps目录中引用。图标文件是一个图像显示在"添加到面板"对话框鼠标右键单击工具栏上选择的"添加到面板... »选项
从列表中选择的小程序{中六}{A66}
applet是用于演示目的。尽管如此,它知道如何显示有关所选位置的信息。为此,我们必须在applet上单击鼠标右键,选择"首选项,并选择位置上的TreeView??{S4}的
要获得详细查看了当前天气,你应该单击鼠标左键:{S0}{A49}在这部分的文章中,我们认为执行GNOME桌面环境的面板小程序。我们使用。NET框架以前在Windows下执行的标准类。此外,我们使用特定的GTK库。 {A68}我成了不久前intrested开源技术。因此,本文可能包含错误和不准确之处。但我`M在这项技术的兴趣,并想参与其发展。{A69}单声道:开发人员的笔记本尼尔M.nbsp;伯恩斯坦,Eddnbsp; Dumbill,奥赖利,2004年,国际标准书号0-596-00792-2临彗星#2008和NET 3.5的平台安德鲁Troelsen,第四版,Apress出版,2007年,ISBN - 10:1-59059-884-9{A70}{A71}{A72}{A74}{A75}{A76}2010年3月5日 - 第一个版本的文章