返回首页

对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方法中添加下面的代码:
	

PanelAppletFactory.Register(typeof (PanelAppletClass));

{A57}
我从http://www.webserviceX.NET使用的网络服务。要获得关于天气的信息。它提供了以下方法: GetCitiesByCountry - 所有主要城市的国名(全/兼职) 的GetWeather - 获取世界各地的所有主要城市的天气报告。
WSDL模式是本网站提供的。{A58}
单声道提供具体的工具,使我们能够从WSDL文件生成相应的C#源文件。此文件包含的类可以调用Web服务方法。生成此文件,运行在命令行中的WSDL公用事业:{S3}
该实用程序将生成GlobalWeather的类,它包含GetCitiesByCountry GetWeather方法返回的数据的GetWeather methods.The例如:
<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>

{A59}由于它是从例子中看到的数据是XML格式返回。让我们创建一个类来表示在任何一个城市当前的天气:要创建这个类的XML对象,我们添加了一个工厂方法创建。在此方法中,我们使用XmlSerializer的System.Xml.Serialization和System.IO命名空间提供的MemoryStream类:
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();

            }

		}

要隐藏这些实现细节,我创建了一个类WeatherService。这个类提供了两个相同的方法:??的GetWeather调用Web服务,解析响应和返回CurrentWeather对象,表示在适当的国家和城市的天气:
public static CurrentWeather GetWeather(string country, string city)

		{

			string xml = service.GetWeather(city, country);

			XElement root = XElement.Parse(xml);

			

			return CurrentWeather.Create(root.ToString());

		}

??GetCitiesByCountry返回城市名单:
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];

		}

这里我使用LINQ的功能是在Mono。在这两种方法的XElement类是用于解析XML文件。这个类中出现。NET Framework 3.0和Mono的支持太。{A60}{A61}要的任何位置,我创建了一个特殊的窗口显示当前天气:
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();

		}

		...

}

在这里,我宣布mywindow的内置Gtk.Window类继承的类。另外,我在这个类中添加标签,会显示目前选定的位置天气信息。在施工中,我呼吁createControls()方法在哪些控件添加到窗口中:
		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);

		}

{A62}
GTK库提供的TreeView控件。我用我的小程序,它显示一个国家与城市的树:让我们可以考虑如何建立一个国家的树:创建滚动窗口:
ScrolledWindow sw = new Gtk.ScrolledWindow ();

创建TreeView和lable显示的是当前选择
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; 	

创建国家名单
tree.Model = BuildTree();

BuildTree方法创建TreeStore的对象,它代表国家的树:
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;

		}

SetCountryCities方法追加单个节点城市:
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);

			

		}

让我们看看在树选择处理程序:
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);

                }

        }

在这里,我们得到用户的选择,更改标签,并保存它使用SettingStore。在这里我们可以保存applet的设置?这在GNOME环境的目的,我们可以使用{A63}。{A64}GConf是一个用于存储应用程序首选项的系统。它是针对用户的喜好,而不是配置的东西,比如Apache,或任意数据。这正是我们所需要的:
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日 - 第一个版本的文章

回答

评论会员:beedaddy 时间:2012/01/25
您好,

是真的有足够的复制的/ usr / lib中/倭/服务器和一个图标复制到/ usr /共享/的pixmaps的服务器上的文件(修改)。我尝试这样做(下的Fedora 14),但不会出现面板小程序列表中的一个条目。也许我错过了什么?


马丁
评论会员:beedaddy 时间:2012/01/25
看来,我已经从GNOME注销并再次登录。之后,它承认新条目。但试图启动面板applet的结果,在一条错误消息,只告诉我,发生了一个问题。这个错误甚至出现与您的示例代码 - 这让我有点无奈。 {S9}
评论会员:py_sunil 时间:2012/01/25
能否请您installaing在Ubuntu Linux.Because单声道分享您的经验,我可能会到Linux很新。也可以请你提供关于如何安装Ubuntu Linux上的单的一些屏幕截图。

这篇文章是非常好的。感谢您发布这样一个很好的文章
评论会员:欺骗蛋糕 时间:2012/01/25
单声道是预安装 - 你只需要开发工具

晚间,刚刚安装MonoDevelop的Monodoc(通过软件中心)应带的核心开发包 - 您可以安装新立得软件包Manager.People越到后来认为它必须是有趣的是一个超级天才,但他们不知道有多难是把世界上所有的白痴。 - 卡尔文卡尔文与霍布斯(不可缺少的卡尔文与霍布斯,P105 - 3)
评论会员:伊利亚Builuk 时间:2012/01/25


命令和apt - get安装MonoDevelop的

我认为在任何情况下,有必要在Ubuntu社区为Ubuntu的用户和开发人员的更多细节
评论会员:Maximus的Byamukama 时间:2012/01/25
这是很容易的。 Ubuntu的仓库将有单声道。只要到你的机器,类型(搜索)"MONO"Ubuntu软件中心,并单击"安装"。
BHM
评论会员:Bib34770 时间:2012/01/25
非常有启发性的职业
这将是一个非常好的新的例子,如果你能显示这个程序如何可以更新工作
评论会员:。伊利亚Builuk 时间:2012/01/25
此代码使用特定的GNOME库(GTK#),所以它不是在Linux和Windows在Windows下工作。在一般情况下,您可以使用从Web服务检索的数据,并准备表示层(GTK#库)的代码。你甚至可以把这段代码在一个单独的程序,将这些平台上运行而无需重新编译。
我觉得很好的例子就是ASP.NET(MVC或WebForms的)应用程序,将运行在IIS和Apache。
据我所知,真的。我会考虑写了这样一个例子
评论会员:。Bib34770 时间:2012/01/25
。没有足够的桌面应用程序运行在Windows和其他系统的例子
没有compagny可以投资创建仅在Linux上运行的应用程序。
如果解决的办法是为每个系统编写,每个表单,它似乎是大量的工作,和我想看到一个例子。

如果DOTNET框架编写的应用程序上运行多个系统,Web应用程序一样,自然可以使可能,这将是一场革命... ...试想一下...

如果你能够帮助我们编写可移植代码,我很感兴趣,我想我不是唯一的一个。

感谢所有
评论会员:。tkrafael_net 时间:2012/01/25
。完全有可能在Windows上运行此应用程序
基本上,安装在Windows,GTK#约​​束力的用于Windows的单声道。
我没有测试,但是,使用GTK#和Mono的可移植性思想,我认为是可能的。
我anynone可以对此进行测试,每个人都将apreciate
THX
评论会员:SAKryukov 时间:2012/01/25
伊利亚,
非常感谢您为您的文章。我一定会用你的意见返回到Mono编程,并了解有关技术的详细信息。
请修正标题(和其他地方)的错字。你知道如何拼写"侏儒",正确的,为什么不申请这方面的知识,以及文章的标题? {S9}谢尔盖一个Kryukov
评论会员:伊利亚Builuk 时间:2012/01/25
谢尔盖,非常感谢你。我一直在写这篇文章,整天和成品深夜。但我似乎很奇怪,我怎么能跳过在标题中错误..
评论会员:游客 时间:2012/01/25
?马塞洛里卡多-奥利维拉
干得好,伊利亚,从我这里得到5。 {S9}
marceloTake看看{A77}游戏代码项目
评论会员:游客 时间:2012/01/25
。spoodygoon:干得好感谢带来更多的单声道文章|AterMentis
。它的好看到更多显示的力量的文章。NET Windows以外的平台上,Mono是已经为Linux的最舒适的发展平台,它可以更好,甚至有一个更大的community.Ilya Fainberg
StudioKrasnó
www.studiokrasno.ru