<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6621561</id><updated>2012-01-30T17:18:37.984+11:00</updated><category term='localization'/><category term='soa'/><category term='AJAX'/><category term='ipad'/><category term='youtube'/><category term='geoquery2008'/><category term='wtf'/><category term='xamarin'/><category term='c#'/><category term='internationalization'/><category term='iphone'/><category term='spam'/><category term='photosynth'/><category term='bingmaps'/><category term='moonlight'/><category term='visualstudio'/><category term='database'/><category term='monospace'/><category term='facebook'/><category term='pdc09'/><category term='linq'/><category term='silverlight3'/><category term='ipodtouch'/><category term='silverlight'/><category term='php'/><category term='iis7'/><category term='monotouch'/><category term='holiday'/><category term='seadragon'/><category term='translator'/><category term='samsung'/><category term='hiring'/><category term='mvc'/><category term='rest'/><category term='resume'/><category term='monodroid'/><category term='android'/><category term='photo'/><category term='running'/><category term='microsofttag'/><category term='bhutan'/><category term='mvvm'/><category term='wpf'/><category term='twitter'/><category term='winphone7'/><category term='search'/><category term='googlemaps'/><category term='asp.net'/><category term='maps'/><category term='mono'/><category term='virtualearth'/><category term='deepzoom'/><category term='fiddler'/><category term='json'/><title type='text'>ConceptDev (Craig Dunn's blog)</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default?start-index=101&amp;max-results=100'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>303</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6621561.post-7792901826055107917</id><published>2011-07-18T23:07:00.002+10:00</published><updated>2011-07-18T23:15:42.510+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monodroid'/><category scheme='http://www.blogger.com/atom/ns#' term='xamarin'/><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Xamarin welcomes MonoTouch and MonoDroid "home"</title><content type='html'>Great news! &lt;a href="http://xamarin.com/" target="20110718"&gt;Xamarin&lt;/a&gt; has acquired a "broad, perpetual license" to the &lt;b&gt;MonoTouch&lt;/b&gt; and &lt;b&gt;Mono-for-Android&lt;/b&gt; work that was done while the dev team was part of Novell (prior to the &lt;a href="http://conceptdev.blogspot.com/2011/05/monotouchmonodroid-and-xamarin-what-now.html" target="20110718"&gt;Attachmate buyout kerfuffle&lt;/a&gt;). There's a &lt;a href="http://www.novell.com/news/press/2011/7/suse-and-xamarin-partner-to-accelerate-innovation-and-support-mono-customers-and-community.html" target="20110718"&gt;press release on the Novell website&lt;/a&gt; and &lt;a href="http://tirania.org/blog/archive/2011/Jul-18.html" target="20110718"&gt;Miguel posted on his blog&lt;/a&gt; too. Congratulations to the Xamarin team!&lt;br /&gt;&lt;br /&gt;Check out the product details at:&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.xamarin.com" target="20110718"&gt;Xamarin home&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ios.xamarin.com" target="20110718"&gt;MonoTouch (for iOS)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://android.xamarin.com" target="20110718"&gt;Mono-for-Android (for Android:)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;plus the &lt;a href="http://store.xamarin.com" target="20110718"&gt;store&lt;/a&gt; &amp;amp; &lt;a href="http://bugzilla.xamarin.com" target="20110718"&gt;bugzilla&lt;/a&gt; are back... and the products are available to purchase immediately (with upgrades for 'existing customers')&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Start with the &lt;a href="http://ios.xamarin.com/Roadmap" target="20110718"&gt;iOS Roadmap&lt;/a&gt; to find out what's coming up next.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://monospace.us"&gt;Monospace&lt;/a&gt; is going to be great! Have you downloaded the &lt;a href="http://monospace11.confapp.com"&gt;app yet&lt;/a&gt; :-) ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-7792901826055107917?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/7792901826055107917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2011/07/xamarin-welcomes-monotouch-and.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/7792901826055107917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/7792901826055107917'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2011/07/xamarin-welcomes-monotouch-and.html' title='Xamarin welcomes MonoTouch and MonoDroid &quot;home&quot;'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-2042408961461391838</id><published>2011-07-13T22:29:00.002+10:00</published><updated>2011-07-15T19:33:51.817+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monospace'/><category scheme='http://www.blogger.com/atom/ns#' term='monodroid'/><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>"M"osetta Stone II: ViewController → Activity</title><content type='html'>After my recent posts I received a question asking for tips on porting a &lt;b&gt;MonoTouch&lt;/b&gt; app to &lt;b&gt;MonoDroid&lt;/b&gt;. I'm going to take a crack at that over a couple of days - with the warning that you probably shouldn't rush out and buy either tool but wait for &lt;a href="http://xamarin.com"&gt;Xamarin&lt;/a&gt;'s future Mono-on-iOS and Mono-on-Android products.&lt;br /&gt;&lt;br /&gt;The purpose of the original &lt;a href="http://conceptdev.blogspot.com/2011/03/mosetta-stone.html" target="20110713"&gt;"M"osetta Stone&lt;/a&gt; post was to give cross-platform developers a 'head start' with some high-level concepts. This post will look a little closer at a screen from the &lt;a href="https://github.com/conceptdev/Monospace11" target="20110713"&gt;Monospace11&lt;/a&gt; app: the Speakers list.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-UpVWZ0Dm_cg/Th2BRoYoFUI/AAAAAAAABU0/E6FA-wGY-AY/s1600/Speakers.png" imageanchor="1" style="margin-left:1em; margin-right:1em" target="20110713"&gt;&lt;img border="0" height="231" width="320" src="http://2.bp.blogspot.com/-UpVWZ0Dm_cg/Th2BRoYoFUI/AAAAAAAABU0/E6FA-wGY-AY/s320/Speakers.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This may be a massive oversimplification, but...&lt;br /&gt;&lt;table border='1' cellspacing='0'&gt;&lt;tr&gt;&lt;th&gt;if you have&lt;br /&gt;___ in iOS&lt;/th&gt;&lt;th&gt;then you want&lt;br /&gt;___ in Android&lt;/th&gt;&lt;th&gt;to&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;UIViewController&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Activity&lt;/b&gt;&lt;/td&gt;&lt;td&gt;subclass to present a screen/form/page to the user&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ViewDidLoad()&lt;/td&gt;&lt;td&gt;OnCreate()&lt;/td&gt;&lt;td&gt;setup the UI&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Add() or AddSubview()&lt;/td&gt;&lt;td&gt;SetContentView()&lt;/td&gt;&lt;td&gt;use in ViewDidLoad/OnCreate to 'attach' UI to display&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ViewWillAppear()&lt;/td&gt;&lt;td&gt;OnResume()&lt;/td&gt;&lt;td&gt;load/re-load data that might change and bind to UI&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;UITableView&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;ListView&lt;/b&gt;&lt;/td&gt;&lt;td&gt;visual control that presents a scrolling list&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;UITableViewSource&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Adapter&lt;/b&gt;&lt;/td&gt;&lt;td&gt;subclass to broker the display of a data collection to the UI&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GetCell()&lt;/td&gt;&lt;td&gt;GetView()&lt;/td&gt;&lt;td&gt;to build the layout(UI) for each cell/row, including re-using cells/views for performance&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;RowSelected()&lt;/td&gt;&lt;td&gt;ItemClick EventHandler&lt;/td&gt;&lt;td&gt;perform an action when a row is touched&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;RowsInSection&lt;/td&gt;&lt;td&gt;Count&lt;/td&gt;&lt;td&gt;tell the table/list how many rows to cater for&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Here's how it looks in a Visual Studio Class Diagram* &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-sWTBfOvN2oc/Th2AElPILmI/AAAAAAAABUs/XCa3tvKTCQY/s1600/ViewController_Activity.png" imageanchor="1" style="margin-left:1em; margin-right:1em" target="20110713"&gt;&lt;img border="0" height="352" width="400" src="http://2.bp.blogspot.com/-sWTBfOvN2oc/Th2AElPILmI/AAAAAAAABUs/XCa3tvKTCQY/s400/ViewController_Activity.png" /&gt;&lt;/a&gt;&lt;/div&gt;* &lt;i&gt;I've greyed out some of the methods not relevant to the discussion - the iOS implementation of the alphabetic index down the right edge doesn't have an Android equivalent, for example&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;Notes:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;UITableViewSource&lt;/code&gt; has been implemented as an nested class to resemble the iOS pattern of implementing the equivalent Obj-C protocols &lt;i&gt;on&lt;/i&gt; the ViewController - this pattern makes no sense in Android so the classes are separate.&lt;/li&gt;&lt;li&gt;The MonoTouch example code builds the UI in C# (eg. &lt;code&gt;tableView=new UITableView();AddSubview (tableView);&lt;/code&gt;) whereas MonoDroid loads layout XML files &lt;code&gt;SetContentView(Resource.Layout.Speakers);&lt;/code&gt;. This can happen in both &lt;code&gt;ViewDidLoad/OnCreate&lt;/code&gt; and &lt;code&gt;GetCell/GetView&lt;/code&gt; where UI controls must be created and presented to the user.&lt;/li&gt;&lt;li&gt;The 'touch event handler' is in a different class: in MonoTouch the &lt;code&gt;TableViewSource&lt;/code&gt; handles a touch for a specific row (&lt;code&gt;NSIndexPath&lt;/code&gt;); MonoDroid implements the &lt;code&gt;ItemClick EventHandler&amp;lt;ItemEventArgs&amp;gt;&lt;/code&gt; on the &lt;code&gt;ListView&lt;/code&gt; for a given &lt;code&gt;GetRow(e.Position)&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Both examples use the constructor (&lt;code&gt;TableViewSource/SpeakersAdapter&lt;/code&gt;) of the 'broker' class to pass the actual business object collection for display. This pattern lets the data be filtered/sorted/whatever before being passed in for display.&lt;/li&gt;&lt;li&gt;Calling &lt;code&gt;refreshSpeakers()&lt;/code&gt; from &lt;code&gt;ViewDidLoad/OnResume&lt;/code&gt; is kinda redundant in this example since the list never changes - but in other spots (eg the Favorites screen) you &lt;i&gt;would&lt;/i&gt; want to refresh the list each time because it may have changed.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;The Code&lt;/b&gt;&lt;br /&gt;You can have a look at the MonoTouch code &lt;a href="https://github.com/conceptdev/Monospace11/blob/master/iOS/TabSpeakers/SpeakersViewController.cs" target="20110713"&gt;SpeakersViewController.cs&lt;/a&gt; and the MonoDroid &lt;a href="https://github.com/conceptdev/Monospace11/blob/master/Android/Activities/SpeakersActivity.cs" target="20110713"&gt;SpeakersActivity.cs&lt;/a&gt;, &lt;a href="https://github.com/conceptdev/Monospace11/blob/master/Android/Adapters/SpeakersAdapter.cs" target="20110713"&gt;SpeakersAdapter.cs&lt;/a&gt; to see the actual implementation. For MonoDroid you'll also need to check out the layout XML files &lt;a href="https://github.com/conceptdev/Monospace11/blob/master/Android/Resources/Layout/Speakers.axml" target="20110713"&gt;Speakers.axml&lt;/a&gt; and &lt;a href="https://github.com/conceptdev/Monospace11/blob/master/Android/Resources/Layout/SpeakersItem.axml" target="20110713"&gt;SpeakersItem.axml&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;One more thing...&lt;/b&gt;&lt;br /&gt;One final piece which takes some getting used to... in &lt;b&gt;MonoTouch&lt;/b&gt; this screen is part of a &lt;code&gt;UINavigationController&lt;/code&gt; stack and your &lt;code&gt;RowSelected&lt;/code&gt; creates a new ViewController object (passing whatever parameters you need) and calls &lt;code&gt;NavigationController.PushViewController()&lt;/code&gt;. The ViewController instances in the navigation stack are 'stateful' and it is really easy to pass business objects around as parameters.&lt;br /&gt;In &lt;b&gt;MonoDroid&lt;/b&gt;, the ever-present 'back-stack' does not require a specific 'navigation controller' BUT at it's simplest the mechanism is much more primative and involves passing simple type parameters (eg. strings) like this&lt;br /&gt;&lt;code&gt;var intent = new Intent();&lt;br /&gt;intent.SetClass(this, typeof(SpeakerActivity));&lt;br /&gt;intent.PutExtra("Name", speaker.Name);&lt;br /&gt;StartActivity(intent);&lt;/code&gt;&lt;br /&gt;There &lt;i&gt;are&lt;/i&gt; more sophisticated approaches but it is probably best to keep your parameter-passing to a minimum - this way the Android hardware 'Back' button "just works".&lt;br /&gt;&lt;br /&gt;HTH Slava ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-2042408961461391838?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/2042408961461391838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2011/07/mosetta-stone-ii-viewcontroller.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/2042408961461391838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/2042408961461391838'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2011/07/mosetta-stone-ii-viewcontroller.html' title='&quot;M&quot;osetta Stone II: ViewController &amp;rarr; Activity'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-UpVWZ0Dm_cg/Th2BRoYoFUI/AAAAAAAABU0/E6FA-wGY-AY/s72-c/Speakers.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-438015931327453223</id><published>2011-07-11T22:24:00.001+10:00</published><updated>2011-07-11T22:35:17.272+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monospace'/><category scheme='http://www.blogger.com/atom/ns#' term='monodroid'/><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='mono'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>MonoDroid v MonoTouch : a comparison</title><content type='html'>The past few days I've posted &lt;a href="http://conceptdev.blogspot.com/2011/07/monodroid-for-monospace.html" target="20110711"&gt;MonoDroid&lt;/a&gt; and &lt;a href="http://conceptdev.blogspot.com/2011/07/monotouch-for-monospace-ii.html" target="20110711"&gt;MonoTouch&lt;/a&gt; apps for &lt;a href="http://monospace.us" target="20110711"&gt;Monospace&lt;/a&gt; - and while they aren't perfect examples of the sort of code-sharing and efficiency that's possible with Mono I thought it would be interesting to compare them as the functionality they offer is very similar.&lt;br /&gt;&lt;br /&gt;First, these are the high-level code metrics (as calculated by Visual Studio):&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-1FVS5cEWr7Q/ThrVC6fkmDI/AAAAAAAABUc/vS-53Z1Ifug/s1600/ALL.png" imageanchor="1" style="margin-left:1em; margin-right:1em" target="20110711"&gt;&lt;img border="0" height="163" width="400" src="http://4.bp.blogspot.com/-1FVS5cEWr7Q/ThrVC6fkmDI/AAAAAAAABUc/vS-53Z1Ifug/s400/ALL.png" /&gt;&lt;/a&gt;&lt;/div&gt;Unfortunately I didn't align the namespaces very well. Here's the explanation:&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;Total lines of code (TLOC)&lt;/b&gt;&lt;br /&gt;Mono-for-Android: &lt;b&gt;802 lines&lt;/b&gt;&lt;br /&gt;MonoTouch: &lt;b&gt;1,420 lines&lt;/b&gt; (2,033 - 613 in SQLite)&lt;br /&gt;At first glance, the MonoDroid app 'wins' with just half the code of the MonoTouch version. I've ignored the SQLite library and the MonoTouch.Dialog framework as they aren't "user code", and any non-.cs files (eg XML markup).&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;Common code&lt;/b&gt;&lt;br /&gt;Although difficult to 'see' because I've rushed these codebases into the public domain, there is a bit of 'code re-use' in these apps (ie. it was only written once, and the c# shared across both platforms using the power of Mono :)&lt;br /&gt;&lt;b&gt;ConfXml&lt;/b&gt; == &lt;b&gt;MIX10Xml&lt;/b&gt; == approx 200 lines of business objects (DTOs mainly) that match the serialized &lt;code&gt;conf.xml&lt;/code&gt; format that is the shared data structure for both platforms.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-X2uuKBy8HnE/ThrZqOxQcQI/AAAAAAAABUk/nxMjLwnfvP4/s1600/Shared1.png" imageanchor="1" style="margin-left:1em; margin-right:1em" target="20110711"&gt;&lt;img border="0" height="124" width="200" src="http://1.bp.blogspot.com/-X2uuKBy8HnE/ThrZqOxQcQI/AAAAAAAABUk/nxMjLwnfvP4/s200/Shared1.png" /&gt;&lt;/a&gt;&lt;/div&gt;The &lt;code&gt;ConceptDevelopment.Kelvin&lt;/code&gt; code is also shared (different sizes in each aren't relevant for now).&lt;br /&gt;&lt;br /&gt;Removing the common code from the comparison results in these totals:&lt;br /&gt;Mono-for-Android: &lt;b&gt;575 lines&lt;/b&gt; (802-199-28)&lt;br /&gt;MonoTouch: &lt;b&gt;1,145 lines&lt;/b&gt; (1,420-178-97)&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;"Re-used" code&lt;/b&gt;&lt;br /&gt;Mono-for-Android's &lt;code&gt;Main.cs::DeserializeConferenceFile, LoadWhatsOn&lt;/code&gt; and MonoTouch's &lt;code&gt;AppDelegate.cs::FinishedLaunching&lt;/code&gt; both contain "very similar" code in the form of the &lt;code&gt;conf.xml&lt;/code&gt; deserializer and parser. In MonoTouch it's 70 lines and in MonoDroid it's 307 lines. The MonoTouch version is heavily assisted by the Linq/MonoTouch.Dialog code in &lt;code&gt;HomeController&lt;/code&gt; (another 150 lines or so) which explains part of the difference... but what is &lt;i&gt;shared&lt;/i&gt; is the deserialization logic and a number of Linq statements that help parse it for display. These would be harded to shift into a common library due to the dependency on MonoTouch.Dialog - but there was definitely an efficiency gain by having the code already written and tested on one platform before porting to the other. I'll adjust both by the same 'average' LOC count to try and reflect the 'copy/paste but modify' efficiency gain.&lt;br /&gt;&lt;br /&gt;Mono-for-Android: &lt;b&gt;375 lines&lt;/b&gt; (575-200)&lt;br /&gt;MonoTouch: &lt;b&gt;945 lines&lt;/b&gt; (1,145-200)&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;Feature parity&lt;/b&gt;&lt;br /&gt;Adjust the MonoTouch solution to allow for the fact that it implements the Map feature that is not available on MonoDroid - 118 lines of code across a few classes.&lt;br /&gt;MonoTouch: &lt;b&gt;827 lines&lt;/b&gt; (945-118)&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;What's left?&lt;/b&gt;&lt;br /&gt;Once we've removed the libraries, the shared data structure, common code and allowed for some "copy/paste re-use", what's left to differentiate the two codebases? Basically just the UI and the code that binds our DTOs to it.&lt;br /&gt;&lt;table cellspacing="0" border="1" cellpadding="2"&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Mono-for-Android&lt;/th&gt;&lt;th&gt;MonoTouch (iOS)&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Code&lt;/td&gt;&lt;td&gt;375 lines&lt;/td&gt;&lt;td&gt;827 lines&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;'markup'&lt;/td&gt;&lt;td&gt;14 AXML&lt;/td&gt;&lt;td&gt;1 XIB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Views&lt;/td&gt;&lt;td&gt;7 Activities&lt;/td&gt;&lt;td&gt;9 ViewControllers&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DataSources&lt;/td&gt;&lt;td&gt;6 Adapters&lt;/td&gt;&lt;td&gt;5 TableViewSource&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;Some notes on the difference:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;There are 350 lines of AXML to define the layouts used in MonoDroid - the equivalent task in MonoTouch is done mostly in C#, significantly contributing to the LOC difference. I &lt;i&gt;could&lt;/i&gt; have implemented a lot of that MonoTouch layout in XIBs using InterfaceBuilder - I just don't like doing it that way.&lt;/li&gt;&lt;li&gt;The &lt;code&gt;UITabBarController&lt;/code&gt; takes more code to setup than &lt;br /&gt;&lt;code&gt;OnCreateOptionsMenu&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;The iOS &lt;code&gt;SQLite&lt;/code&gt; implementation of saving Favorites is more verbose than the XML-serialized-file solution used on Android.&lt;/li&gt;&lt;li&gt;The MonoTouch source is almost 2 years old, and in some places isn't as succinct as it could be.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;Conclusion&lt;/b&gt;&lt;br /&gt;So is MonoTouch instrinsically more verbose than MonoDroid? I don't think so - it depends greatly on your preference for constructing your Views (XIBs or in-code). The more important question: does building with Mono* make it easier to port your app to other mobile platforms... and the answer is &lt;b&gt;YES!&lt;/b&gt; In future &lt;a href="http://github.com/conceptdev/Monospace11" target="20110711"&gt;this code&lt;/a&gt; might get tidied up into a &lt;i&gt;good&lt;/i&gt; example of a cross-platform app... in that case I'll re-examine the stats to make an even better case.&lt;br /&gt;&lt;br /&gt;Look at it this way: the iOS app took 1,400 lines of code (it was written first). For an additional 375 LOC (plus some layout XML) we got an Android port - almost for free!&lt;br /&gt;&lt;br /&gt;Thankfully it sounds like &lt;a href="http://tirania.org/blog/archive/2011/Jun-28.html" target="20110711"&gt;Xamarin Studio is coming along nicely&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-438015931327453223?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/438015931327453223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2011/07/monodroid-v-monotouch-comparison.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/438015931327453223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/438015931327453223'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2011/07/monodroid-v-monotouch-comparison.html' title='MonoDroid v MonoTouch : a comparison'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-1FVS5cEWr7Q/ThrVC6fkmDI/AAAAAAAABUc/vS-53Z1Ifug/s72-c/ALL.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-9005944580663467067</id><published>2011-07-09T20:55:00.000+10:00</published><updated>2011-07-09T20:55:16.405+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monospace'/><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='mono'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>MonoTouch for Monospace II</title><content type='html'>Further to the &lt;a href="http://conceptdev.blogspot.com/2011/07/monodroid-for-monospace.html" target="20110709"&gt;MonoDroid version&lt;/a&gt;, I've just submitted an iOS version of the &lt;a href="http://monospace.us" target="20110709"&gt;Monospace 2011&lt;/a&gt; conference app to Apple (fingers crossed it gets approved, and in time for the conference!).&lt;br /&gt;&lt;br /&gt;Here's how it looks:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-QjHAj8t9am0/Thgvg_cUMrI/AAAAAAAABUU/VkpVevkai08/s1600/ALL.png" imageanchor="1" style="margin-left:1em; margin-right:1em" target="20110709"&gt;&lt;img border="0" height="291" width="400" src="http://2.bp.blogspot.com/-QjHAj8t9am0/Thgvg_cUMrI/AAAAAAAABUU/VkpVevkai08/s400/ALL.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Even if it doesn't get approved in time, the code is open-source and can be found at &lt;a href="http://github.com/conceptdev/Monospace11" target="20110709"&gt;github.com/conceptdev/Monospace11&lt;/a&gt;. It is based on the original &lt;a href="http://conceptdev.blogspot.com/2009/10/monotouch-for-monospace.html" target="20110709"&gt;Monospace09&lt;/a&gt;, &lt;a href="http://conceptdev.blogspot.com/2009/11/another-monotouch-conference-app-pdc09.html" target="20110709"&gt;PDC09&lt;/a&gt; and &lt;a href="http://conceptdev.blogspot.com/2009/11/another-monotouch-conference-app-pdc09.html" target="20110709"&gt;MIX10&lt;/a&gt; apps. A couple of guys helped out with the MIX10 version: &lt;a href="http://twitter.com/migueldeicaza"&gt;@migueldeicaza&lt;/a&gt;, &lt;a href="http://twitter.com/geoffnorton"&gt;@kangamono&lt;/a&gt; and &lt;a href="http://twitter.com/chrisntr"&gt;@chrisntr&lt;/a&gt;. I know Miguel in particular was keen for this code to be open-sourced... I think (?) it was one of the &lt;a href="http://tirania.org/blog/archive/2010/Feb-23.html" target="20110709"&gt;first outings&lt;/a&gt; of his awesome &lt;a href="https://github.com/migueldeicaza/MonoTouch.Dialog" target="20110709"&gt;MonoTouch.Dialog&lt;/a&gt; library. I'd like to thank them again for their help (and to note that any remaining bugs or problems are mine). Also note: there is some &lt;b&gt;old&lt;/b&gt; code in there (like, almost 2 years)... it scares me a little to put it up on Github, so please, be gentle.&lt;br /&gt;&lt;br /&gt;I'll update with an AppStore link if/when Apple is done; but for now just enjoy the code :)&lt;br /&gt;&lt;br /&gt;See you at &lt;a href="http://monospace.us" target="20110709"&gt;Monospace&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-9005944580663467067?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/9005944580663467067/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2011/07/monotouch-for-monospace-ii.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/9005944580663467067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/9005944580663467067'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2011/07/monotouch-for-monospace-ii.html' title='MonoTouch for Monospace II'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-QjHAj8t9am0/Thgvg_cUMrI/AAAAAAAABUU/VkpVevkai08/s72-c/ALL.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-390637214119686866</id><published>2011-07-06T21:57:00.002+10:00</published><updated>2011-07-07T21:50:15.096+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monospace'/><category scheme='http://www.blogger.com/atom/ns#' term='monodroid'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>MonoDroid for Monospace</title><content type='html'>Waay back in 2009 I threw together &lt;a href="http://conceptdev.blogspot.com/2009/10/monotouch-for-monospace.html" target="20110706"&gt;MonoTouch for Monospace&lt;/a&gt; as an early example of using C# on the iPhone using &lt;b&gt;MonoTouch&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Fast-forward two years... to &lt;b&gt;MonoDroid for Monospace&lt;/b&gt;:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-w5MTyi_mtQA/ThRLcgyl_dI/AAAAAAAABTY/im2n5TN1UKc/s1600/ALL.png" imageanchor="1" style="margin-left:1em; margin-right:1em" target="20110706"&gt;&lt;img border="0" height="364" width="400" src="http://2.bp.blogspot.com/-w5MTyi_mtQA/ThRLcgyl_dI/AAAAAAAABTY/im2n5TN1UKc/s400/ALL.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The schedule for &lt;a href="http://monospace.us" target="20110706"&gt;Monospace 2011&lt;/a&gt; was just announced today, and since there didn't seem to be a mobile app announced along with it I've re-used some old code to get a basic Android app working using &lt;b&gt;Mono for Android&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;Download/try it out&lt;/b&gt;&lt;br /&gt;You can install &lt;a href="https://market.android.com/details?id=com.confapp.monospace11" target="2011006"&gt;&lt;b&gt;Monospace11 from the Android Market&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;OR&lt;br /&gt;&lt;br /&gt;Download the &lt;b&gt;Mono for Android&lt;/b&gt; code from &lt;a href="https://github.com/conceptdev/Monospace11" target="20110706"&gt;&lt;b&gt;Monospace11 on Github&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and visit the 'homepage' at &lt;a href="http://monospace11.confapp.com/" target="20110706"&gt;monospace11.confapp.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Leave any comments or feedback below.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-390637214119686866?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/390637214119686866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2011/07/monodroid-for-monospace.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/390637214119686866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/390637214119686866'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2011/07/monodroid-for-monospace.html' title='MonoDroid for Monospace'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-w5MTyi_mtQA/ThRLcgyl_dI/AAAAAAAABTY/im2n5TN1UKc/s72-c/ALL.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-7020001659505797071</id><published>2011-05-31T21:13:00.000+10:00</published><updated>2011-05-31T21:13:20.430+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monodroid'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>OzALT.NET MonoDroid Presentation</title><content type='html'>Slides from tonight's &lt;a href="http://sydney.ozalt.net/" target="20110531"&gt;OzALT.NET&lt;/a&gt; '20 minute' presentation on &lt;a href="http://mono-android.net/" target="20110531" alt="link may be broken"&gt;Mono-for-Android&lt;/a&gt;. I didn't actually make it through all the slides, but we got through a few demos including this simple &lt;a href="https://gist.github.com/1000314" target="20110531"&gt;HelloWorldActivity.cs&lt;/a&gt; example and the &lt;a href="https://github.com/conceptdev/RestaurantGuide/tree/master/RestGuide_Android" target="20110531"&gt;Restaurant Guide demo&lt;/a&gt;.&lt;br /&gt;&lt;div style="width:425px" id="__ss_8159715"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/conceptdev/ozaltnet-fastandroidfurious" title="OzAltNet Fast-ANDroid-Furious"&gt;OzAltNet Fast-ANDroid-Furious&lt;/a&gt;&lt;/strong&gt; &lt;iframe src="http://www.slideshare.net/slideshow/embed_code/8159715" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;Also enjoyed &lt;a href="http://twitter.com/thomasjo" target="20110531"&gt;@thomasjo&lt;/a&gt;'s pres on &lt;a href="http://jashkenas.github.com/coffee-script/" target="20110531"&gt;CoffeeScript&lt;/a&gt; and Joshua Roth talking about &lt;a href="http://nbuilder.org/" target="20110531"&gt;NBuilder&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-7020001659505797071?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/7020001659505797071/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2011/05/ozaltnet-monodroid-presentation.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/7020001659505797071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/7020001659505797071'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2011/05/ozaltnet-monodroid-presentation.html' title='OzALT.NET MonoDroid Presentation'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-3198737407279835993</id><published>2011-05-28T14:17:00.003+10:00</published><updated>2011-05-30T08:55:05.279+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monodroid'/><category scheme='http://www.blogger.com/atom/ns#' term='xamarin'/><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><title type='text'>Mobile UI Design ramblings...</title><content type='html'>Mobile UI design has come up a couple of times the past few days (as has &lt;a href="#xamarin"&gt;Xamarin&lt;/a&gt;),&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I'm looking to port an existing iOS app to Android - how 'same' should it look?&lt;/li&gt;&lt;li&gt;Nielsen Norman Group released their latest &lt;i&gt;Useability of iPad Apps and Websites&lt;/i&gt; report&lt;/li&gt;&lt;li&gt;Ongoing discussion with &lt;a href="http://twitter.com/russaus" target="20110528"&gt;@russaus&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;...so seemed like a good time to make some notes (and for UI, read UX and IA as well :)&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;Porting apps...&lt;/b&gt;&lt;br /&gt;Porting apps from one platform to another (iPhone to Android, iPad to Android, or to Windows Phone, or from 'web', etc) always brings with it a challenge to make each version feel 'native' and embrace the platform's UI idioms &amp; metaphors (while simultaneously re-using as much code as possible and keeping your application consistent across each). This can be seen in previous posts on the &lt;a href="http://conceptdev.blogspot.com/2011/04/mix11-mobile-app-collection.html" target="20110528"&gt;MIX11 app&lt;/a&gt; and the &lt;a href="http://conceptdev.blogspot.com/2011/03/monodroid-meet-monotouch-windowsphone7.html" target="20110529"&gt;Restaurant Guide sample&lt;/a&gt; being ported to iPhone, Android and Windows Phone 7. Should the new Android app be a 'UI clone' of the iOS version? Should it be redesigned from scratch, removing any traces of iOS-ness? The answer is probably somewhere in between, being guided by your usability and branding goals, and by feedback from your users.&lt;br /&gt;&lt;b&gt;UPDATE:&lt;/b&gt; some thoughts on &lt;a href="http://t.co/KTBTbv0"&gt;Why Are Android Apps Ugly?&lt;/a&gt; :-)&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;"Usability of iPad Apps and Websites": 2 reports&lt;/b&gt;&lt;br /&gt;Coincidentally, while planning the UI for the Android app, &lt;a href="http://www.nngroup.com" target="20110529"&gt;Nielson Norman Group&lt;/a&gt; released an updated &lt;a href="http://www.nngroup.com/reports/mobile/ipad/" target="20110529"&gt;Usability Report for iPad Apps and Websites&lt;/a&gt;. The new edition (and the previous) are great reads (free to download) - some points will seem obvious, some will trigger "a-ha" moments and other's you'll disagree with; but overall you'll probably find it worthwhile to download them both.&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;References...&lt;/b&gt;&lt;br /&gt;There are a couple of great websites worth looking at when you are doing UI design&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://mobile-patterns.com/" target="20110529"&gt;mobile-patterns.com&lt;/a&gt; is a cool collection of screenshots from iPhone apps grouped into 'UX categories' like &lt;i&gt;User Profiles&lt;/i&gt; and &lt;i&gt;Lists&lt;/i&gt;. My favorite is &lt;i&gt;Empty Data Sets&lt;/i&gt; - so often overlooked! (by &lt;a href="http://twitter.com/mari18"&gt;@mari18&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;a href="http://ui-patterns.com/" target="20110529"&gt;ui-patterns.com&lt;/a&gt; is a more general collection (ie. not mobile) with categories like &lt;i&gt;Getting Input&lt;/i&gt; and &lt;i&gt;Navigation&lt;/i&gt;. It is a LOT deeper in terms of content (articles/discussion as well as screenshots) and likely to be thought-provoking no matter what platform you're working on. (follow &lt;a href="http://twitter.com/uipatternscom" target="20110529"&gt;@uipatternscom&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;UPDATE:&lt;/b&gt; &lt;a href="http://nordkapp.fi/blog/2011/05/wp7-for-designers-cheatsheet/"&gt;Windows Phone 7 for Designers — Cheat Sheet&lt;/a&gt; kinda similar to the mobile-patterns site above but for Windows Phone. Poster-layout for easy printing/reference (by &lt;a href="http://twitter.com/teppo"&gt;@teppo&lt;/a&gt;).&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;...and what about that whole MonoTouch/MonoDroid 'thing'?&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.novell.com/prblogs/?p=3793" target="20110529" name="xamarin"&gt;Novell (Attachmate) says&lt;/a&gt; (my underline)&lt;blockquote&gt;Focusing on what matters most to customers is the key to our innovation strategy and will drive the growth of our business.  This has meant reductions in certain areas, such as Mono.  However, Mono remains part of the SUSE business and should customer demand for Mono products accelerate, our development efforts will rapidly respond.  Regardless, &lt;u&gt;we will continue to provide maintenance and support for all Mono products – MonoTouch, Mono for Android,&lt;/u&gt; Mono Tools for Visual Studio and SUSE Linux Enterprise Mono Extension.&lt;/blockquote&gt;But it sounds disingenuous considering they have already sacked the entire team... and WTF does "should...demand...accelerate" mean? How is demand going to grow when they've killed any chance of enhancing the product and do not market it?? If they were truly "Focusing on what matters most to customers" they wouldn't have sacked the engineers in the first place, or else should have released/sold/transferred the Touch/Droid IP to &lt;a href="http://xamarin.com" target="20110529"&gt;Xamarin&lt;/a&gt; where it has some hope of a future (IMHO, anyway). &amp;lt;/2centsworth&amp;gt;&lt;br /&gt;&lt;br /&gt;Also, in related news, &lt;a href="http://twitter.com/migueldeicaza"&gt;@migueldeicaza&lt;/a&gt; announced that &lt;a href="http://twitter.com/natfriedman"&gt;Nat Friedman&lt;/a&gt; has &lt;a href="http://tirania.org/blog/archive/2011/May-25.html"&gt;joined Xamarin as CEO&lt;/a&gt;. Nat previously worked with Miguel as a co-founder of Ximian.&lt;br /&gt;&lt;br /&gt;p.s. I'm *guessing* that we will be saying goodbye to the &lt;b&gt;MonoTouch&lt;/b&gt; and &lt;b&gt;Mono for Android&lt;/b&gt; product names since Novell probably owns them... wondering what I should use for Twitter hashtags now to replace #monotouch and #monodroid? Something with an 'X'? :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-3198737407279835993?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/3198737407279835993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2011/05/mobile-ui-design.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/3198737407279835993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/3198737407279835993'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2011/05/mobile-ui-design.html' title='Mobile UI Design ramblings...'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-2850597369742258773</id><published>2011-05-17T22:46:00.000+10:00</published><updated>2011-05-17T22:46:33.335+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monodroid'/><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='mono'/><title type='text'>MonoTouch/MonoDroid and Xamarin - what now?</title><content type='html'>If you are in the &lt;a href="http://www.mono-project.com" target="20110518"&gt;mono&lt;/a&gt; community then you'd have to be living under a rock not to have read that &lt;a href="http://news.cnet.com/8301-30685_3-20023535-264.html" target="20110517"&gt;Novell was purchased by Attachmate&lt;/a&gt; then (first) heard the rumors that &lt;a href="http://www.osnews.com/story/24693/Attachmate_Lets_US_Mono_Developers_Go" target="20110517"&gt;Attachmate Lets US Mono Developers Go&lt;/a&gt; and (second) seen Miguel's &lt;a href="http://tirania.org/blog/archive/2011/May-16.html" target="20110517"&gt;confirmation/announcement&lt;/a&gt; of the creation of &lt;a href="http://www.xamarin.com/" target="20110517"&gt;&lt;b&gt;Xamarin&lt;/b&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;What I &lt;i&gt;think&lt;/i&gt; this means is:&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.mono-project.com" target="20110518"&gt;Mono&lt;/a&gt; should be fine. It has always been open-source (see &lt;a href="https://github.com/mono" target="20110518"&gt;github.com/mono&lt;/a&gt;) and receives contributions from a variety or people regardless of who they work for.&lt;/li&gt;&lt;li&gt;The &lt;a href="http://monotouch.net" target="20110517"&gt;MonoTouch&lt;/a&gt; and &lt;a href="http://mono-android.net" target="20110517"&gt;Mono for Android (aka MonoDroid)&lt;/a&gt; products published by Novell will effectively stop being supported "as of now". This is based on the fact that none of the devs work there any more.&lt;/li&gt;&lt;li&gt;Attachmate hasn't announced any plans for those products - even whether they'll continue to be available for sale (along with the associated activation servers). It's impossible to predict what will happen here... various people are trying to get answers from Novell/Attachmate. Personally, even if Attachmate attempted to continue selling/supporting the products I would choose not to be their customer as soon as alternatives are available.&lt;/li&gt;&lt;li&gt;Miguel and the team who built MonoTouch and MonoDroid have publicly announced they're working on comparable/compatible products to be sold by Xamarin (their new company). These new products are 3-4 months away, betas first prior to a real release. They've done it before, they can do it again!&lt;/li&gt;&lt;/ul&gt;Lots of people (myself included) have invested plenty of time and money purchasing, learning and using MonoTouch and MonoDroid. I even helped &lt;a href="http://amzn.to/dDtg5r" target="20110517"&gt;write a MonoTouch book&lt;/a&gt; (and some guys have been busy with a &lt;a href="http://www.amazon.com/Professional-Android-Programming-Mono-NET/dp/1118026438/" target="20110517"&gt;MonoDroid&lt;/a&gt; one too). We are all collectively upset, disappointed and angry (imagine how the devs themselves feel).&lt;br /&gt;&lt;br /&gt;All of this uncertainty has provoked a number of reactions, among them suggestions that all the work done on MonoTouch/MonoDroid projects to-date has been wasted or that people should start learning the native SDKs for iOS and Android instead of committing to the Mono alternatives.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-H0Fyxf7FTUI/TdJT4vKZNrI/AAAAAAAABSY/gawqJY6CpLc/s1600/dontpanic.jpg" imageanchor="1" alt="Don't panic" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="271" width="320" src="http://4.bp.blogspot.com/-H0Fyxf7FTUI/TdJT4vKZNrI/AAAAAAAABSY/gawqJY6CpLc/s320/dontpanic.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Learning the native SDKs has &lt;i&gt;always&lt;/i&gt; been an option for anyone interested in mobile dev, but who wants to go to all that effort!? The value proposition for Mono* remains: .NET developers can leverage their existing language and framework knowledge AND code can be written once and re-used across three platforms (iOS, Android and Windows Phone). Those advantages continue to be true - the two products are definitely useable right now (MonoTouch obviously more mature than MonoDroid) - and if you care to take Miguel at his word they have a 'compatible' future. So what to do in the next 3 or 4 months...&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;I already have a MonoTouch/MonoDroid app written and published (or almost published)&lt;/b&gt;&lt;br /&gt;Keep going! If everything is working for you right now, why change? In future you "might" need to port your work to native IF Xamarin's products are late/don't work. But if you start porting now and spend three months doing the conversion and Xamarin succeeds then you'll have wasted a lot of effort! What's more, your existing codebase will form an excellent 'regression test' for the Xamarin previews/betas... make sure you sign up at &lt;a href="http://www.xamarin.com/" target="20110517"&gt;xamarin.com&lt;/a&gt; and participate! Your knowledge and experience with the existing products will be very helpful testing the new bits.&lt;br /&gt;&lt;br /&gt;If you are &lt;i&gt;really&lt;/i&gt; pessimistic you can still continue on this path - but maybe allocate some of your dev time learning the native SDKs and possibly prototype/porting some of your code. Don't do all of it - just get comfortable with the fact that it's &lt;i&gt;possible&lt;/i&gt; while waiting to see how Xamarin develops. &lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;I have purchased MonoTouch/MonoDroid and was planning to use them in future&lt;/b&gt;&lt;br /&gt;Why not give them a try anyway? There are multiple benefits of using Mono*, including learning the native SDK APIs from the comfort of a language you know and also being productive more quickly. Think of it like prototyping - you get something working quickly and along the way learn a lot that can be re-used (you WILL &lt;a href="http://conceptdev.blogspot.com/2011/03/mosetta-stone.html" target="20110517"&gt;learn the iOS/Android APIs&lt;/a&gt;). &lt;br /&gt;&lt;br /&gt;If your app is single-platform I can imagine this decision might be a close call (and perhaps you should just learn Objective-C or Java) BUT if you are planning a cross-platform solution then you are still going to save time and effort with Mono* and code-sharing. One obvious risk would be the possibility of hitting something that isn't supported/doesn't work in Mono* yet - so do your research.&lt;br /&gt;&lt;br /&gt;On the other hand, imagine spending the next few months learning BOTH Objective-C and Java, and producing two incompatible codebases for your app, only to discover that Xamarin rocks!&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;I'm a consultant and I've recommended MonoTouch/MonoDroid to clients&lt;/b&gt;&lt;br /&gt;Ouch. This is bound to 'look bad' since the less your clients understand about the risk/reward of a tool like Mono*, the more they are going think you've stuffed up. In reality, though, the above points still apply - you can offer them the same bet: switch tools now and potentially waste some time or risk 'maybe' porting at a later time but take advantage of the benefits Mono* provides now... after all you recommended Mono* for a &lt;i&gt;reason&lt;/i&gt; and many of those reasons are still valid.&lt;br /&gt;&lt;br /&gt;I have done this myself - so I know how uncomfortable it feels.&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;I am interested in MonoTouch or MonoDroid but haven't purchased yet&lt;/b&gt;&lt;br /&gt;This is a tough one. I'm not sure that the Novell Shopping Cart or the Activation Server are even working at the moment (activation behind an authenticating proxy is not supported at all). Even if they were, I'm not sure I'd want to give Attachmate my money. Maybe this will become clearer in the coming days/weeks.&lt;br /&gt;You can definitely try out the 'free trial' (emulator only) editions but for a real project that you want to publish on AppStore/Marketplace soon I'm afraid you might need to consider learning the native SDKs or waiting a while... :-(&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;In conclusion...&lt;/b&gt;&lt;br /&gt;I'll be the first to admit this is a very "glass half-full" point-of-view. Lots of bad s**t could happen: support issues with the current products that can't be resolved, legal issues with Attachmate, product delays from Xamarin, unexpected costs or incompatibilities for the new stuff, etc, etc, etc. &lt;br /&gt;&lt;br /&gt;At the end of the day, you'll make a decision based on your risk-averse-ness (triple word score!) regardless of my rainbows and unicorns. Just keep in mind that the apparent 'end of life' of the current MonoTouch/MonoDroid products, while sad, is not (yet) the end of the world. In some ways, you can best support Xamarin by &lt;i&gt;continuing&lt;/i&gt; to use the existing tools so that you've got something to migrate to their new stuff.&lt;br /&gt;&lt;br /&gt;Make sure you've got some peanuts and a towel, and above all DON'T PANIC.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-2850597369742258773?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/2850597369742258773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2011/05/monotouchmonodroid-and-xamarin-what-now.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/2850597369742258773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/2850597369742258773'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2011/05/monotouchmonodroid-and-xamarin-what-now.html' title='MonoTouch/MonoDroid and Xamarin - what now?'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-H0Fyxf7FTUI/TdJT4vKZNrI/AAAAAAAABSY/gawqJY6CpLc/s72-c/dontpanic.jpg' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-3208342349389328819</id><published>2011-05-07T20:56:00.000+10:00</published><updated>2011-05-07T20:56:55.487+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monodroid'/><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='mono'/><title type='text'>Mobile Camp Oz</title><content type='html'>Went along to &lt;a href="http://mobilecampoz.com/" target="_blank"&gt;Mobile Camp Oz&lt;/a&gt; today, saw some great presentations from &lt;a href="http://twitter.com/dglover" target="_blank"&gt;@dglover&lt;/a&gt;, &lt;a href="http://tincandev.com/" target="_blank"&gt;Scott Vandonkelaar&lt;/a&gt; and &lt;a href="http://twitter.com/markaufflick" target="_blank"&gt;@markaufflick&lt;/a&gt; as well as an interesting keynote by &lt;a href="http://twitter.com/amstrad" target="_blank"&gt;Darren Burden&lt;/a&gt; of Fairfax Media. Thanks to the speakers for their time and also to everyone that came along to watch (finally special thanks to &lt;a href="http://twitter.com/BTRoam" target="_blank"&gt;Nick&lt;/a&gt; for organising and convincing me to come along!).&lt;br /&gt;&lt;br /&gt;As for my pres, here are the slides:&lt;br /&gt;&lt;div style="width:425px" id="__ss_7872495"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/conceptdev/crossplatform-mobile-dev-with-mono" title="Cross-platform mobile dev with Mono"&gt;Cross-platform mobile dev with Mono&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse7872495" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=monocampoz-110507052200-phpapp02&amp;stripped_title=crossplatform-mobile-dev-with-mono&amp;userName=conceptdev" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse7872495" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=monocampoz-110507052200-phpapp02&amp;stripped_title=crossplatform-mobile-dev-with-mono&amp;userName=conceptdev" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;and you'll find example source at &lt;a href="http://github.com/conceptdev" target="_blank"&gt;github.com/conceptdev&lt;/a&gt;. The pres was a bit slide-heavy... will do more live-code/examples next time.&lt;br /&gt;&lt;br /&gt;Also check out these past posts:&lt;ul&gt;&lt;li&gt;&lt;a href="http://conceptdev.blogspot.com/2011/03/mosetta-stone.html" target="_blank"&gt;Mosetta Stone&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://conceptdev.blogspot.com/2011/03/monodroid-meet-monotouch-windowsphone7.html" target="_blank"&gt;MonoDroid meet MonoTouch &amp; WindowsPhone7&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Finally - check out the result of Scott's presentation on the Android Market &lt;a href="https://market.android.com/details?id=com.mobilecampoz" target="_blank"&gt;Mobile Camp Oz&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-3208342349389328819?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/3208342349389328819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2011/05/mobile-camp-oz.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/3208342349389328819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/3208342349389328819'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2011/05/mobile-camp-oz.html' title='Mobile Camp Oz'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-5156154915430485820</id><published>2011-04-11T20:42:00.012+10:00</published><updated>2011-04-11T20:52:36.035+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='winphone7'/><category scheme='http://www.blogger.com/atom/ns#' term='monodroid'/><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><title type='text'>MIX11... the mobile app collection</title><content type='html'>It's that time of year again - &lt;a href="http://live.visitmix.com/" target="_blank"&gt;MIX11&lt;/a&gt; conference time - and although last year there was just one mobile app (&lt;a href="http://mix10.confapp.com/" target="_blank"&gt;MIX10 for iPhone&lt;/a&gt;), this year conference delegates are spoilt for choice!&lt;br /&gt;&lt;br /&gt;This year there are &lt;a href="http://confapp.com/" target="_blank"&gt;Conf&lt;/a&gt;-powered apps on the three biggest mobile platforms: iPhone, Windows Phone 7 and Android...&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-uhBwX73I0gw/TaLYGkjwOUI/AAAAAAAABSQ/R_Or1cSpEo0/s1600/ALL2.png" imageanchor="1"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/-uhBwX73I0gw/TaLYGkjwOUI/AAAAAAAABSQ/R_Or1cSpEo0/s400/ALL2.png" width="345" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;All are pure .NET projects - the Windows Phone 7 app uses the Microsoft Windows Phone SDK while the iOS and Android versions are bought to you via power of &lt;a href="http://mono-project.com/" target="_blank"&gt;Mono&lt;/a&gt;: &lt;a href="http://monotouch.net/" target="_blank"&gt;MonoTouch&lt;/a&gt; and &lt;a href="http://mono-android.net/" target="_blank"&gt;Mono for Android&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The official 'site' for these apps is &lt;a href="http://mix11.confapp.com" target="_blank"&gt;&lt;b&gt;mix11.confapp.com&lt;/b&gt;&lt;/a&gt; - it also lists a couple of 'other' options for Windows Phone users. &lt;a href="http://mix11.confapp.com" target="_blank"&gt;Download&lt;/a&gt; one or all of them - and have a great time at MIX!&lt;br /&gt;&lt;br /&gt;Aside: for those working on cross-mobile-platform UI, the primary navigation mechanism is quite different across the three platforms (my thoughts):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;iOS&lt;/b&gt; uses a 'tab bar', familiar to all users as it features in most iOS apps. The benefits are that it's always visible and the icon appearance is consistent and attractive. Only five options fit before they get hidden behind a 'More...' link.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Windows Phone 7&lt;/b&gt; uses the 'panorama' control. While it encourages discovery by panning across pages, not all options are immediately obvious to the user. Microsoft suggests a maximum of seven pages, so beyond that limit you need to think of other navigation paths.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Android&lt;/b&gt; uses the operating-system provided 'hardware menu'; it is not visible until the user presses the button however it can then display a number of options at once (similar to iOS). Because it can be context-sensitive the user doesn't really know what options to expect until they press the button (although the MIX11 app uses a consistent menu from all pages to get around this confusion).&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-5156154915430485820?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/5156154915430485820/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2011/04/mix11-mobile-app-collection.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/5156154915430485820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/5156154915430485820'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2011/04/mix11-mobile-app-collection.html' title='MIX11... the mobile app collection'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-uhBwX73I0gw/TaLYGkjwOUI/AAAAAAAABSQ/R_Or1cSpEo0/s72-c/ALL2.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-8744838871687147571</id><published>2011-03-06T13:12:00.002+11:00</published><updated>2011-07-13T19:40:51.972+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='winphone7'/><category scheme='http://www.blogger.com/atom/ns#' term='monodroid'/><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><title type='text'>"M"osetta Stone</title><content type='html'>Some more thoughts on cross-platform mobile development (&lt;a href="http://monotouch.net" target="20110306"&gt;MonoTouch&lt;/a&gt;, &lt;a href="http://monodroid.net" target="20110306"&gt;MonoDroid&lt;/a&gt; and &lt;a href="http://create.msdn.com" target="20110306"&gt;Windows Phone 7&lt;/a&gt;) from &lt;a href="http://conceptdev.blogspot.com/2011/03/monodroid-meet-monotouch-windowsphone7.html" target="20110306"&gt;yesterday's post&lt;/a&gt; - a 'rosetta stone' (not &lt;a href="http://tirania.org/tmp/rosetta.html" target="20110306"&gt;this one&lt;/a&gt;) to translate between the three platforms (Not that each of these things is exactly equivalent - they're matched up where the concept/role/function seems similar to me).&lt;br /&gt;&lt;table border='1' cellspacing='0'&gt;&lt;tr&gt;&lt;th width='80'&gt;&lt;/th&gt;&lt;th&gt;&lt;b style='color:darkred'&gt;iOS&lt;/b&gt;&lt;/th&gt;&lt;th&gt;&lt;b style='color:darkred'&gt;WP7&lt;/b&gt;&lt;/th&gt;&lt;th&gt;&lt;b style='color:darkred'&gt;Android&lt;/b&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;"View"&lt;/b&gt;&lt;/td&gt;&lt;td&gt;XIB (Interface Builder)&lt;/td&gt;&lt;td&gt;Xaml&lt;/td&gt;&lt;td&gt;axml&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;&lt;/b&gt;&lt;/td&gt;&lt;td&gt;UIViewController&lt;/td&gt;&lt;td&gt;PhoneApplicationPage (codebehind)&lt;/td&gt;&lt;td&gt;Activity&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;n/a (UIAutoResizing)&lt;/td&gt;&lt;td&gt;StackPanel&lt;/td&gt;&lt;td&gt;LinearLayout&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;UITableView&lt;/td&gt;&lt;td&gt;ListBox&lt;/td&gt;&lt;td&gt;ListView&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;UITableViewCell&lt;/td&gt;&lt;td&gt;ListBox.ItemTemplate&lt;/td&gt;&lt;td&gt;n/a (any view)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;UITableViewSource&lt;/td&gt;&lt;td&gt;n/a (binding, IEnumerable)&lt;/td&gt;&lt;td&gt;BaseAdapter&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Navigation "Controller"&lt;/b&gt;&lt;/td&gt;&lt;td&gt;NavigationController. PushViewController()&lt;/td&gt;&lt;td&gt;NavigationService.&lt;br /&gt;Navigate()&lt;/td&gt;&lt;td&gt;StartActivity()&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;n/a (object)&lt;/td&gt;&lt;td&gt;Xaml Uri&lt;/td&gt;&lt;td&gt;Intent.SetClass()&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;n/a (object properties)&lt;/td&gt;&lt;td&gt;Xaml Uri querystring params&lt;/td&gt;&lt;td&gt;Intent.PutExtra() .AddFlags()&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;n/a (object properties)&lt;/td&gt;&lt;td&gt;NavigationContext&lt;br /&gt;.QueryString&lt;br /&gt;.TryGetValue()&lt;/td&gt;&lt;td&gt;Intent .GetXXXExtra()&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Threading&lt;/b&gt;&lt;/td&gt;&lt;td&gt;InvokeOnMainThread&lt;/td&gt;&lt;td&gt;Dispatcher.BeginInvoke&lt;/td&gt;&lt;td&gt;RunOnUiThread&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;"Model"&lt;/b&gt;&lt;/td&gt;&lt;td colspan='3'&gt;C# .NET objects - shared thanks to Mono on &lt;a href="http://monotouch.net" target="20110306"&gt;iOS&lt;/a&gt; &amp;amp; &lt;a href="http://monodroid.net" target="20110306"&gt;Android&lt;/a&gt;. Also &lt;code&gt;WebClient&lt;/code&gt;, &lt;code&gt;Linq&lt;/code&gt;, &lt;code&gt;Generics&lt;/code&gt;, &lt;code&gt;Xml&lt;/code&gt;, &lt;code&gt;Serialization&lt;/code&gt;, etc... :-)&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;One major difference between iOS and the other two (both in terms of coding and also UI design) is the presence of hardware buttons and the &lt;b&gt;back-stack&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;Hardware buttons&lt;/b&gt;&lt;br /&gt;The most important hardware button is &lt;i&gt;Back&lt;/i&gt; (covered next) however Android's &lt;i&gt;Menu&lt;/i&gt; button is also significant for the impact is has on UI design compared to iOS and WP7. Both Apple and Microsoft's designers like the application menu (&lt;code&gt;UITabBarController&lt;/code&gt;, &lt;code&gt;ApplicationBar&lt;/code&gt;) to be permanently visible. Google, on the other hand, provides the &lt;i&gt;Menu&lt;/i&gt; button to show the menu, meaning that most of the time it is hidden. This means your Android app UI might need to provide other visual clues so that navigation/features/options are more discoverable.&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;Back stack&lt;/b&gt;&lt;br /&gt;Both Android and WindowsPhone7 devices have a hardware &lt;i&gt;Back&lt;/i&gt; button supported by the respective SDKs via the '&lt;b&gt;back-stack&lt;/b&gt;' which is analogous to your web-browser History: each "View" has an "address" (a Xaml &lt;code&gt;Uri&lt;/code&gt; in WP7, an &lt;code&gt;Intent&lt;/code&gt; in Android) which is stored as the user navigates through your application. At any time (unless you intercept it) the hardware &lt;i&gt;Back&lt;/i&gt; button allows the user to cycle back through previous views until they have exited your app.&lt;br /&gt;&lt;br /&gt;iOS utilises a similar navigation metaphor in its &lt;code&gt;UINavigationController&lt;/code&gt; - however the back button is 'soft' (displayed in the top-left corner of the screen) and the scope is limited to the set of views that the developer chose to include in that navigation context.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-8744838871687147571?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/8744838871687147571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2011/03/mosetta-stone.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/8744838871687147571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/8744838871687147571'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2011/03/mosetta-stone.html' title='&quot;M&quot;osetta Stone'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-3056891248549237264</id><published>2011-03-05T21:33:00.002+11:00</published><updated>2011-03-05T21:42:05.701+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monodroid'/><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='mono'/><title type='text'>MonoDroid meet MonoTouch &amp; WindowsPhone7</title><content type='html'>This post follows the previous one about building for &lt;a href="http://conceptdev.blogspot.com/2010/09/monotouch-meet-windowsphone7.html" target="20110305"&gt;MonoTouch and WindowsPhone7&lt;/a&gt; by porting the example to Google's Android platform using &lt;a href="http://monodroid.net/" target="20110305"&gt;MonoDroid&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here's how it looks (no need to identify which platform is which :)&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-f4kJI77VJKw/TXIJ0fkFH2I/AAAAAAAABR4/AH75ZazXQv8/s1600/RestGuide_DROID.png" imageanchor="1" target="20110305"&gt;&lt;img border="0" height="640" src="http://3.bp.blogspot.com/-f4kJI77VJKw/TXIJ0fkFH2I/AAAAAAAABR4/AH75ZazXQv8/s640/RestGuide_DROID.png" width="382" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;As before, the code is available on &lt;a href="https://github.com/conceptdev/RestaurantGuide" target="20110305"&gt;github/conceptdev/RestaurantGuide&lt;/a&gt; - for comparison here is a shot of the three &lt;code&gt;.sln&lt;/code&gt; files.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-IF-Y-A9UBDg/TXINVysbCPI/AAAAAAAABSA/qhCUQjIMWHg/s1600/RestGuide_SLN.png" imageanchor="1" target="20110305"&gt;&lt;img border="0" height="288" src="http://3.bp.blogspot.com/-IF-Y-A9UBDg/TXINVysbCPI/AAAAAAAABSA/qhCUQjIMWHg/s400/RestGuide_SLN.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;A couple of observations:&lt;ul&gt;&lt;li&gt;One of the reasons the iOS/MonoTouch solution is so 'neat' is because I have not used the 'UI Designer' for that platform (ie. Interface Builder) so there are no 'markup' files for the user interface (ie. &lt;code&gt;.xib&lt;/code&gt; files). The entire layout is done in C# for the MonoTouch example, whereas the WP7 and Android version use &lt;code&gt;Xaml&lt;/code&gt; and &lt;code&gt;axml&lt;/code&gt; respectively.&lt;/li&gt;&lt;li&gt;These examples 'just work' - they don't claim to be best-practice in designing an app for any of these platforms*.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;i&gt;* for a quite neat cross-platform design (at least across MonoDroid and WP7) see &lt;a href="http://twitter.com/gshackles" target="20110305"&gt;@gshackles&lt;/a&gt; &lt;a href="https://github.com/gshackles/Sample-Projects/tree/master/MonoDroid/TwitterSearcher" target="20110305"&gt;TwitterSearcher sample&lt;/a&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;p.s. does anyone know what the Android equivalent of an &lt;a href="http://conceptdev.blogspot.com/2010/10/monotouch-windowsphone7-indexed-lists.html" target="20110305"&gt;"indexed list"&lt;/a&gt; is? Pls comment or @conceptdev... thx&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-3056891248549237264?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/3056891248549237264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2011/03/monodroid-meet-monotouch-windowsphone7.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/3056891248549237264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/3056891248549237264'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2011/03/monodroid-meet-monotouch-windowsphone7.html' title='MonoDroid meet MonoTouch &amp; WindowsPhone7'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-f4kJI77VJKw/TXIJ0fkFH2I/AAAAAAAABR4/AH75ZazXQv8/s72-c/RestGuide_DROID.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-4977493871335441895</id><published>2011-02-28T10:07:00.000+11:00</published><updated>2011-02-28T10:07:31.666+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monodroid'/><category scheme='http://www.blogger.com/atom/ns#' term='samsung'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Random tip: wtf is"7 CDCs" and debugging on a Samsung Galaxy Tab</title><content type='html'>Just a quick note on some issues I had debugging a &lt;a href="http://monodroid.net"&gt;MonoDroid&lt;/a&gt; app I've been playing with (MonoDroid is very cool, BTW)... for some reason I couldn't get a Samsumg Galaxy Tab to be recognised as a USB device when connected to my 64-bit Windows 7 PC. &lt;br /&gt;&lt;br /&gt;Googling turned up a few different 'ideas' like &lt;a href="http://android.modaco.com/content/samsung-galaxy-s-s-modaco-com/311526/samsung-galaxy-s-problems/"&gt;Samsung Galaxy S Problems, Samsung Kies Software and PC connectivity&lt;/a&gt; and &lt;a href="http://hubpages.com/hub/How-to-Connect-Samsung-Galaxy-S-with-Kies-on-your-PC"&gt;Connect Samsung Galaxy S with Kies on your PC - The MTP Error&lt;/a&gt;. None of those suggestions worked for me, despite a lot of mucking about with driver installs.&lt;br /&gt;&lt;br /&gt;It turned out a hint in this post on &lt;a href="http://androidforums.com/captivate-support-troubleshooting/234872-usb-connection-trouble.html"&gt;USB connection trouble&lt;/a&gt; fixed my problem... "somehow" the device's USB port was set to 'modem mode' and I had to type *#7284# on the phone keypad to re-set it! Un-in-tuitive!&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-wUayfP20IF4/TWrXIatKBXI/AAAAAAAABRg/q090--YJYbQ/s1600/galaxy1.jpg" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="320" width="239" src="http://4.bp.blogspot.com/-wUayfP20IF4/TWrXIatKBXI/AAAAAAAABRg/q090--YJYbQ/s320/galaxy1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-BZjthIfU0wQ/TWrXdqXaidI/AAAAAAAABRw/HnSeuC-nOtU/s1600/Galax2.jpg" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="245" width="320" src="http://1.bp.blogspot.com/-BZjthIfU0wQ/TWrXdqXaidI/AAAAAAAABRw/HnSeuC-nOtU/s320/Galax2.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The &lt;b&gt;Kies&lt;/b&gt; Samsung software/drivers off the &lt;a href="http://www.samsungmobile.com.sg/support/softwaremanuals/software.do?phone_model=GT-I9000&amp;sw_type=SW"&gt;Samsung website&lt;/a&gt; were fine, once the device was in 'USB mode'.&lt;br /&gt;&lt;br /&gt;Anyway, hope that helps someone else...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-4977493871335441895?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/4977493871335441895/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2011/02/random-tip-wtf-is7-cdcs-and-debugging.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/4977493871335441895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/4977493871335441895'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2011/02/random-tip-wtf-is7-cdcs-and-debugging.html' title='Random tip: wtf is&quot;7 CDCs&quot; and debugging on a Samsung Galaxy Tab'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-wUayfP20IF4/TWrXIatKBXI/AAAAAAAABRg/q090--YJYbQ/s72-c/galaxy1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-2878458304146512911</id><published>2011-02-18T21:43:00.001+11:00</published><updated>2011-02-19T08:00:48.487+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='ipad'/><title type='text'>Status Update: accessing Facebook with MonoTouch</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Haven't blogged for a while, but hopefully that's about to change... and to kick off more regular posts here is a simple example of accessing the &lt;a href="http://developers.facebook.com/docs/opengraph/" target="20110218"&gt;Facebook OpenGraph API&lt;/a&gt; using &lt;a href="http://monotouch.net/" target="20110218"&gt;MonoTouch&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The core of the example is &lt;a href="http://twitter.com/redth/" target="20110218"&gt;@redth&lt;/a&gt;'s &lt;a href="https://gist.github.com/raw/400008/8de8170198148995d7477916f7cda526473b67f1/MonoTouch.Facebook.Authorization.cs" target="20110218"&gt;MonoTouch.Facebook.Authorization&lt;/a&gt; ViewController which uses the Facebook OAuth webpage hosted in a &lt;code&gt;UIWebView&lt;/code&gt; to authenticate and grab the &lt;code&gt;access_token&lt;/code&gt; you need for subsequent requests. &lt;br /&gt;&lt;br /&gt;The app looks like this when it runs (and yes, when you &lt;b&gt;Save&lt;/b&gt; your status update, it appears directly on your Facebook Profile):&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-6i5hRJuQodE/TV5EJu8t3qI/AAAAAAAABRE/mql0K3y4s1c/s1600/Facebook00.png" imageanchor="1" style="clear: left; cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" j6="true" src="http://1.bp.blogspot.com/-6i5hRJuQodE/TV5EJu8t3qI/AAAAAAAABRE/mql0K3y4s1c/s320/Facebook00.png" width="213" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/-SMqS2pKVWzY/TV5EKNohbkI/AAAAAAAABRI/OqNrNmr7yac/s1600/Facebook01.png" imageanchor="1" style="cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" j6="true" src="http://2.bp.blogspot.com/-SMqS2pKVWzY/TV5EKNohbkI/AAAAAAAABRI/OqNrNmr7yac/s320/Facebook01.png" width="213" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/-WYkPaP2jKiA/TV5EKnFCLTI/AAAAAAAABRM/m_U00hwuKOQ/s1600/Facebook02.png" imageanchor="1" style="cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" j6="true" src="http://4.bp.blogspot.com/-WYkPaP2jKiA/TV5EKnFCLTI/AAAAAAAABRM/m_U00hwuKOQ/s320/Facebook02.png" width="213" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/-J063nDod4xs/TV5EYBEMjRI/AAAAAAAABRU/Gbwvt04mXvg/s1600/Facebook03.png" imageanchor="1" style="cssfloat: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" j6="true" src="http://2.bp.blogspot.com/-J063nDod4xs/TV5EYBEMjRI/AAAAAAAABRU/Gbwvt04mXvg/s320/Facebook03.png" width="213" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;The code is available on github at &lt;a href="https://github.com/conceptdev/Facebook" target="20110218"&gt;github.com/conceptdev/Facebook&lt;/a&gt; - remember you need to have a Facebook Application 'Client ID' (&lt;a href="http://www.facebook.com/developers/createapp.php" target="20110218"&gt;create one here&lt;/a&gt;) to get it working. NOTE: this is a &lt;i&gt;sample&lt;/i&gt; - there is very little in the way of error detection, correction or recovery... left as an exercise for the reader :)&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;b style="color:darkred"&gt;Facebook Login&lt;/b&gt;&lt;br /&gt;The Facebook OAuth 'magic' happens inside a &lt;code&gt;UIWebView&lt;/code&gt;... we create one and navigate to &lt;code&gt;https://graph.facebook.com/oauth/authorize&lt;/code&gt; which displays and processes the login form. A successful authentication results in a redirect to a 'known page'; the redirected URL contains the access_token needed for subsequent 'authorised' requests so the code strips it out and saves it. Thanks again to &lt;a href="http://redth.info/2010/05/13/facebook-authorization-view-controller-for-monotouch" target="20110218"&gt;Jon&lt;/a&gt; without whom the rest of the code wouldn't be here!&lt;br /&gt;&lt;br /&gt;&lt;b style="color:darkred"&gt;Facebook Newsfeed&lt;/b&gt;&lt;br /&gt;Getting the news feed is relatively simple and thanks to some useful info on using &lt;a href="http://www.brettnagy.com/post/2009/11/21/Using-JsonNET-with-MonoTouch.aspx" target="20110218"&gt;Json.NET with MonoTouch&lt;/a&gt; it is easy to parse too!&lt;br /&gt;&lt;pre class="brush:csharp"&gt;var b = wc.DownloadData(&lt;br /&gt;   new Uri("https://graph.facebook.com/me/home?access_token=" + token));&lt;br /&gt;var s = Encoding.UTF8.GetString(b);&lt;br /&gt;var posts = JsonConvert.DeserializeObject&amp;lt;Posts&amp;gt;(s);&lt;/pre&gt;The parsing works so easily because &lt;a href="https://github.com/conceptdev/Facebook/blob/master/iOS/Objects.cs"&gt;Objects.cs&lt;/a&gt; contains a set of classes that (roughly, not completely) match the JSON returned by Facebook, for example:&lt;br /&gt;&lt;pre class="brush:js"&gt;{"data":[\{"id":"57755305836_10150135900140837","from":\{"name":"Tiga","category":"Musician\\/band","id":"57755305836"\},&lt;br /&gt;"message":"Bad DJ Signs Vol.1:  when your dancefloor reminds you of the \\"club\\" scene from \\"Vanilla Sky\\"",&lt;br /&gt;"icon":"http:\\/\\/photos-d.ak.fbcdn.net\\/photos-ak-snc1\\/v27562\\/23\\/2231777543\\/app_2_2231777543_9553.gif",&lt;br /&gt;"actions":[\{"name":"Comment","link":"http:\\/\\/www.facebook.com\\/57755305836\\/posts\\/10150135900140837"\},&lt;br /&gt;\{"name":"Like","link":"http:\\/\\/www.facebook.com\\/57755305836\\/posts\\/10150135900140837"\},&lt;br /&gt;\{"name":"\\u0040ciaotiga on Twitter","link":"http:\\/\\/twitter.com\\/ciaotiga?"\}],&lt;br /&gt;"type":"status","created_time":"2011-02-18T07:23:42+0000","updated_time":"2011-02-18T08:25:22+0000",&lt;br /&gt;"likes":33&lt;/pre&gt;maps to&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-i6k_Xwv9g0I/TV5JmebYZiI/AAAAAAAABRY/tyDUqIe3ivQ/s1600/ClassDiagram1.png" imageanchor="1" style=""&gt;&lt;img border="0" height="258" width="320" src="http://2.bp.blogspot.com/-i6k_Xwv9g0I/TV5JmebYZiI/AAAAAAAABRY/tyDUqIe3ivQ/s320/ClassDiagram1.png" /&gt;&lt;/a&gt;&lt;/div&gt;The &lt;code&gt;DeserializeObject()&lt;/code&gt; call is then all that is required to take the JSON string and turn it into an object graph that is easily bound to a &lt;code&gt;UITableView&lt;/code&gt; (see &lt;a href="https://github.com/conceptdev/Facebook/blob/master/iOS/Main.cs"&gt;Main.cs&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;b style="color:darkred"&gt;Facebook Status Update&lt;/b&gt;&lt;br /&gt;Once we have the authentication token updating your status is easy - a simple POST using &lt;code&gt;WebClient&lt;/code&gt; is all it takes.&lt;br /&gt;&lt;pre class="brush:csharp"&gt;System.Net.WebClient wc = new System.Net.WebClient();&lt;br /&gt;var result = wc.UploadString&lt;br /&gt;("https://graph.facebook.com/me/feed?access_token=" + token&lt;br /&gt;, "message=" + status);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;but isn't there a Facebook API for iOS?&lt;/b&gt;&lt;br /&gt;Yes, in addition to this 'manual' way of authenticating using an embedded webpage Facebook also provides a &lt;a href="http://developers.facebook.com/docs/guides/mobile" target="20110218"&gt;Mobile API&lt;/a&gt;. The UI presented to the user looks nicer than the webpage AND it can interact with the official Facebook app (if installed). To get that working with MonoTouch requires &lt;a href="http://code.google.com/p/btouch-library/source/browse/trunk/FacebookConnect/FacebookConnect.cs" target="20110218"&gt;btouch-library&lt;/a&gt; bindings... but that's a story for another post.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPDATE:&lt;/b&gt; (from comments below) &lt;a href="http://twitter.com/klmcmahon"&gt;@klmcmahon&lt;/a&gt; has already ported the &lt;a href="https://github.com/kevinmcmahon/monotouch-facebook"&gt;Facebook iOS SDK and sample&lt;/a&gt; to MonoTouch - thanks Kevin!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-2878458304146512911?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/2878458304146512911/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2011/02/status-update-accessing-facebook-with.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/2878458304146512911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/2878458304146512911'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2011/02/status-update-accessing-facebook-with.html' title='Status Update: accessing Facebook with MonoTouch'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-6i5hRJuQodE/TV5EJu8t3qI/AAAAAAAABRE/mql0K3y4s1c/s72-c/Facebook00.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-5845540684795751717</id><published>2010-11-08T07:57:00.002+11:00</published><updated>2010-11-08T21:53:23.551+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='winphone7'/><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Conf mobile schedule for TechEd Berlin &amp; Øredev</title><content type='html'>Europe is awash with conference attendees this week - for &lt;a href="http://europe.msteched.com/"&gt;TechEd Berlin&lt;/a&gt; and &lt;a href="http://oredev.org/2010"&gt;Øredev&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you are attending either conference, you might want to &lt;i&gt;download&lt;/i&gt; &lt;a href="http://confapp.com/"&gt;Conf&lt;/a&gt; to your &lt;b&gt;&lt;a href="http://itunes.apple.com/au/app/conf/id358922474?mt=8"&gt;iPhone&lt;/a&gt;&lt;/b&gt; or &lt;b&gt;&lt;a href="http://bit.ly/aH570h"&gt;Windows Phone 7&lt;/a&gt;&lt;/b&gt; (no Android for now, but coming...).&lt;br /&gt;&lt;br /&gt;One warning for &lt;strong&gt;Øredev&lt;/strong&gt; - the 'unusual' session starting times (eg. 10 after the hour) were not catered for in the code, so the "up next" algorithm doesn't really work. To be fixed in the next release!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/TNcQsGcVLuI/AAAAAAAABPw/jgLWZ4zv3W4/s1600/oredev.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="162" px="true" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/TNcQsGcVLuI/AAAAAAAABPw/jgLWZ4zv3W4/s400/oredev.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Hopefully no such issues occur with the &lt;strong&gt;TechEd Europe&lt;/strong&gt; schedule, bought to you by the &lt;a href="http://europe.msteched.com/OData"&gt;power of OData&lt;/a&gt;!&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/TNcSUdE6FmI/AAAAAAAABP0/6YcV1VI_3os/s1600/iphone.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="145" px="true" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/TNcSUdE6FmI/AAAAAAAABP0/6YcV1VI_3os/s400/iphone.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If you're reading this, you must be interested in these conferences, so you probably want to know about these other mobile schedule apps too*:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://itunes.apple.com/no/app/tee2010/id400418362?mt=8"&gt;TEE2010&lt;/a&gt; for iPhone and iPod Touch&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.falafel.com/event_board.aspx"&gt;Event Board&lt;/a&gt; for Windows Phone 7&lt;/li&gt;&lt;/ul&gt;* DISCLAIMER: I had nothing to do with either of these apps - just mentioning them FYI...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-5845540684795751717?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/5845540684795751717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2010/11/conf-mobile-schedule-for-teched-berlin.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/5845540684795751717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/5845540684795751717'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2010/11/conf-mobile-schedule-for-teched-berlin.html' title='Conf mobile schedule for TechEd Berlin &amp; Øredev'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Ba76y6K7kvs/TNcQsGcVLuI/AAAAAAAABPw/jgLWZ4zv3W4/s72-c/oredev.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-3073560983278741589</id><published>2010-10-26T21:57:00.003+11:00</published><updated>2010-10-28T09:26:58.747+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='winphone7'/><title type='text'>Conf for PDC10 on Windows Phone 7</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/TMazixA_6TI/AAAAAAAABPs/sbzDV_g39Pc/s1600/conf-logo.png" imageanchor="1" style="float: right; margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="54" nx="true" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/TMazixA_6TI/AAAAAAAABPs/sbzDV_g39Pc/s1600/conf-logo.png" width="54" /&gt;&lt;/a&gt;A first-cut of the &lt;a href="http://microsoftpdc.com/" target="pdc10"&gt;PDC10&lt;/a&gt; schedule can now be downloaded for the Windows Phone 7 version of &lt;a href="http://confapp.com/" target="pdc10"&gt;&lt;b&gt;Conf&lt;/b&gt;&lt;/a&gt; - now available on Marketplace (&lt;a href="http://bit.ly/aH570h" target="_blank"&gt;Zune link&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;To download new conference data in &lt;b&gt;Conf&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Start on the first panel of the Panorama&lt;/li&gt;&lt;li&gt;Scroll down to &lt;span style="color: blue;"&gt;other conferences...&lt;/span&gt; and touch &lt;span style="color: grey;"&gt;Download more...&lt;/span&gt;&lt;/li&gt;&lt;li&gt;When the list downloads from the server, touch &lt;b&gt;PDC10&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;PDC10&lt;/b&gt; should appear in the list - if not, switch between the conferences until it does :-s&lt;/li&gt;&lt;/ul&gt;This is what the app looks like with PDC10 data loaded:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/TMaxHvmO-2I/AAAAAAAABPY/LH0Hoci8O8E/s1600/PDC01_home.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" nx="true" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/TMaxHvmO-2I/AAAAAAAABPY/LH0Hoci8O8E/s200/PDC01_home.png" width="120" /&gt;&lt;/a&gt; &lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/TMaxJ4o9LhI/AAAAAAAABPc/U0lXxCAdHc4/s1600/PDC01_speakers.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" nx="true" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/TMaxJ4o9LhI/AAAAAAAABPc/U0lXxCAdHc4/s200/PDC01_speakers.png" width="120" /&gt;&lt;/a&gt; &lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/TMaxL_sjdpI/AAAAAAAABPg/ocCw77Og2u8/s1600/PDC01_sessions.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" nx="true" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/TMaxL_sjdpI/AAAAAAAABPg/ocCw77Og2u8/s200/PDC01_sessions.png" width="120" /&gt;&lt;/a&gt; &lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/TMaxNVPMMZI/AAAAAAAABPk/7ReutR5YX5c/s1600/PDC01_session.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" nx="true" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/TMaxNVPMMZI/AAAAAAAABPk/7ReutR5YX5c/s200/PDC01_session.png" width="120" /&gt;&lt;/a&gt; &lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/TMaxOgerdaI/AAAAAAAABPo/NCRafGc8oQg/s1600/PDC01_map.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" nx="true" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/TMaxOgerdaI/AAAAAAAABPo/NCRafGc8oQg/s200/PDC01_map.png" width="120" /&gt;&lt;/a&gt; &lt;/div&gt;&lt;br /&gt;The iPhone version of &lt;b&gt;Conf&lt;/b&gt; is currently awaiting AppStore approval - fingers crossed for Thursday!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-3073560983278741589?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/3073560983278741589/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2010/10/conf-for-pdc10-on-windows-phone-7.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/3073560983278741589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/3073560983278741589'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2010/10/conf-for-pdc10-on-windows-phone-7.html' title='Conf for PDC10 on Windows Phone 7'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Ba76y6K7kvs/TMazixA_6TI/AAAAAAAABPs/sbzDV_g39Pc/s72-c/conf-logo.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-9083288447165538911</id><published>2010-10-14T20:21:00.000+11:00</published><updated>2010-10-14T20:21:08.795+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='winphone7'/><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><title type='text'>MonoTouch &amp; WindowsPhone7: indexed lists</title><content type='html'>One interesting aspect of building cross-platform apps is how to adopt the 'standard' UI elements so that each app looks 'native'. A basic iPhone/MonoTouch and WindowsPhone7 application was introduced in &lt;a href="http://conceptdev.blogspot.com/2010/09/monotouch-meet-windowsphone7.html" target="20101014"&gt;a previous post&lt;/a&gt;. Each app uses the 'default' list representation.&lt;br /&gt;&lt;br /&gt;This post is about making those apps easier to use, adding each platform's default "list index" to help select from long, sorted lists. The images below hardly need captions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;on the left is the iPhone app with alphabetic index down the right side of the screen&lt;/li&gt;&lt;li&gt;on the right is the WindowsPhone7 app showing the alphabet tiles 'in' the list, and the grid that is displayed when you touch one of those tiles&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/TLbEFQtK2OI/AAAAAAAABPM/NiOku09pVQQ/s1600/iphone_index.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/TLbEFQtK2OI/AAAAAAAABPM/NiOku09pVQQ/s200/iphone_index.png" width="133" /&gt;&lt;/a&gt; &lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/TLbEGxiawoI/AAAAAAAABPU/GgxdEN1I3Rw/s1600/restguide_index.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/TLbEGxiawoI/AAAAAAAABPU/GgxdEN1I3Rw/s200/restguide_index.png" width="118" /&gt;&lt;/a&gt; &lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/TLbEGXPJ-jI/AAAAAAAABPQ/_tdwF0biVUg/s1600/restguide_alphabet.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/TLbEGXPJ-jI/AAAAAAAABPQ/_tdwF0biVUg/s200/restguide_alphabet.png" width="118" /&gt; &lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Implementing the two different solutions highlights the difference in the two platforms (referring of course to C#/&lt;a href="http://monotouch.net"&gt;MonoTouch&lt;/a&gt; on the iPhone, and C#/Silverlight on the WindowsPhone7). Get the complete code from &lt;a href="http://github.com/conceptdev/RestaurantGuide" target="20101014"&gt;github&lt;/a&gt; - the main changes for each platform are highlighted below:&lt;br /&gt;&lt;br /&gt;&lt;b style="color: darkred;"&gt;iPhone (MonoTouch) UITableView sections&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The following code was added to the &lt;code&gt;UITableViewSource&lt;/code&gt; subclass to break up the list into sections, identify the section labels and wire up the alphabetic navigation. The &lt;code&gt;GetCell&lt;/code&gt; and &lt;code&gt;RowSelected&lt;/code&gt; methods also required a minor change.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;List&amp;lt;string&amp;gt; sectionTitles;&lt;br /&gt;Dictionary&amp;lt;int, &amp;lt;restaurant&amp;gt;&amp;gt; sectionElements = new Dictionary&amp;lt;int,restaurant&amp;gt;&amp;gt;();&lt;br /&gt;public TableViewSource (List&amp;lt;restaurant&amp;gt; list, MainViewController controller)&lt;br /&gt;{&lt;br /&gt;   this.list = list;&lt;br /&gt;   mvc = controller;&lt;br /&gt;   sectionTitles = (from r in list&lt;br /&gt;            orderby r.StartsWith&lt;br /&gt;            select r.StartsWith).Distinct().ToList();&lt;br /&gt;   foreach (var restaurant in list)&lt;br /&gt;   {   // group elements together into 'alphabet'&lt;br /&gt;      int sectionNumber = sectionTitles.IndexOf(restaurant.Name[0].ToString());&lt;br /&gt;      if (sectionElements.ContainsKey(sectionNumber))&lt;br /&gt;         sectionElements[sectionNumber].Add(restaurant);&lt;br /&gt;      else&lt;br /&gt;         sectionElements.Add(sectionNumber, new List&amp;lt;restaurant&amp;gt; {restaurant});&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;public override int NumberOfSections (UITableView tableView)&lt;br /&gt;{&lt;br /&gt;   return sectionTitles.Count;&lt;br /&gt;}&lt;br /&gt;public override string TitleForHeader (UITableView tableView, int section)&lt;br /&gt;{&lt;br /&gt;   return sectionTitles[section];&lt;br /&gt;}&lt;br /&gt;public override string[] SectionIndexTitles (UITableView tableView)&lt;br /&gt;{&lt;br /&gt;   return sectionTitles.ToArray();&lt;br /&gt;}&lt;br /&gt;public override int RowsInSection (UITableView tableview, int section)&lt;br /&gt;{&lt;br /&gt;   return sectionElements[section].Count(); //list.Count;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style="color: darkred;"&gt;Windows Phone 7 'quick jump grid'&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Although you'll see this kind of navigation in the 'built-in' applications, it isn't actually part of the default SDK. Thankfully &lt;a href="http://twitter.com/ksmarshall"&gt;Kevin Marshall&lt;/a&gt; has posted a &lt;a href="http://blogs.claritycon.com/blogs/kevin_marshall/archive/2010/10/06/wp7-quick-jump-grid-sample-code.aspx" target="20101014"&gt;quick jump grid sample&lt;/a&gt; which has been integrated into the &lt;b&gt;RestGuide&lt;/b&gt; app - just add the relevant Assembly References then update the XAML to use the &lt;code&gt;QuickJumpGrid&lt;/code&gt; (don't forget to add the relevant &lt;code&gt;xmlns:&lt;/code&gt; declarations)&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;cc:QuickJumpGrid DataSource="{Binding}"&lt;br /&gt;      IsAlphaNumeric="True"&lt;br /&gt;      Margin="12,0,0,0"&lt;br /&gt;      SelectionChanged="MainListBox_SelectionChanged"&lt;br /&gt;      x:Name="MainListBox"&lt;br /&gt;      OverlayTileBackground="#8CBF26"&amp;gt;&lt;br /&gt;    &amp;lt;cc:QuickJumpGrid.QuickJumpGridSelector&amp;gt;&lt;br /&gt;        &amp;lt;local:RestaurantNameSelector /&amp;gt;&lt;br /&gt;    &amp;lt;/cc:QuickJumpGrid.QuickJumpGridSelector&amp;gt;&lt;br /&gt;    &amp;lt;cc:QuickJumpGrid.ItemTemplate&amp;gt;&lt;br /&gt;        &amp;lt;DataTemplate&amp;gt;&lt;br /&gt;           &amp;lt;StackPanel Margin="0,0,0,17" Width="432"&amp;gt;&lt;br /&gt;               &amp;lt;TextBlock Text="{Binding Name}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/&amp;gt;&lt;br /&gt;               &amp;lt;TextBlock Text="{Binding Cuisine}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/&amp;gt;&lt;br /&gt;           &amp;lt;/StackPanel&amp;gt;&lt;br /&gt;        &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;    &amp;lt;/cc:QuickJumpGrid.ItemTemplate&amp;gt;&lt;br /&gt;&amp;lt;/cc:QuickJumpGrid&amp;gt;&lt;/pre&gt;&lt;br /&gt;and implement this 'helper' class (which is referenced from the XAML)&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;namespace RestGuide&lt;br /&gt;{&lt;br /&gt;    public class RestaurantNameSelector : IQuickJumpGridSelector&lt;br /&gt;    {&lt;br /&gt;        public Func&amp;lt;object, IComparable&amp;gt; GetGroupBySelector()&lt;br /&gt;        {&lt;br /&gt;            return (p) =&amp;gt; ((Restaurant)p).Name.FirstOrDefault();&lt;br /&gt;        }&lt;br /&gt;        public Func&amp;lt;object, string&amp;gt; GetOrderByKeySelector()&lt;br /&gt;        {&lt;br /&gt;            return (p) =&amp;gt; ((Restaurant)p).Name;&lt;br /&gt;        }&lt;br /&gt;        public Func&amp;lt;object, string&amp;gt; GetThenByKeySelector()&lt;br /&gt;        {&lt;br /&gt;            return (p) =&amp;gt; (string.Empty);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-9083288447165538911?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/9083288447165538911/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2010/10/monotouch-windowsphone7-indexed-lists.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/9083288447165538911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/9083288447165538911'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2010/10/monotouch-windowsphone7-indexed-lists.html' title='MonoTouch &amp; WindowsPhone7: indexed lists'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Ba76y6K7kvs/TLbEFQtK2OI/AAAAAAAABPM/NiOku09pVQQ/s72-c/iphone_index.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-967787327878585071</id><published>2010-09-30T20:39:00.003+10:00</published><updated>2010-10-02T11:32:54.068+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><title type='text'>MonoTouch... CATiledLayer example (like DeepZoom/multi-scale-image)</title><content type='html'>&lt;span style="color: darkred;"&gt;&lt;b&gt;UPDATE 2-Oct-02:&lt;/b&gt; Thanks to &lt;a href="http://tirania.org/blog/" target="20100930"&gt;Miguel's&lt;/a&gt; assistance the &lt;a href="http://github.com/conceptdev/NPhotoScroller" target="20100929"&gt;NPhotoScroller code on github&lt;/a&gt; is now working!&lt;br /&gt;&lt;br /&gt;The CORRECT port of this Objective-C snippet...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;+ (Class)layerClass {&lt;br /&gt;&amp;nbsp;&amp;nbsp;return [CATiledLayer class]; &lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;...is this c# (requires &lt;code&gt;using MonoTouch.ObjCRuntime;&lt;/code&gt;)&lt;br /&gt;&lt;br /&gt;&lt;code&gt;[Export ("layerClass")]&lt;br /&gt;public static Class LayerClass () {&lt;br /&gt;&amp;nbsp;&amp;nbsp;return new Class (typeof (CATiledLayer));&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and not the dodgy hack I came up with below...&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style="color: darkred;"&gt;Original Post:&lt;/b&gt;&lt;br /&gt;Normally code posted on this blog actually works (or close to it...) but today I have a half-done port of an Objective-C sample that I just can't seem to finish off :-(&lt;br /&gt;&lt;br /&gt;The idea was to port &lt;a href="http://developer.apple.com/library/ios/#samplecode/PhotoScroller/" target="20100929"&gt;Apple's PhotoScroller sample&lt;/a&gt;, which demonstrates how to use the &lt;code&gt;CATiledLayer&lt;/code&gt;, to MonoTouch.&lt;br /&gt;&lt;br /&gt;The work-in-progress is on &lt;a href="http://github.com/conceptdev/NPhotoScroller" target="20100929"&gt;github: NPhotoScroller*&lt;/a&gt;... however it isn't quite finished and I'm hoping someone will point out what is missing.&lt;br /&gt;&lt;br /&gt;If you download the sample (and grab the images from Apple), the my MonoTouch port looks like this:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/TKRjpW87jhI/AAAAAAAABPA/jU43xyqAxjs/s1600/NPhotoScroller1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" px="true" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/TKRjpW87jhI/AAAAAAAABPA/jU43xyqAxjs/s320/NPhotoScroller1.png" width="222" /&gt;&lt;/a&gt;&lt;/div&gt;It &lt;i&gt;seems&lt;/i&gt; to be working, since the image is being successfully drawn using tiles BUT there are too many tiles for this zoom level. It &lt;i&gt;should&lt;/i&gt; look like the image below (ie. 4 tiles) but I can only get that effect by hardcoding &lt;code&gt;TilingView.cs::line 96&lt;/code&gt; to a specific zoom level of 0.125&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/TKRjncreH9I/AAAAAAAABO4/adP0O3l4nWM/s1600/NPhotoScroller_25.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" px="true" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/TKRjncreH9I/AAAAAAAABO4/adP0O3l4nWM/s320/NPhotoScroller_25.png" width="222" /&gt;&lt;/a&gt;&lt;/div&gt;Using a different hardcoded zoom level of 0.25 results in this output, so the tiles are 'definitely kinda working'...&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/TKRjocNEgDI/AAAAAAAABO8/1QNQYCRAVC8/s1600/NPhotoScroller_125.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" px="true" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/TKRjocNEgDI/AAAAAAAABO8/1QNQYCRAVC8/s320/NPhotoScroller_125.png" width="222" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The problem? Zooming is totally broken - any attempt to pinch/zoom on these images breaks. &lt;code&gt;TilingView.cs::line 95&lt;/code&gt; ALWAYS returns a scale of 1 - it never changes. &lt;code&gt;ImageScrollView.cs::line 157 this.ZoomScale = this.MinimumZoomScale&lt;/code&gt; seems to have no effect: no matter what the &lt;code&gt;MinimumZoomScale&lt;/code&gt; is (eg. 0.08), ZoomScale is always &lt;b&gt;1&lt;/b&gt; and the &lt;code&gt;context.GetCTM() CGAffineTransform&lt;/code&gt; never reflects a change in zoom level.&lt;br /&gt;&lt;br /&gt;If you switch from 'tiled' to 'whole' images (&lt;code&gt;PhotoViewController.cs::line 63 useTiledImage = false;&lt;/code&gt;) then zooming works perfectly (if greedily from a memory perspective). I would &lt;i&gt;love&lt;/i&gt; to hear any suggestions!!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;s&gt;Aside:&lt;/s&gt;&lt;/b&gt;&lt;s&gt; I did have one minor issue with the port... what to do with this code in &lt;/s&gt;&lt;a href="http://developer.apple.com/library/ios/#samplecode/PhotoScroller/Listings/Classes_TilingView_m.html" target="20100929"&gt;&lt;s&gt;TilingView.m&lt;/s&gt;&lt;/a&gt;&lt;br /&gt;&lt;s&gt;&lt;br /&gt;&lt;/s&gt;&lt;br /&gt;&lt;code&gt;&lt;s&gt;+ (Class)layerClass { &lt;br /&gt;return [CATiledLayer class]; &lt;br /&gt;} &lt;/s&gt;&lt;/code&gt;&lt;br /&gt;&lt;s&gt;&lt;br /&gt;&lt;/s&gt;&lt;br /&gt;&lt;s&gt;It's been ported as the following in &lt;/s&gt;&lt;a href="http://github.com/conceptdev/NPhotoScroller/blob/master//TilingView.cs" target="20100929"&gt;&lt;s&gt;TilingView.cs&lt;/s&gt;&lt;/a&gt;&lt;s&gt; but I could be way off base...&lt;/s&gt;&lt;br /&gt;&lt;s&gt;&lt;br /&gt;&lt;/s&gt;&lt;br /&gt;&lt;code&gt;&lt;s&gt;private CATiledLayer __layer;&lt;br /&gt;public override CALayer Layer {get &lt;br /&gt;{ // set in ctor &lt;br /&gt;return __layer;&lt;br /&gt;}&lt;br /&gt;}&lt;/s&gt;&lt;/code&gt;&lt;br /&gt;&lt;s&gt;&lt;br /&gt;&lt;/s&gt;&lt;br /&gt;&lt;s&gt;...HELP?!&lt;/s&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;* NOTE:&lt;/b&gt; If you download the sample from github, you MUST also download Apple's original sample to get their test image files.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-967787327878585071?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/967787327878585071/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2010/09/monotouch-help-catiledlayer-not-quite.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/967787327878585071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/967787327878585071'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2010/09/monotouch-help-catiledlayer-not-quite.html' title='MonoTouch... CATiledLayer example (like DeepZoom/multi-scale-image)'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Ba76y6K7kvs/TKRjpW87jhI/AAAAAAAABPA/jU43xyqAxjs/s72-c/NPhotoScroller1.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-1836850480168289662</id><published>2010-09-25T21:17:00.000+10:00</published><updated>2010-09-25T21:17:35.410+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='winphone7'/><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><title type='text'>MonoTouch meet WindowsPhone7</title><content type='html'>This is a &lt;i&gt;very&lt;/i&gt; basic example of how you can share data and code between the iPhone platform (using &lt;a href="http://monotouch.net/" target="20100925"&gt;MonoTouch&lt;/a&gt;) and recently RTM'd Windows Phone 7.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/TJ3UsKUvX3I/AAAAAAAABO0/ql731CcGyxg/s1600/RestGuide_ALL.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="20100925"&gt;&lt;img alt="iPhone and Windows Phone 7 screenshots : click to enlarge" border="0" height="400" px="true" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/TJ3UsKUvX3I/AAAAAAAABO0/ql731CcGyxg/s400/RestGuide_ALL.png" width="347" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The code is available on &lt;a href="http://github.com/conceptdev/RestaurantGuide" target="20100925"&gt;github&lt;/a&gt;... notice that the source data (&lt;a href="http://github.com/conceptdev/RestaurantGuide/raw/master/RestGuide_iOS/restaurants.xml" target="20100925"&gt;&lt;code&gt;restaurants.xml&lt;/code&gt;&lt;/a&gt; file) and class file (&lt;a href="http://github.com/conceptdev/RestaurantGuide/raw/master/RestGuide_iOS/DataClasses/Objects.cs" target="20100925"&gt;&lt;code&gt;Objects.cs&lt;/code&gt;&lt;/a&gt;) are identical on both platforms, as is the &lt;code&gt;XmlSerialization&lt;/code&gt; code that parses the data into memory for display.&lt;br /&gt;&lt;br /&gt;You will see there is a lot more 'user code' in the MonoTouch project for iPhone - this is due to the laborious way that &lt;code&gt;UITableView&lt;/code&gt;s must be coded*; whereas the WP7's Silverlight heritage allows some very neat databinding scenarios.&lt;br /&gt;&lt;br /&gt;* the excellent &lt;a href="http://github.com/migueldeicaza/MonoTouch.Dialog" target="20100925"&gt;&lt;code&gt;MonoTouch.Dialog&lt;/code&gt;&lt;/a&gt; project significantly reduces this code overhead on MonoTouch - definitely give it a try!&lt;br /&gt;&lt;br /&gt;...now I just need to put the &lt;a href="http://monodroid.net/" target="20100925"&gt;MonoDroid&lt;/a&gt; version together... :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-1836850480168289662?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/1836850480168289662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2010/09/monotouch-meet-windowsphone7.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/1836850480168289662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/1836850480168289662'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2010/09/monotouch-meet-windowsphone7.html' title='MonoTouch meet WindowsPhone7'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Ba76y6K7kvs/TJ3UsKUvX3I/AAAAAAAABO0/ql731CcGyxg/s72-c/RestGuide_ALL.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-5175400510059569206</id><published>2010-08-04T21:24:00.002+10:00</published><updated>2011-05-26T09:03:49.701+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='ipad'/><title type='text'>UIGlassButton Generator in MonoTouch</title><content type='html'>Sometimes the default look of iOS controls (such as &lt;code&gt;UIButton&lt;/code&gt;) is a little 'flat'. Apple themselves sometimes use a very pretty 'glass button' effect, which could be achieved (apparently, I'm paraphrasing here) using an undocumented &lt;code&gt;UIGlassButton&lt;/code&gt; class. You can read more about this in the source links for this sample:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.shrinkrays.net/code-snippets/csharp/monotouch-tips-and-snippets.aspx"&gt;MonoTouch tips and snippets&lt;/a&gt;, which points to...&lt;/li&gt;&lt;li&gt;Martin Bowling's &lt;a href="http://bit.ly/MTGlassButton"&gt;MTGlassButton (ZIP file)&lt;/a&gt;, which seems related to...&lt;/li&gt;&lt;li&gt;Erica Sudan's &lt;a href="http://www.tuaw.com/2010/02/19/iphone-devsugar-create-shiny-buttons-easily/"&gt;Shiny buttons devsugar&lt;/a&gt;, which uses...&lt;/li&gt;&lt;li&gt;@schwa (Jonathan Wight)'s &lt;a href="http://pastie.org/830884"&gt;Objective-C version&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Anyway... &lt;a href="http://twitter.com/martinbowling"&gt;Martin&lt;/a&gt; did a &lt;i&gt;great&lt;/i&gt; job porting this approach to MonoTouch, creating a &lt;code&gt;GlassButton.dll&lt;/code&gt; wrapper as part of a sample project that allows you to create great-looking PNG-image-glass-buttons to incorporate into your iOS projects. The only thing missing was a double-resolution version for my new iPhone4's Retina Display, so that's what I've added to this &lt;a href="http://github.com/conceptdev/GlassButtonGenerator"&gt;github project: GlassButtonGenerator&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;How it works:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Edit the string constants for button text and filename&lt;/li&gt;&lt;li&gt;Edit the filename which is used in the path to save the output&lt;/li&gt;&lt;li&gt;Run the app in the Simulator and press the [Generate Glass Button] button&lt;/li&gt;&lt;li&gt;Grab the images that are saved to your Desktop&lt;/li&gt;&lt;li&gt;Use the images in your iOS app in &lt;code&gt;UIButton&lt;/code&gt; controls&lt;/li&gt;&lt;/ol&gt;Here is the 'output' when you are running it in the simulator (the button images should be saved to your Desktop):&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/TFlMRnGbGpI/AAAAAAAABOk/GCtGi2m2fU0/s1600/cancelbutton.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/TFlMRnGbGpI/AAAAAAAABOk/GCtGi2m2fU0/s320/cancelbutton.png" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/TFlMQpusIcI/AAAAAAAABOc/U87RmeIDL_U/s1600/buybutton.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/TFlMQpusIcI/AAAAAAAABOc/U87RmeIDL_U/s320/buybutton.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If you are then wondering what to do with the two images, check out &lt;a href="http://twitter.com/migueldeicaza"&gt;Miguel's&lt;/a&gt; post on &lt;a href="http://tirania.org/blog/archive/2010/Jul-20-2.html"&gt;Building apps for the Retina Display&lt;/a&gt;. Basically you should use&amp;nbsp;&lt;code&gt;UIImage.FromBundle&lt;/code&gt; to load the image and ensure that the 'regular' and 'retina' versions have the same filename (with the 'retina' version having a suffix @2x).&lt;br /&gt;&lt;br /&gt;For the code below, the &lt;code&gt;/Images/&lt;/code&gt; folder has four images: BuyGlass.png, BuyGlass@2x.png, CancelGlass.png, CancelGlass@2x.png (where the @2x images have double the height &amp;amp; width dimensions of the base image)...&lt;br /&gt;&lt;pre lang="csharp"&gt;buyButton.SetImage(&lt;br /&gt;     UIImage.FromBundle("Images/BuyGlass.png")&lt;br /&gt;   , UIControlState.Normal);&lt;br /&gt;cancelButton.SetImage(&lt;br /&gt;     UIImage.FromBundle("Images/CancelGlass.png")&lt;br /&gt;   , UIControlState.Normal);&lt;/pre&gt;&lt;br /&gt;Don't forget to make the &lt;b&gt;Build Action: Content&lt;/b&gt; for your image files! And remember, DON'T use &lt;code&gt;UIGlassButton&lt;/code&gt; in your apps directly - generate the images and include &lt;i&gt;them&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;UPDATE (May 2011):&lt;/b&gt; Miguel has posted a code-based glass button implementation which you might prefer to this pre-generated image one. See &lt;a href="http://tirania.org/monomac/archive/2011/Apr-08.html" target="20110526"&gt;Glass button for iPhone&lt;/a&gt; and the &lt;a href="https://github.com/migueldeicaza/MonoTouch.Dialog/blob/master/MonoTouch.Dialog/Utilities/GlassButton.cs" target="20110526"&gt;code on github&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-5175400510059569206?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/5175400510059569206/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2010/08/uiglassbutton-generator-in-monotouch.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/5175400510059569206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/5175400510059569206'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2010/08/uiglassbutton-generator-in-monotouch.html' title='UIGlassButton Generator in MonoTouch'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Ba76y6K7kvs/TFlMRnGbGpI/AAAAAAAABOk/GCtGi2m2fU0/s72-c/cancelbutton.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-7700399682269980088</id><published>2010-07-24T15:46:00.004+10:00</published><updated>2010-07-24T16:56:38.305+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maps'/><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='ipad'/><title type='text'>Drawing on Maps with MonoTouch</title><content type='html'>iOS4 introduced new features like &lt;a href="http://developer.apple.com/iphone/library/documentation/MapKit/Reference/MKOverlay_protocol/Reference/Reference.html#//apple_ref/doc/uid/TP40009714" target="20100724"&gt;MKOverlay&lt;/a&gt; to help draw lines/routes and shapes/polygons on the MKMapView control, however it has always been possible to add these features to maps in iOS3.&lt;br /&gt;&lt;br /&gt;Two (Objective-C) examples of displaying geometric shapes on MKMapView in iOS3 are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://spitzkoff.com/craig/?p=108"&gt;Drawing polyines or routes on a MKMapView&lt;/a&gt; by Craig Spitzkoff, which shows how to draw a line on a map from a file of latitude/longitude points.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gisnotes.com/wordpress/2009/10/iphone-devnote-14-drawing-a-point-line-polygon-on-top-of-mkmapview/" target="20100724"&gt;Drawing a Point, Line, Polygon on top of MKMapview&lt;/a&gt; by Rupert, which builds on the previous example to allow drawing your own lines/polygons on a map.&lt;/li&gt;&lt;/ul&gt;...it is these examples that I've ported to MonoTouch (as a Universal app: iPhone and iPad). You can grab the code from &lt;a href="http://github.com/conceptdev/MapStuff" target="20100724"&gt;github project &lt;b&gt;MapStuff&lt;/b&gt;&lt;/a&gt; and see some screenshots below:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/TEp9jAyxhNI/AAAAAAAABOM/Q1Ch98jHEuE/s1600/iphone.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/TEp9jAyxhNI/AAAAAAAABOM/Q1Ch98jHEuE/s320/iphone.png" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/TEp9h_X8pCI/AAAAAAAABOE/UYtIBteOPGk/s1600/ipad.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/TEp9h_X8pCI/AAAAAAAABOE/UYtIBteOPGk/s320/ipad.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I put together a class diagram to try and explain how they work (the classes shown are from the 2nd example, which allows you to draw your own shape).&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/TEqMOyoUQaI/AAAAAAAABOU/IkRCgs7MxBI/s1600/DrawMap.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="20100724"&gt;&lt;img border="0" height="240" hw="true" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/TEqMOyoUQaI/AAAAAAAABOU/IkRCgs7MxBI/s400/DrawMap.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Please remember all the hard work here has been done by the original authors. All credit goes to them. Any bugs in the MonoTouch code are mine... let me know if you find any.&lt;br /&gt;&lt;br /&gt;iOS4 examples to follow...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-7700399682269980088?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/7700399682269980088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2010/07/drawing-on-maps-with-monotouch.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/7700399682269980088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/7700399682269980088'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2010/07/drawing-on-maps-with-monotouch.html' title='Drawing on Maps with MonoTouch'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ba76y6K7kvs/TEp9jAyxhNI/AAAAAAAABOM/Q1Ch98jHEuE/s72-c/iphone.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-1532504029345896915</id><published>2010-07-18T20:04:00.003+10:00</published><updated>2010-07-24T16:57:20.859+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='internationalization'/><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='mono'/><category scheme='http://www.blogger.com/atom/ns#' term='localization'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='ipad'/><title type='text'>More MonoTouch Machine-translation Madness!</title><content type='html'>In addition to the recent &lt;a href="http://conceptdev.blogspot.com/2010/07/twitestacion-monotouch-tweetstation-en.html" target="20100718"&gt;dodgy Spanish localization&lt;/a&gt;, my &lt;a href="http://github.com/conceptdev/TweetStation" target="20100718"&gt;TweetStation fork&lt;/a&gt; now has dodgy French, Japanese, German and Italian translations (courtesy of the &lt;a href="http://www.microsofttranslator.com/" target="20100718"&gt;Microsoft Translator&lt;/a&gt; &lt;a href="http://www.microsofttranslator.com/dev/" target="20100718"&gt;API&lt;/a&gt; that was introduced at MIX10). Here's how they look:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/TELPSfpKgUI/AAAAAAAABNk/U5drRgQQxZQ/s1600/fr.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/TELPSfpKgUI/AAAAAAAABNk/U5drRgQQxZQ/s200/fr.png" width="133" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/TELPTh0L6-I/AAAAAAAABNs/hUja52rR21A/s1600/ja.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/TELPTh0L6-I/AAAAAAAABNs/hUja52rR21A/s200/ja.png" width="133" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/TELPUjkZV2I/AAAAAAAABN0/iNe_j0efCqs/s1600/de.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/TELPUjkZV2I/AAAAAAAABN0/iNe_j0efCqs/s200/de.png" width="133" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/TELPVtBjR0I/AAAAAAAABN8/x-CZMr46Tvk/s1600/it.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/TELPVtBjR0I/AAAAAAAABN8/x-CZMr46Tvk/s200/it.png" width="133" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The following two code snippets were added to &lt;a href="http://github.com/conceptdev/ngenstrings" target="20100718"&gt;ngenstrings&lt;/a&gt; so that once the text has been extracted from TweetStation, it is automatically translated and written to &lt;code&gt;.strings&lt;/code&gt; files ready for inclusion in the correctly-named &lt;code&gt;.lproj&lt;/code&gt; folders (this code hasn't been committed to github - but it should be easy to add to your local copy).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;add code to the end of &lt;code&gt;MainClass.Main&lt;/code&gt;&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;string[] languages = new string[]{"fr","ja","it","de"};&lt;br /&gt;foreach (var language in languages)&lt;br /&gt;{&lt;br /&gt;   foreach (var table in tables.Values)&lt;br /&gt;   {&lt;br /&gt;      foreach (LocalizedString locstring in table.Values)&lt;br /&gt;      {&lt;br /&gt;         locstring.Value = Translate(locstring.Key, language);&lt;br /&gt;      }&lt;br /&gt;      table.WriteStringsFile(assemblyName, outputFormat, language);&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;add method to &lt;code&gt;MainClass&lt;/code&gt;&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;//http://msdn.microsoft.com/en-us/library/ff512421.aspx&lt;br /&gt;static string Translate (string text, string toLanguageCode)&lt;br /&gt;{&lt;br /&gt;   string appId = "&lt;b&gt;REGISTER_AND_INSERT_YOUR_APPID&lt;/b&gt;";&lt;br /&gt;   string translation = text;&lt;br /&gt;   text = text.Replace(" ", "%20").Replace("&amp;amp;", "").Replace("#","%3F");&lt;br /&gt;&lt;br /&gt;   string detectUri = "http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=" + appId +&lt;br /&gt;  "&amp;amp;text=" + text + "&amp;amp;from=en&amp;amp;to=" + toLanguageCode;&lt;br /&gt;   Console.WriteLine(detectUri);&lt;br /&gt;   try {&lt;br /&gt;      System.Net.HttpWebRequest httpWebRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(detectUri);&lt;br /&gt;      System.Net.WebResponse resp = httpWebRequest.GetResponse();&lt;br /&gt;      Stream strm = resp.GetResponseStream();&lt;br /&gt;      StreamReader reader = new System.IO.StreamReader(strm);&lt;br /&gt;      translation = reader.ReadToEnd();&lt;br /&gt;   }&lt;br /&gt;   catch (Exception e)&lt;br /&gt;   {&lt;br /&gt;      Console.Write("Translation failed for " + text + " - " + e.Message);&lt;br /&gt;   }&lt;br /&gt;   return translation;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Hopefully that gives you some ideas (or inspiration) on how to increase the market for your apps across the world. Remember that machine-translation is NOT a substitute for a professional human translation, however it can be useful to test your application's ability to handle and display different languages (eg. the size of the strings, etc).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-1532504029345896915?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/1532504029345896915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2010/07/more-monotouch-machine-translation.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/1532504029345896915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/1532504029345896915'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2010/07/more-monotouch-machine-translation.html' title='More MonoTouch Machine-translation Madness!'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Ba76y6K7kvs/TELPSfpKgUI/AAAAAAAABNk/U5drRgQQxZQ/s72-c/fr.png' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-901669275412928566</id><published>2010-07-16T22:12:00.008+10:00</published><updated>2010-07-24T16:58:09.996+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='internationalization'/><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='mono'/><category scheme='http://www.blogger.com/atom/ns#' term='localization'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='ipad'/><title type='text'>TwitEstaçion: MonoTouch TweetStation en español</title><content type='html'>&lt;img align="left" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/TEBH7N6Pe1I/AAAAAAAABMU/aJC_J0jh6Do/s320/Screen+shot+2010-07-16+at+9.49.24+PM.png" /&gt; If you are a MonoTouch developer then you should already be familiar with the two subjects of this post:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://tirania.org/blog/" target="20100716"&gt;Miguel's&lt;/a&gt; awesome &lt;a href="http://github.com/migueldeicaza/TweetStation/" target="20100716"&gt;TweetStation&lt;/a&gt; open-source/MonoTouch Twitter client (also on &lt;a href="http://itunes.apple.com/us/app/tweetstation/id375611783?mt=8" target="20100716"&gt;iTunes&lt;/a&gt;); and&lt;/li&gt;&lt;li&gt; the recent release of the &lt;a href="http://www.amazon.com/dp/047063782X?tag=conce0d-20&amp;amp;camp=213381&amp;amp;creative=390973&amp;amp;linkCode=as4&amp;amp;creativeASIN=047063782X&amp;amp;adid=05Z0Z6V6A7K5YCRZ5XXW&amp;amp;" target="20100716"&gt;Professional iPhone Development with MonoTouch/c#&lt;/a&gt; book from &lt;a href="http://www.wrox.com/" target="20100716"&gt;Wrox&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;It just so happens that &lt;b&gt;Chapter 12 - Localizing for an International Audience&lt;/b&gt; of &lt;a href="http://www.amazon.com/dp/047063782X?tag=conce0d-20&amp;amp;camp=213381&amp;amp;creative=390973&amp;amp;linkCode=as4&amp;amp;creativeASIN=047063782X&amp;amp;adid=05Z0Z6V6A7K5YCRZ5XXW&amp;amp;" target="20100716"&gt;the book&lt;/a&gt; introduces a small utility called &lt;a href="http://github.com/conceptdev/ngenstrings" target="20100716"&gt;ngenstrings&lt;/a&gt; that helps you to translate your application into other languages. Today I updated &lt;a href="http://github.com/conceptdev/ngenstrings" target="20100716"&gt;ngenstrings&lt;/a&gt; to use the latest &lt;a href="http://github.com/jbevain/cecil" target="20100716"&gt;Mono.Cecil&lt;/a&gt; version, and to test it out I decided to have a go at localizing TweetStation into Spanish. You can download the &lt;a href="http://gist.github.com/478264" target="20100716"&gt;Localizable.strings&lt;/a&gt;&amp;nbsp;file that was created (and translated courtesy of Bing). Here's a screenshot showing where it fits into the solution:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/TEBH-VRPLAI/AAAAAAAABMc/WimKuuq4tXg/s1600/Screen+shot+2010-07-16+at+9.45.50+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/TEBH-VRPLAI/AAAAAAAABMc/WimKuuq4tXg/s320/Screen+shot+2010-07-16+at+9.45.50+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;...and here are a couple of screenshots showing &lt;b&gt;TwitEstaçion&lt;/b&gt; in action ;-)&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/TEBIB2nYxCI/AAAAAAAABMs/gZKFB3eyW5E/s1600/Screen+shot+2010-07-16+at+9.40.33+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/TEBIB2nYxCI/AAAAAAAABMs/gZKFB3eyW5E/s320/Screen+shot+2010-07-16+at+9.40.33+PM.png" width="213" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/TEBIAo_JluI/AAAAAAAABMk/rY4S7SjP8JI/s1600/Screen+shot+2010-07-16+at+9.39.34+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/TEBIAo_JluI/AAAAAAAABMk/rY4S7SjP8JI/s320/Screen+shot+2010-07-16+at+9.39.34+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;NOTE: Miguel had already made a good start building an internationalized app - many of his strings were wrapped in a &lt;code&gt;Locale.GetText()&lt;/code&gt; method which was easy for me to work with. &lt;i&gt;None of his code needed to change except for Locale.Get() and Locale.Format()&lt;/i&gt; to add &lt;code&gt;NSBundle.MainBundle.LocalizedString(str,"");&lt;/code&gt;&lt;br /&gt;NOTE2: this was a MACHINE TRANSLATION - of course you would arrange for a real person to translate your apps before taking them to the AppStore!&lt;br /&gt;NOTE3: I have not translated 100% of Miguel's app - this is for demonstration purposes at the moment.&lt;br /&gt;NOTE4: It's called &lt;i&gt;TwitEstaçion&lt;/i&gt; because "TweetEstaçion" is too long for the iPhone home screen, and gets shortened unreadably. I don't speak Spanish so who knows if that makes any sense at all!&lt;br /&gt;&lt;br /&gt;UPDATE: a few more screenshots... (again, apologies for the machine translation:)&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/TEBSDSB7qHI/AAAAAAAABNM/LsbifbC9kfM/s1600/ajustes.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/TEBSDSB7qHI/AAAAAAAABNM/LsbifbC9kfM/s320/ajustes.png" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/TEBSEFjPOuI/AAAAAAAABNU/FNWMEthlI3Q/s1600/buscar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/TEBSEFjPOuI/AAAAAAAABNU/FNWMEthlI3Q/s320/buscar.png" width="214" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/TEBSFJIikaI/AAAAAAAABNc/H6-p2xVZgTI/s1600/cuentas.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/TEBSFJIikaI/AAAAAAAABNc/H6-p2xVZgTI/s320/cuentas.png" /&gt;&lt;/a&gt;&lt;/div&gt;UPDATE2: localized code forked from TweetStation main now available &lt;a href="http://github.com/conceptdev/TweetStation" target="20100716"&gt;on github&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-901669275412928566?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/901669275412928566/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2010/07/twitestacion-monotouch-tweetstation-en.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/901669275412928566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/901669275412928566'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2010/07/twitestacion-monotouch-tweetstation-en.html' title='TwitEstaçion: MonoTouch TweetStation en español'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ba76y6K7kvs/TEBH7N6Pe1I/AAAAAAAABMU/aJC_J0jh6Do/s72-c/Screen+shot+2010-07-16+at+9.49.24+PM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-5263660239074364201</id><published>2010-07-09T21:25:00.003+10:00</published><updated>2010-07-24T16:56:00.030+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='ipad'/><title type='text'>MonoTouch port of TDBadgedCell</title><content type='html'>I recently wanted to add an 'item count' to a UITableView in one of my iPhone/iPad projects and thought it would be nice to match the grey/encircled 'badge' used in the Mail application. &lt;br /&gt;&lt;br /&gt;Happily, &amp;nbsp;I found (via &lt;a href="http://www.tuaw.com/2010/01/07/iphone-devsugar-simple-table-badges/" target="20100709"&gt;The Unofficial Apple Weblog&lt;/a&gt;) that Tim Davies had the same idea and already done the hard work, albeit in Objective-C. Tim's code for &lt;b&gt;TDBadgedCell&lt;/b&gt; is on &lt;a href="http://github.com/tmdvs/TDBadgedCell" target="20100709"&gt;github&lt;/a&gt; (you can help him out and &lt;a href="http://wiki.github.com/tmdvs/TDBadgedCell" target="20100709"&gt;donate&lt;/a&gt;, too), as is the &lt;a href="http://github.com/conceptdev/TDBadgedCellSharp" target="20100709"&gt;MonoTouch/C# port: TDBadgedCellSharp&lt;/a&gt;. Both produce the same output (shown below)&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/TDb_w5syh4I/AAAAAAAABMM/erW--PSeMfE/s1600/TDBadgedCellSharp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/TDb_w5syh4I/AAAAAAAABMM/erW--PSeMfE/s320/TDBadgedCellSharp.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The important stuff (&lt;code&gt;TDBadgeView&lt;/code&gt; and &lt;code&gt;TDBadgeCell&lt;/code&gt;) is in &lt;a href="http://github.com/conceptdev/TDBadgedCellSharp/raw/master/TDBadgedCell.cs" target="20100709"&gt;TDBadgedCell.cs&lt;/a&gt; - the rest of the &lt;a href="http://github.com/conceptdev/TDBadgedCellSharp" target="20100709"&gt;project&lt;/a&gt; is purely for demonstration purposes.&lt;br /&gt;&lt;br /&gt;Here's a very simple example of how to use the badged cell (warning: doesn't show &lt;code&gt;DequeueReusableCell&lt;/code&gt; which you would normally use in the &lt;code&gt;GetCell&lt;/code&gt; method)...&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:csharp"&gt;public override UITableViewCell GetCell &lt;br /&gt;   (UITableView tableView, NSIndexPath indexPath)&lt;br /&gt;{&lt;br /&gt;   TDBadgedCell cell = new TDBadgedCell (UITableViewCellStyle.Subtitle, "Cell");&lt;br /&gt;   cell.TextLabel.Text = contents[indexPath.Row].Title;&lt;br /&gt;   cell.TextLabel.Font = UIFont.BoldSystemFontOfSize (14);&lt;br /&gt;&lt;br /&gt;   cell.DetailTextLabel.Text = contents[indexPath.Row].Detail;&lt;br /&gt;   cell.DetailTextLabel.Font = UIFont.SystemFontOfSize (13);&lt;br /&gt;&lt;br /&gt;   cell.Accessory = UITableViewCellAccessory.DisclosureIndicator;&lt;br /&gt;   cell.BadgeNumber = Convert.ToInt32 (contents[indexPath.Row].Badge);&lt;br /&gt;&lt;br /&gt;   if (indexPath.Row == 1)&lt;br /&gt;      cell.BadgeColor = UIColor.FromRGBA (1.000f, 0.397f, 0.419f, 1.000f);&lt;br /&gt;   if (indexPath.Row == 2)&lt;br /&gt;      cell.BadgeColor = UIColor.FromWhiteAlpha (0.783f, 1.000f);&lt;br /&gt;   return cell;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Thanks Tim!&lt;br /&gt;&lt;br /&gt;..and finally, if you didn't notice the cover at the top of this page or seen the &lt;a href="http://twitter.com/conceptdev"&gt;tweets&lt;/a&gt;, "my" book (and Wally, Chris, Martin &amp;amp; Rory's :) is now available from Amazon (and other locations, in paper or PDF)!&lt;br /&gt;&lt;iframe align="left" frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm.amazon.com/e/cm?t=conce0d-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=bpl&amp;amp;asins=047063782X&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr" style="align: left; height: 245px; padding-right: 10px; padding-top: 5px; width: 131px;"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-5263660239074364201?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/5263660239074364201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2010/07/monotouch-port-of-tdbadgedcell.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/5263660239074364201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/5263660239074364201'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2010/07/monotouch-port-of-tdbadgedcell.html' title='MonoTouch port of TDBadgedCell'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ba76y6K7kvs/TDb_w5syh4I/AAAAAAAABMM/erW--PSeMfE/s72-c/TDBadgedCellSharp.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-3256882522118584636</id><published>2010-05-03T21:59:00.008+10:00</published><updated>2010-05-04T21:55:59.274+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='ipad'/><title type='text'>iPad 'infinite scrolling' with MonoTouch</title><content type='html'>Tonights exercise proves that sometimes it's worth taking time out to 'design' a chunk of code before writing it. Here's the "design"... can you see what it's trying to do?&lt;br /&gt;&lt;a target="20100503" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ba76y6K7kvs/S968YslLWpI/AAAAAAAABLc/pKKeEzGBBCo/s1600/algorithm_design.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 382px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/S968YslLWpI/AAAAAAAABLc/pKKeEzGBBCo/s400/algorithm_design.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5467014130144336530" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Okay, I'll tell you: I'm trying to create an 'infinite' (well, just a configurable number) of scrollable pages that are rendered with UIWebView controls. I want to use the minimum number of controls for performance and memory but I also want a nice scrolling experience where the next and previous pages are aways pre-loaded. As you scroll left and right, the UIWebViews are shuffled around (X-coordinates only) to create an effect similar to the Time magazine 'app'. &lt;br /&gt;&lt;br /&gt;Amazingly it worked out pretty quickly - here are a couple of screens to "prove" that it scrolls left &amp; right as expected. It's using a &lt;a href="http://www.csscripting.com/wiki/index.php?title=CSS3_Multi_Column" target="20100503"&gt;"CSS3" multi-column hack&lt;/a&gt; in the Html, but that's another story...&lt;br /&gt;&lt;a target="20100503" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Ba76y6K7kvs/S968ZP6T8SI/AAAAAAAABLk/F9csU0INLS4/s1600/smh_scrolling.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 176px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/S968ZP6T8SI/AAAAAAAABLk/F9csU0INLS4/s400/smh_scrolling.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5467014139628220706" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And here are the 'important bits' of the code. I'm not publishing the entire source right now - the app still has a long way to go - but you get the idea... I hope. I only had a brief look around for existing examples so if you've seen a better one, let me know!&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;// declarations&lt;br /&gt;UIScrollView MyScrollView;&lt;br /&gt;UIWebView[] WebViewArray = new UIWebView[3];&lt;br /&gt;int[] WebViewHasPage = new int[]{0,1,2};&lt;br /&gt;int NumberOfPages = 8; // news01.html .. news08.html&lt;br /&gt;...&lt;br /&gt;// ViewController ctor&lt;br /&gt;var bounds = new RectangleF(0, 0, View.Bounds.Width, View.Bounds.Height);&lt;br /&gt;MyScrollView = new UIScrollView(bounds);&lt;br /&gt;RectangleF scrollFrame = MyScrollView.Frame; // start with screen size&lt;br /&gt;scrollFrame.Width = PageWidth * NumberOfPages; // then make the content&lt;br /&gt;MyScrollView.ContentSize = scrollFrame.Size; // 8 screens wide&lt;br /&gt;MyScrollView.Scrolled += ScrollViewScrolled; // and attach event handler&lt;br /&gt;for (int i = 0; i &lt; 3; i++)&lt;br /&gt;{ // lay out three web controls to shuffle around&lt;br /&gt; webViewFrame.X = PageWidth * i;&lt;br /&gt; WebViewArray[i] = new UIWebView(webViewFrame);&lt;br /&gt; WebViewArray[i].ScalesPageToFit = false;&lt;br /&gt; var u = NSUrl.FromFilename(basedir+"news0"+(i+1)+".html");&lt;br /&gt; var r = new NSUrlRequest(u);&lt;br /&gt; WebViewArray[i].LoadRequest(r);&lt;br /&gt; MyScrollView.AddSubview (WebViewArray[i]);&lt;br /&gt;}&lt;br /&gt;...&lt;br /&gt;// and the method that does the shuffling&lt;br /&gt;private void ScrollViewScrolled (object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt; UIScrollView sv = (UIScrollView)sender;&lt;br /&gt; double page = Math.Floor ((sv.ContentOffset.X - sv.Frame.Width / 2) / sv.Frame.Width) + 1;&lt;br /&gt; int LastPage = CurrentPage;&lt;br /&gt; int NewPage = CurrentPage;&lt;br /&gt; if (sv.ContentOffset.X % PageWidth == 0) NewPage = (int)page; // moved pages!&lt;br /&gt; if (NewPage &gt;= 0 &amp;&amp; NewPage &lt; NumberOfPages)&lt;br /&gt; {&lt;br /&gt;  pageControl.CurrentPage = NewPage;&lt;br /&gt;  CurrentPage = NewPage;&lt;br /&gt;  int updatePage = 0;&lt;br /&gt;  bool shouldMove = false;&lt;br /&gt;  if (NewPage &gt; LastPage)&lt;br /&gt;  {// moving right&lt;br /&gt;   updatePage = NewPage + 1; shouldMove = true;&lt;br /&gt;  }&lt;br /&gt;  else if (NewPage &lt; LastPage)&lt;br /&gt;  {// moving left &lt;br /&gt;   updatePage = CurrentPage - 1; shouldMove = true;&lt;br /&gt;  }&lt;br /&gt;  if (shouldMove &amp; (updatePage &gt;= 0) &amp; (updatePage &lt; NumberOfPages))&lt;br /&gt;  {&lt;br /&gt;   int webViewSlot = updatePage % 3; &lt;br /&gt;   if (WebViewHasPage[webViewSlot] == updatePage) return; // already has it&lt;br /&gt;   else WebViewHasPage[webViewSlot] = updatePage;&lt;br /&gt;   var url = NSUrl.FromFilename(BaseDirectory+"news0"+(updatePage+1)+".html");&lt;br /&gt;   var request = new NSUrlRequest(url);&lt;br /&gt;   WebViewArray[webViewSlot].LoadRequest(request);&lt;br /&gt;   var rect = new RectangleF (&lt;br /&gt;      WebViewArray[0].Frame.Width * updatePage&lt;br /&gt;    , WebViewArray[webViewSlot].Frame.Y&lt;br /&gt;    , WebViewArray[webViewSlot].Frame.Width&lt;br /&gt;    , WebViewArray[webViewSlot].Frame.Height);&lt;br /&gt;   WebViewArray[webViewSlot].Frame = rect;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt;  Console.WriteLine ("Scrolled a little too far, to page " + page);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-3256882522118584636?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/3256882522118584636/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2010/05/ipad-infinite-scrolling-with-monotouch.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/3256882522118584636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/3256882522118584636'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2010/05/ipad-infinite-scrolling-with-monotouch.html' title='iPad &apos;infinite scrolling&apos; with MonoTouch'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ba76y6K7kvs/S968YslLWpI/AAAAAAAABLc/pKKeEzGBBCo/s72-c/algorithm_design.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-4496968635893419402</id><published>2010-03-09T20:36:00.017+11:00</published><updated>2010-06-06T18:55:32.040+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='ipodtouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Anatomy of a c# iPhone app (with MonoTouch)</title><content type='html'>Wow - it has been a long time since my last post... and with good reason ;)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.amazon.com/gp/product/047063782X?ie=UTF8&amp;tag=conce0d-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=047063782X"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 128px; height: 160px; FLOAT: left; MARGIN: 0px 10px 10px 0px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/TAthnzgcV8I/AAAAAAAABLs/32fs4fXpdnk/s400/51Bclx3veOL._SL160_.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5479580708095416258" /&gt;&lt;/a&gt;Firstly I've been busily writing (along with Wally, Chris, Martin &amp;amp; Rory) for Wrox' upcoming &lt;a href="http://www.amazon.com/gp/product/047063782X?ie=UTF8&amp;tag=conce0d-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=047063782X"&gt;&lt;b&gt;Professional iPhone Programming with MonoTouch and .NET/C#&lt;/b&gt;&lt;/a&gt; which is available for pre-order on &lt;a href="http://www.amazon.com/gp/product/047063782X?ie=UTF8&amp;tag=conce0d-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=047063782X"&gt;Amazon&lt;/a&gt;. If you are interested in developing for the iPhone using C# and the .NET Framework it should be a great addition to all the resources already out there on the web.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/S5YaXxsqbzI/AAAAAAAABKk/J1_Ehh4TjQ4/s1600-h/MIX10_logo.png" target="20100308"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 72px; FLOAT: left; HEIGHT: 82px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446569795131174706" border="0" alt="" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/S5YaXxsqbzI/AAAAAAAABKk/J1_Ehh4TjQ4/s200/MIX10_logo.png" /&gt;&lt;/a&gt;&lt;a href="itms://itunes.apple.com/us/app/mix10/id357234402?mt=8" target="20100308"&gt;&lt;img align="right" src="http://mix10.confapp.com/Images/app-store_150x49.png" /&gt;&lt;/a&gt;Secondly I've been working on an iPhone app for &lt;a href="http://live.visitmix.com/" target="20100308"&gt;MIX10&lt;/a&gt; in Las Vegas next week (with help from Chris, Miguel &amp;amp; Geoff). It is now &lt;a href="http://itunes.apple.com/au/app/mix10/id357234402?mt=8" target="20100308"&gt;&lt;b&gt;available FREE on the AppStore&lt;/b&gt;&lt;/a&gt; and has a website at &lt;a href="http://mix10.confapp.com/" target="20100308"&gt;mix10.confapp.com&lt;/a&gt;. Whether you are heading to MIX or just curious about C# and &lt;a href="http://monotouch.net/" target="20100308"&gt;MonoTouch&lt;/a&gt; on the iPhone, why not download and give it a try?&lt;br /&gt;&lt;br /&gt;Since the MIX10.app was first 'announced' on &lt;a href="http://twitter.com/#search?q=%23mix10" target="20100308"&gt;twitter #MIX10&lt;/a&gt; there have been a number of requests for the source code. Unfortunately the source isn't public at the moment, however that doesn't mean we can't talk about "how it works". To start with, the MIX10.app is based on two previous &lt;b&gt;iPhone apps written in C# with &lt;a href="http://monotouch.net/" target="20100308"&gt;MonoTouch&lt;/a&gt;&lt;/b&gt;, and whose source code &lt;i&gt;is&lt;/i&gt; available: &lt;ul&gt;&lt;li&gt;&lt;b&gt;Monospace09&lt;/b&gt; code is on &lt;a href="http://github.com/conceptdev/Monospace09" target="20100308"&gt;github&lt;/a&gt; and is discussed on my &lt;a href="http://conceptdev.blogspot.com/2009/10/monotouch-for-monospace.html" target="20100308"&gt;blog&lt;/a&gt; (and &lt;a href="http://conceptdev.blogspot.com/2009/10/monotouch-flip-flop-with-uiview.html" target="20100308"&gt;here&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;b&gt;PDC09&lt;/b&gt; is on &lt;a href="http://github.com/conceptdev/PDC09" target="20100308"&gt;github&lt;/a&gt; and discussed in this &lt;a href="http://conceptdev.blogspot.com/2009/11/another-monotouch-conference-app-pdc09.html"&gt;post&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;If you have an Intel Mac (with Snow Leopard) then you can download both the Apple SDK and the MonoTouch trial version for free and get both these C# .NET examples running in the iPhone Simulator for yourself. To deploy on a real iPhone requires certificates and licences (from Apple and Novell/MonoTouch respectively).&lt;br /&gt;&lt;br /&gt;&lt;b style="COLOR: darkred"&gt;MIX10.app&lt;/b&gt;&lt;br /&gt;Here's the overall class diagram for the MIX10.app (with the views shown too). Even without seeing the code it's clear that the classes themselves are not overly complex (ie. few methods are required; and inheritance can be leveraged to share common functionality).&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/S5YhojaQiwI/AAAAAAAABLM/guJuZfRSyJI/s1600-h/ClassDiagram2a.png" target="20100308"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 286px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446577779935054594" border="0" alt="" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/S5YhojaQiwI/AAAAAAAABLM/guJuZfRSyJI/s400/ClassDiagram2a.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The MIX10.app also uses Miguel's &lt;a href="http://github.com/migueldeicaza/MonoTouch.Dialog" target="20100308"&gt;MonoTouch.Dialog framwork&lt;/a&gt; and he's posted a snippet of code on &lt;a href="http://gist.github.com/312933" target="20100308"&gt;gist.github&lt;/a&gt; which is responsible for this screen (on the left)&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/S5Yee3hqS7I/AAAAAAAABK0/y6t0R4voi80/s1600-h/IMG_1073.PNG" target="20100308"&gt;&lt;img align="left" style="MARGIN: 0px 10px 10px 0px; WIDTH: 134px; HEIGHT: 200px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446574315001236402" border="0" alt="" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/S5Yee3hqS7I/AAAAAAAABK0/y6t0R4voi80/s200/IMG_1073.PNG" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/S5Yezxm4-_I/AAAAAAAABK8/2N6lfvVy6T0/s1600-h/IMG_1068.PNG" target="20100308"&gt;&lt;img style="WIDTH: 134px; HEIGHT: 200px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446574674189810674" border="0" alt="" align="right" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/S5Yezxm4-_I/AAAAAAAABK8/2N6lfvVy6T0/s200/IMG_1068.PNG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And he also posted &lt;a href="http://tirania.org/blog/archive/2010/Feb-23.html" target="20100308"&gt;this code&lt;/a&gt; which creates the 'My Schedule' view on the right. Pretty neat use of Linq, eh? I'm not sure I've seen such an expressive user-interface expressed in so few lines of code before...&lt;pre style="PADDING-BOTTOM: 15px; LINE-HEIGHT: 110%; MARGIN: 15px; PADDING-LEFT: 15px; PADDING-RIGHT: 15px; FONT-FAMILY: 'Courier New', Courier; FONT-SIZE: small; PADDING-TOP: 15px"&gt;public class FavoritesViewController : DialogViewController {&lt;br /&gt;  public FavoritesViewController () : base (null) { }&lt;br /&gt;  public override void ViewWillAppear (bool animated)&lt;br /&gt;  {&lt;br /&gt;    var favs = AppDelegate.UserData.GetFavoriteCodes();&lt;br /&gt;    Root = new RootElement ("Favorites") {&lt;br /&gt;      from s in AppDelegate.ConferenceData.Sessions&lt;br /&gt;        where favs.Contains(s.Code)&lt;br /&gt;        group s by s.Start into g&lt;br /&gt;        orderby g.Key&lt;br /&gt;        select new Section (MakeCaption ("", g.Key)) {&lt;br /&gt;          from hs in g&lt;br /&gt;            select (Element) new SessionElement (hs)&lt;br /&gt;        }&lt;br /&gt;    };&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;The object model closely follows the data available from the &lt;a href="http://api.visitmix.com/"&gt;api.visitmix.com&lt;/a&gt; site's OData and RSS feeds. These are plain vanilla C# objects which also run on the server to download and package the data for the iPhone - the object graph is serialized by a .NET application on Windows Server 2003, downloaded by the WebClient class on the iPhone (thanks to MonoTouch) and &lt;i&gt;de&lt;/i&gt;-serialized ready for display. A perfect example of the cross-platform possibilities facilitated by MonoTouch and having the .NET framework available on both server and mobile device.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/S5YiCkmt9EI/AAAAAAAABLU/tGmYf7brRxI/s1600-h/ClassDiagramObjects.png" target="20100308"&gt;&lt;img style="WIDTH: 357px; HEIGHT: 400px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446578226932347970" border="0" alt="" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/S5YiCkmt9EI/AAAAAAAABLU/tGmYf7brRxI/s400/ClassDiagramObjects.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Finally, here's a quick overview of ALL the screens in the app. Did I mention you should &lt;a href="http://itunes.apple.com/au/app/mix10/id357234402?mt=8" target="20100308"&gt;give it a try&lt;/a&gt;?&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/S5YhGlPhriI/AAAAAAAABLE/y7V5bJZ9YRI/s1600-h/ALL.png" target="20100308"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 381px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5446577196311359010" border="0" alt="" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/S5YhGlPhriI/AAAAAAAABLE/y7V5bJZ9YRI/s400/ALL.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;...and if you're a Windows Phone Series 7 fan-in-the-making, it should be obvious that having a shared set of services and functionality in C# that can be deployed across iPhones with MonoTouch, and Silverlight/Windows Phone 7 with only UI code needing to be customized is a great way to achieve maximum reach for your apps. The &lt;a href="http://monotouch.net/Roadmap" target="20100308"&gt;MonoTouch Roadmap&lt;/a&gt; is also targetting a Q3 release of &lt;code&gt;MonoDroid&lt;/code&gt;, so with a bit of imagination it isn't hard to see where the future of cross-mobile-device development is heading...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-4496968635893419402?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/4496968635893419402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2010/03/anatomy-of-c-iphone-app-with-monotouch.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/4496968635893419402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/4496968635893419402'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2010/03/anatomy-of-c-iphone-app-with-monotouch.html' title='Anatomy of a c# iPhone app (with MonoTouch)'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Ba76y6K7kvs/TAthnzgcV8I/AAAAAAAABLs/32fs4fXpdnk/s72-c/51Bclx3veOL._SL160_.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-4263049316115140446</id><published>2010-01-16T16:39:00.010+11:00</published><updated>2010-01-19T21:54:02.964+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='ipodtouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>MonoTouch MapKit.Delegate-precated</title><content type='html'>An update to &lt;a href="http://monotouch.net/" target="20100116"&gt;MonoTouch&lt;/a&gt; (1.4.4) was released today with &lt;a href="http://monotouch.net/Releases/MonoTouch_1.4.4" target="20100116"&gt;these changes/improvements&lt;/a&gt; (actually 1.4.5 was released a day later). One in particular caught my eye, since I've previously &lt;a href="http://conceptdev.blogspot.com/2009/09/monotouch-mapkit-103.html" target="20100116"&gt;blogged about MapKit&lt;/a&gt; in MonoTouch.&lt;br /&gt;&lt;blockquote&gt;MKMapView now has C# style events&lt;/blockquote&gt;&lt;br /&gt;So what does that mean? Basically the crafty team at Novell have turned the Apple SDK "pattern" of using a &lt;code&gt;MKMapViewDelegate&lt;/code&gt; class to respond to "events" on its head, and instead exposed familiar .NET events on &lt;code&gt;MKMapView&lt;/code&gt; itself. *&lt;br /&gt;&lt;br /&gt;Here's a comparison of the 'old' and 'new' MKMapView class:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ba76y6K7kvs/S1WNRSZhvNI/AAAAAAAABKE/phznn0kYPJQ/s1600-h/MKMapViewEvents.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 390px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/S1WNRSZhvNI/AAAAAAAABKE/phznn0kYPJQ/s400/MKMapViewEvents.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5428400254001200338" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here are two 'example' delegate methods that work in 1.4.4 (and .5). Firstly here's an example of wiring up one of the "new" events &lt;code&gt;CalloutAccessoryControlTapped&lt;/code&gt;. NOTE the &lt;b&gt;+=&lt;/b&gt; used to attach the delegate to the event.&lt;br /&gt;&lt;pre&gt;Map.CalloutAccessoryControlTapped&lt;span style="background:yellow"&gt; += &lt;/span&gt;&lt;br /&gt;      delegate(object sender, MKMapViewAccessoryTappedEventArgs e)&lt;br /&gt;{&lt;br /&gt;   MyAnnotation myAnn = e.View.Annotation as MyAnnotation;&lt;br /&gt;   using (var alert = new UIAlertView (myAnn.Title,&lt;br /&gt;     myAnn.Subtitle + " clicked", null, "OK", null))&lt;br /&gt;   {&lt;br /&gt;      alert.Show();&lt;br /&gt;   }&lt;br /&gt;};&lt;/pre&gt;The second example is probably the most common one - &lt;code&gt;GetViewForAnnotation&lt;/code&gt; - which you will need to provide if you want to do any sort of customization of your pins/callouts. NOTE how it is assigned with an equals sign and has a return value!&lt;pre&gt;Map.GetViewForAnnotation&lt;span style="background:yellow"&gt; = &lt;/span&gt;delegate (MKMapView mapView, NSObject annotation) {&lt;br /&gt;   if (annotation is MKUserLocation) return null;&lt;br /&gt;   MyAnnotation myAnn = annotation as MyAnnotation;&lt;br /&gt;   var annView = mapView.DequeueReusableAnnotation ("pin");&lt;br /&gt;   if (annView == null) {&lt;br /&gt;      var pinView = new MKPinAnnotationView(myAnn, "pin");&lt;br /&gt;      pinView.AnimatesDrop = true;&lt;br /&gt;      pinView.CanShowCallout = true;&lt;br /&gt;      annView = pinView;&lt;br /&gt;   }&lt;br /&gt;   else &lt;br /&gt;   {&lt;br /&gt;     annView.Annotation = annotation;&lt;br /&gt;   }&lt;br /&gt;   &lt;span style="background:yellow"&gt;return annView;&lt;/span&gt;&lt;br /&gt;};&lt;/pre&gt;&lt;br /&gt;&lt;i&gt;* imagine these are "air quotes" in this paragraph&lt;/i&gt;&lt;br /&gt;&lt;span style="color:darkred"&gt;p.s. This post has been updated since the comments below. The first two kinda don't make sense now... Thanks for the advice mdi.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-4263049316115140446?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/4263049316115140446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2010/01/monotouch-mapkitdelegate-precated.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/4263049316115140446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/4263049316115140446'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2010/01/monotouch-mapkitdelegate-precated.html' title='MonoTouch MapKit.Delegate-precated'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ba76y6K7kvs/S1WNRSZhvNI/AAAAAAAABKE/phznn0kYPJQ/s72-c/MKMapViewEvents.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-7552030689880936153</id><published>2009-12-27T22:30:00.006+11:00</published><updated>2009-12-27T23:14:31.096+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='moonlight'/><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><title type='text'>Moonlight 2.0...</title><content type='html'>Decided it was time to take another look at &lt;a href="http://www.mono-project.com/Moonlight"&gt;Moonlight&lt;/a&gt; (since 2.0 was released on 17-Dec-09), so I grabbed a &lt;a href="http://www.go-mono.com/mono-downloads/download.html" target="20091227"&gt;Virtual PC image download&lt;/a&gt; and within a few minutes was testing my existing Silverlight sites on Linux! The pre-installed software (Firefox, Moonlight, even MonoDevelop) makes 'getting started' super-easy.&lt;br /&gt;&lt;br /&gt;Happily, &lt;a href="http://racereplay.net/City2Surf" target="20091227"&gt;RaceReplay.net&lt;/a&gt; works fine -- although it uses the 'CTP' of Microsoft's Map control - the RTW requires SL3 which might throw a spanner in the works :-(&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/SzdFY-UaaaI/AAAAAAAABJ0/qJiwzpdw2xM/s1600-h/Moonlight-C2s.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 332px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/SzdFY-UaaaI/AAAAAAAABJ0/qJiwzpdw2xM/s400/Moonlight-C2s.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5419876971911473570" /&gt;&lt;/a&gt;&lt;br /&gt;The &lt;a href="http://codeplex.com/deepearth" target="20091227"&gt;DeepEarth&lt;/a&gt; open-source DeepZoom-based map control does work, however, which is great.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://searcharoo.net/silverlight.html"&gt;Searcharoo's Silverlight UI&lt;/a&gt; breaks with &lt;code&gt;Could not load type 'BufferedStreamReader' from assembly System.Json&lt;/code&gt; so I'll have to investigate that; might have to get a different Json lib.&lt;br /&gt;&lt;br /&gt;Anyway, IMO Moonlight 2.0 is a great achievement by Novell and the &lt;a href="http://www.go-mono.com/mono-downloads/download.html" target="20091227"&gt;VPC&lt;/a&gt; is a great way for .NET developers to learn about it... have fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-7552030689880936153?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/7552030689880936153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/12/moonlight-20.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/7552030689880936153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/7552030689880936153'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/12/moonlight-20.html' title='Moonlight 2.0...'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Ba76y6K7kvs/SzdFY-UaaaI/AAAAAAAABJ0/qJiwzpdw2xM/s72-c/Moonlight-C2s.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-2814777874381435228</id><published>2009-11-10T20:07:00.006+11:00</published><updated>2010-06-06T19:46:19.038+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>iPhone Obj-C books for MonoTouch devs (first look)</title><content type='html'>&lt;span style="color:darkred"&gt;&lt;b&gt;UPDATE 6-JUN-10:&lt;/b&gt;This book &lt;a href="http://www.amazon.com/gp/product/047063782X?ie=UTF8&amp;tag=conce0d-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=047063782X"&gt;Professional iPhone Programming with MonoTouch and .NET/C#&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=conce0d-20&amp;l=as2&amp;o=1&amp;a=047063782X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt; is available for pre-order on Amazon... one of the authors might be familiar :-)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:darkred"&gt;&lt;b&gt;UPDATE 2-DEC-09:&lt;/b&gt; the first MonoTouch-specific book (that I know of) is now available to purchase/download - &lt;a href="http://www.amazon.com/gp/product/B003A6RCF2?ie=UTF8&amp;tag=conce0d-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B003A6RCF2" target="_blank"&gt;Building iPhone and iPod touch Applications for the .NET/C# Developer with MonoTouch (Wrox Blox)&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=conce0d-20&amp;l=as2&amp;o=1&amp;a=B003A6RCF2" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;. I haven't had a chance to read closely yet, but it's good value at USD6.99 so definitely worth a look.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ba76y6K7kvs/Svkxvl0bNhI/AAAAAAAABIo/JccHiQwBZp4/s1600-h/iphonebooks.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 121px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/Svkxvl0bNhI/AAAAAAAABIo/JccHiQwBZp4/s200/iphonebooks.jpg" border="0" alt="iPhone Books" id="BLOGGER_PHOTO_ID_5402403921683232274" align="right" /&gt;&lt;/a&gt;I recently received yet another addition to my 'Objective-C books for iPhone Development' collection - initially started to learn Obj-C (never happened) they are now more of a reference while learning &lt;a href="http://monotouch.net" target="20091110"&gt;MonoTouch&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Firstly, I have NOT read them cover-to-cover... I've done a bit of flicking, a bit of skimming and read a chapter or two. Secondly, I'm not really evaluating them according to their original purpose - to teach Objective-C - rather I'm making a personal judgement on their suitability as reference material for .NET developers. &lt;br /&gt;&lt;br /&gt;I've listed them in their "order of usefulness" for MonoTouch .NET devs (according to me :)&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ecx.images-amazon.com/images/I/41naFIsn43L._SL160_AA115_.jpg" align="left" /&gt; &lt;a href="http://www.amazon.com/gp/product/B001TM92AW?ie=UTF8&amp;tag=conce0d-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B001TM92AW"&gt;Beginning iPhone Development: Exploring the iPhone SDK [BEGINNING IPHONE DEV]&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=conce0d-20&amp;l=as2&amp;o=1&amp;a=B001TM92AW" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;br /&gt;&lt;i&gt;Dave Mark; Jeff LaMarche&lt;/i&gt; (APress)&lt;br /&gt;&lt;br /&gt;This was the first iPhone book I purchased, so I've read it more closely than the rest. I learned quite a bit from various examples and discussions in this book - it's probably at the top of the list for this reason. The writing style is easy to read and there isn't too much emphasis on Xcode (other books do seem to focus on Xcode, the Head First one most heavily).&lt;br /&gt;&lt;br /&gt;The initial chapters are probably best replaced with a MonoTouch 'Hello World' screencast - you don't really need to know all the Xcode, pch files and @synthesize that the book discusses (and there are quite a few free resources around that cover "your first MonoTouch app").&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Pros&lt;/i&gt;&lt;br /&gt;&amp;bull; Interface Builder examples are relevant&lt;br /&gt;&amp;bull; Friendly colloquial tone&lt;br /&gt;&amp;bull; Widest variety of topics (includes localization, accelerometer)&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Cons&lt;/i&gt;&lt;br /&gt;&amp;bull; Large swaths of Objective-C in some chapters&lt;br /&gt;&amp;bull; Still need to decode Objective-C in the examples&lt;br /&gt;&lt;br /&gt;Overall, though, my favorite of the bunch.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ecx.images-amazon.com/images/I/51HunBd6F-L._SL160_PIsitb-sticker-arrow-dp,TopRight,12,-18_SH30_OU01_AA115_.jpg" align="left" /&gt; &lt;a href="http://www.amazon.com/gp/product/0321555457?ie=UTF8&amp;tag=conce0d-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0321555457"&gt;The iPhone Developer's Cookbook: Building Applications with the iPhone SDK&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=conce0d-20&amp;l=as2&amp;o=1&amp;a=0321555457" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;br /&gt;&lt;i&gt;Erica Sadun&lt;/i&gt; (Addison Wesley)&lt;br /&gt;&lt;br /&gt;I'm a big fan of Erica's from her blog and applications when the iPhone and iPod Touch first appeared and were programmable. Text is easy to read. Erica often references "when the iPhone first appeared" or "during the Beta period" - often interesting insights that add some fun to the text. There are also references to many 'undocumented' APIs - they're clearly highlighted to avoid confusion, but unfortunately they're even more difficult to use from MonoTouch than Objective-C... I felt a bit "left out" on first reading, although with btouch in MonoTouch 1.2 I'm wondering whether it might be easier to access these APIs now? (even though we're not supposed to...)&lt;br /&gt;&lt;br /&gt;Chapter 2 - Views - does a really nice job of gradually introducing various concepts, and the Objective-C is minimal. That chapter on it's own is probably worth reading for anyone coming to iPhone programming. The rest of the first half is also fairly easy to follow (View Controllers, Basic Tables) - if the examples were in C# they might be my favorite 'introduction to iphone programming' :)&lt;br /&gt;&lt;br /&gt;Towards the end of the book the amount of Objective-C does increase to a few multi-page listings that are more difficult to read (and probably beyond beginning C#ers) but overall the book is good value.&lt;br /&gt;&lt;br /&gt;There is a 2nd edition due in January 2010 which will probably address my other main concern with this book: that it pre-dates the latest iPhone OS releases and hardware. Not a big deal really, but it's always nice to have info on the latest and greatest.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ecx.images-amazon.com/images/I/419On3kwzmL._SL160_PIsitb-sticker-arrow-dp,TopRight,12,-18_SH30_OU01_AA115_.jpg" align="left" /&gt;&lt;a href="http://www.amazon.com/gp/product/0596154054?ie=UTF8&amp;tag=conce0d-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0596154054"&gt;iPhone SDK Application Development: Building Applications for the AppStore&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=conce0d-20&amp;l=as2&amp;o=1&amp;a=0596154054" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;br /&gt;&lt;i&gt;Jonathan Zdziarski&lt;/i&gt; (O'Reilly)&lt;br /&gt;&lt;br /&gt;Less "reading" in this book - rather than longer explanatory paragraphs the author uses smaller chunks of text interspersed with bullet points, callouts and small and large Objective-C listings. This actually makes it better as a reference book than a front-to-back learning tool - and that makes it more suitable for MonoTouch in my view.&lt;br /&gt;&lt;br /&gt;As with the other titles, the initial chapters cover Objective-C concepts like messaging, implementation, protocols, categories and posing(!) which you aren't likely to need as you start out with MonoTouch (although you might return to read about them later, to get your head around more complex examples). &lt;br /&gt;&lt;br /&gt;I've used the remainder of the book to 'look up' various things that I want to learn about or need examples of, usually as a backup/alternative to the material that I've found in other books or on the web. It doesn't have the breadth of "Beginning iPhone Dev" nor the easy readability of Erica's stuff, but I have definitely picked up some useful tidbits from this book.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ecx.images-amazon.com/images/I/51s7de-mrzL._SL160_PIsitb-sticker-arrow-dp,TopRight,12,-18_SH30_OU01_AA115_.jpg" align="left" /&gt; &lt;a href="http://www.amazon.com/gp/product/0596803540?ie=UTF8&amp;tag=conce0d-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0596803540"&gt;Head First iPhone Development: A Learner's Guide to Creating Objective-C Applications for the iPhone&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=conce0d-20&amp;l=as2&amp;o=1&amp;a=0596803540" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;br /&gt;&lt;i&gt;Dan Pilone; Tracey Pilone&lt;/i&gt; (O'Reilly)&lt;br /&gt;&lt;br /&gt;I love the Head First series from O'Reilly, so I was determined to like this book; and it definitely lives up to it's promise as a Head First title. The writing, imagery, exercises and screenshots are all as you'd expect and it is really good at explaining Objective-C, Xcode and Interface Builder concepts...  however that's partly what makes this volume less useful for C#ers: the writers go out of their way to explain/show how to do everything with Xcode and Interface Builder! As a MonoTouch developer I find myself only in MonoDevelop writing code &lt;i&gt;and&lt;/i&gt; building my interfaces in code... so to my dismay I find myself unable to put this book at the top of my list.&lt;br /&gt;&lt;br /&gt;It is still a fun read, and the non-techy bits (of which there are many) are extremely relevant to ALL iPhone devs. The recommendation to design your UI on paper, to follow Apple's Human Interface Guidelines, to remember to test on a Touch, and much more... if I ever decide to &lt;i&gt;really&lt;/i&gt; learn Objective-C, I'll probably come back to this book and run through all the examples from go-to-whoa since it does try to teach the language &lt;i&gt;and&lt;/i&gt; the SDK (and I really need help with my memory management!).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://ecx.images-amazon.com/images/I/41gNRqHs6qL._SL160_AA115_.jpg" align="left"&gt; &lt;a href="http://www.amazon.com/gp/product/143022357X?ie=UTF8&amp;tag=conce0d-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=143022357X"&gt;iPhone Cool Projects&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=conce0d-20&amp;l=as2&amp;o=1&amp;a=143022357X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;br /&gt;&lt;i&gt;Bennett et al&lt;/i&gt; (Apress)&lt;br /&gt;&lt;br /&gt;The most 'attractive' of the five, due to the easy-to-read typesetting and colorful (yes COLOR) layout and imagery; this book probably doesn't really even belong in the list. It is more of a 'discussion' of iPhone application design - there &lt;i&gt;is&lt;/i&gt; a fair amount of Objective-C throughout but it's mainly used to illustrate points of discussion, and the chunks are small enough that a C# developer can easily scan them.&lt;br /&gt;&lt;br /&gt;Definitely fun to read - but you'll want any/all of the other books first to advance your knowledge of the iPhone SDK and Objective-C before you start trying to use the examples in this book. It probably isn't a good choice as a 'reference' or a learning tool for C#ers until you've got a few apps under your belt.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style="color:darkred"&gt;Finally...&lt;/b&gt;&lt;br /&gt;As time passes and &lt;i&gt;my&lt;/i&gt; knowledge increases my opinion of these books might change. Perhaps others have different opinions on what makes a good "Obj-C for C#" book, or have come across other titles? I'm sure there'll be C#/MonoTouch specific titles  on the market eventually - it will be interesting to see how they read too!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-2814777874381435228?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/2814777874381435228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/11/iphone-obj-c-books-for-monotouch-devs.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/2814777874381435228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/2814777874381435228'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/11/iphone-obj-c-books-for-monotouch-devs.html' title='iPhone Obj-C books for MonoTouch devs (first look)'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Ba76y6K7kvs/Svkxvl0bNhI/AAAAAAAABIo/JccHiQwBZp4/s72-c/iphonebooks.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-311511708357226337</id><published>2009-11-09T21:54:00.006+11:00</published><updated>2009-11-10T07:33:22.705+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pdc09'/><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Another MonoTouch 'conference app' - PDC09</title><content type='html'>&lt;img style="cursor:pointer; cursor:hand;width: 72px; height: 84px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/Svf2YAQYiMI/AAAAAAAABIY/wXYubfzU-Hg/s200/pdc_icon.png" border="0" alt="PDC09" id="BLOGGER_PHOTO_ID_5402057170300209346" align="left"/&gt;I'm not planning on making a habit of this, but having spent the time putting together the &lt;a href="http://conceptdev.blogspot.com/2009/10/monotouch-for-monospace.html" target="20091109"&gt;Monospace conference app&lt;/a&gt; and seeing tweets from various Mono people that they were heading to PDC09, I figured it wouldn't take too long to copy some PDC data into the existing MonoTouch C# app 'framework'.&lt;br /&gt;&lt;br /&gt;A new view (Sessions), a new icon (Speakers) and a new location (Underground) are the main changes - the rest is just SQLite and graphic tweaks. The source is available for download - &lt;a href="http://conceptdevelopment.net/iPhone/PDC09/PDC09_01.zip"&gt;&lt;b&gt;PDC09_01.zip (124Kb)&lt;/b&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ba76y6K7kvs/Svf6QVbWDwI/AAAAAAAABIg/XWGSBTTNs1M/s1600-h/PDC09.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 354px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/Svf6QVbWDwI/AAAAAAAABIg/XWGSBTTNs1M/s400/PDC09.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5402061436590886658" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style="color:darkred"&gt;NOTE:&lt;/b&gt; This is for demonstration purposes only - the Speakers data is incomplete and the Schedule &amp;amp; Sessions are subject to change! Use at your own risk :)&lt;br /&gt;&lt;br /&gt;&lt;b style="color:darkred"&gt;UPDATE:&lt;/b&gt; to be clear, this app is &lt;i&gt;not&lt;/i&gt; available on the AppStore -- it is just an example of the kind of thing you can write in C# for the iPhone using &lt;a href="http://monotouch.net" target="20091109"&gt;MonoTouch&lt;/a&gt; from Novell. If you have a &lt;a href="http://monotouch.net" target="20091109"&gt;MonoTouch&lt;/a&gt; licence then you can &lt;a href="http://conceptdevelopment.net/iPhone/PDC09/PDC09_01.zip"&gt;download the source (124Kb)&lt;/a&gt; and install it on your phone.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-311511708357226337?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/311511708357226337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/11/another-monotouch-conference-app-pdc09.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/311511708357226337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/311511708357226337'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/11/another-monotouch-conference-app-pdc09.html' title='Another MonoTouch &apos;conference app&apos; - PDC09'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ba76y6K7kvs/Svf2YAQYiMI/AAAAAAAABIY/wXYubfzU-Hg/s72-c/pdc_icon.png' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-6693795995141262315</id><published>2009-11-02T21:56:00.007+11:00</published><updated>2009-11-03T07:42:11.436+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>MonoTouch UINavigationController Placemat</title><content type='html'>In one of my &lt;a href="http://conceptdev.blogspot.com/2009/10/monotouch-for-monospace.html" target="20091102"&gt;other posts&lt;/a&gt; I included a &lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/StmpR8XfZ5I/AAAAAAAABGA/h1QiSPu6f40/s1600-h/ClassDiagram-Annotated.png" target="20091102"&gt;'placemat' diagram&lt;/a&gt; to help make sense of the code. &lt;br /&gt;&lt;br /&gt;Someone commented that they found the presentation useful, so as a quick post today I decided to placemat the &lt;a href="http://conceptdev.blogspot.com/2009/10/monotouch-rogets-1911-thesaurus.html" target="20091102"&gt;Roget's 1911 Thesaurus&lt;/a&gt; sample. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Ba76y6K7kvs/Su66_wEzO3I/AAAAAAAABIQ/9MzCAwYQ-HQ/s1600-h/RogetPlacemat.png" target="20091102"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 199px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/Su66_wEzO3I/AAAAAAAABIQ/9MzCAwYQ-HQ/s400/RogetPlacemat.png" border="0" alt="Rogets 1911 Placemat" id="BLOGGER_PHOTO_ID_5399458607663364978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Note that I'm not suggesting this is the neatest, tidiest, best-practice way to structure a MonoTouch application (I'm learning along with everyone else). This is purely to help you find your way around the &lt;a href="http://conceptdevelopment.net/iPhone/Roget01/Roget01.zip" target="20091102"&gt;example code&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;For example...&lt;/b&gt; on thing I learned is that I didn't really &lt;i&gt;need&lt;/i&gt; to pass an instance of the 'root' &lt;code&gt;MainViewController&lt;/code&gt; around - each UIViewController has a &lt;code&gt;NavigationController&lt;/code&gt; property referencing the &lt;code&gt;UINavigationController&lt;/code&gt; that 'contains' it. Therefore any given &lt;code&gt;UIViewController&lt;/code&gt; that has been added to a &lt;code&gt;UINavigationController&lt;/code&gt; can call &lt;code&gt;this.PushViewController&lt;/code&gt; (or else pass a reference to &lt;code&gt;this&lt;/code&gt; into the &lt;code&gt;UITableViewDelegate&lt;/code&gt; constructor to use in &lt;code&gt;RowSelected&lt;/code&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-6693795995141262315?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/6693795995141262315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/11/monotouch-uinavigationcontroller.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/6693795995141262315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/6693795995141262315'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/11/monotouch-uinavigationcontroller.html' title='MonoTouch UINavigationController Placemat'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Ba76y6K7kvs/Su66_wEzO3I/AAAAAAAABIQ/9MzCAwYQ-HQ/s72-c/RogetPlacemat.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-953409306390584836</id><published>2009-10-26T20:48:00.005+11:00</published><updated>2009-10-26T21:42:35.655+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>MonoTouch "Corp411" (part III: Revenge of System.Data)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ba76y6K7kvs/SuGQ6g-MlII/AAAAAAAABHo/M5gG1MpWtbU/s1600-h/corp411_icon.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 66px; height: 80px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/SuGQ6g-MlII/AAAAAAAABHo/M5gG1MpWtbU/s200/corp411_icon.jpg" border="0" alt="" align="left" id="BLOGGER_PHOTO_ID_5395753163524183170" /&gt;&lt;/a&gt;As &lt;a href="http://conceptdev.blogspot.com/2009/10/monotouch-corp411-part-ii.html" target="20091026"&gt;promised&lt;/a&gt;, the Corp411 sample app has been 'converted' from &lt;a href="http://code.google.com/p/sqlite-net/" target="20091026"&gt;sqlite-net&lt;/a&gt; to &lt;a href="http://monotouch.net/Documentation/System.Data" target="20091026"&gt;System.Data&lt;/a&gt;. MonoTouch 1.2 isn't quite out yet, so you must follow the instructions on &lt;a href="http://monotouch.net/Documentation/System.Data" target="20091026"&gt;this page&lt;/a&gt; to download the &lt;code&gt;System.Data&lt;/code&gt; assemblies to your installation, put them in the correct place AND add references to your MonoDevelop solution for &lt;code&gt;Mono.Data.Sqlite.dll, Mono.Data.Tds.dll, System.Data.dll, System.Transactions.dll&lt;/code&gt; (I'm not sure if they're all required, but it seemed like a sensible set).&lt;br /&gt;&lt;br /&gt;It's pretty easy to use after all that:&lt;pre&gt;// db is the path to the SQLite database file&lt;br /&gt;var conn = new SqliteConnection("Data Source=" + db);&lt;/pre&gt;and&lt;pre&gt;listData = new List&amp;lt;Employee&amp;gt;();&lt;br /&gt;// System.Data from http://monotouch.net/Documentation/System.Data&lt;br /&gt;var sd = new SystemDataHelper("phonebook");&lt;br /&gt;var connection = sd.GetConnection();&lt;br /&gt;using (var cmd = connection.CreateCommand())&lt;br /&gt;{&lt;br /&gt;   connection.Open ();  &lt;br /&gt;   cmd.CommandText = "SELECT Firstname, Lastname, Work, Mobile,"&lt;br /&gt;                   + "  Department, Email "&lt;br /&gt;                   + " FROM Phonebook ORDER BY Lastname";  &lt;br /&gt;   using (var reader = cmd.ExecuteReader ()) &lt;br /&gt;   {&lt;br /&gt;      while (reader.Read ()) &lt;br /&gt;      {  &lt;br /&gt;         var emp = new Employee();&lt;br /&gt;         emp.Firstname = (string)reader["Firstname"]; &lt;br /&gt;         emp.Lastname = (string)reader["Lastname"]; &lt;br /&gt;         emp.Work = (string)reader["Work"];&lt;br /&gt;         emp.Mobile = (string)reader["Mobile"]; &lt;br /&gt;         emp.Department = (string)reader["Department"]; &lt;br /&gt;         emp.Email = (string)reader["Email"];&lt;br /&gt;         Console.WriteLine("Column {0}",reader["Lastname"]);&lt;br /&gt;         listData.Add(emp);&lt;br /&gt;      }  &lt;br /&gt;   } &lt;br /&gt;}&lt;/pre&gt;Cool eh? Doesn't that look familiar... good old ADO.NET :-)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SuV0yrA3qRI/AAAAAAAABIA/bzDiuMLvdHg/s1600-h/SystemData.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 260px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SuV0yrA3qRI/AAAAAAAABIA/bzDiuMLvdHg/s400/SystemData.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5396848142362061074" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;THE CODE&lt;/b&gt;&lt;br /&gt;That's a small part of the &lt;code&gt;System.Data&lt;/code&gt; namespace, so the code is pretty small :) here 'tis &lt;a href="http://conceptdevelopment.net/iPhone/CorpPhonebook02/Corp411.3.zip"&gt;Corp411.3.zip (38Kb)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;... and proof it runs on a device ...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SuV85YXggrI/AAAAAAAABII/dafnhY2UXcs/s1600-h/Corp411.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SuV85YXggrI/AAAAAAAABII/dafnhY2UXcs/s320/Corp411.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5396857053708845746" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-953409306390584836?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/953409306390584836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/10/monotouch-corp411-part-iii-revenge-of.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/953409306390584836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/953409306390584836'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/10/monotouch-corp411-part-iii-revenge-of.html' title='MonoTouch &quot;Corp411&quot; (part III: Revenge of System.Data)'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ba76y6K7kvs/SuGQ6g-MlII/AAAAAAAABHo/M5gG1MpWtbU/s72-c/corp411_icon.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-7568324714045003060</id><published>2009-10-23T22:12:00.007+11:00</published><updated>2009-10-26T21:17:02.149+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>MonoTouch "Corp411" (part II)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ba76y6K7kvs/SuGQ6g-MlII/AAAAAAAABHo/M5gG1MpWtbU/s1600-h/corp411_icon.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 66px; height: 80px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/SuGQ6g-MlII/AAAAAAAABHo/M5gG1MpWtbU/s200/corp411_icon.jpg" border="0" alt="" align="left" id="BLOGGER_PHOTO_ID_5395753163524183170" /&gt;&lt;/a&gt;A minor update to the &lt;a href="http://conceptdev.blogspot.com/2009/09/monotouch-with-sqlite-corporate.html" target="20091023"&gt;Corporate Phonebook&lt;/a&gt; incorporating the custom UITableViewCell from &lt;a href="http://simon.nureality.ca/?p=91" target="20091023"&gt;Simon&lt;/a&gt; (&lt;code&gt;UITableView&lt;/code&gt; now shows name and department in each cell; also added a disclosure indicator). Handles &lt;code&gt;RowSelected&lt;/code&gt; and uses &lt;code&gt;OpenUrl&lt;/code&gt; to call and email.&lt;br /&gt;&lt;br /&gt;The MonoDevelop solution is available to &lt;a href="http://conceptdevelopment.net/iPhone/CorpPhonebook02/Corp411.2.zip" target="20091023"&gt;download (41Kb)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SuGQ7MepFYI/AAAAAAAABH4/F2MJFOdydXk/s1600-h/Corp411.2_list.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SuGQ7MepFYI/AAAAAAAABH4/F2MJFOdydXk/s200/Corp411.2_list.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5395753175202993538" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Ba76y6K7kvs/SuGQ61EdesI/AAAAAAAABHw/aspym6QJ1mk/s1600-h/Corp411.2_call.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/SuGQ61EdesI/AAAAAAAABHw/aspym6QJ1mk/s200/Corp411.2_call.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5395753168919165634" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style='color:green'&gt;//TODO:&lt;/b&gt; give the new MonoTouch 1.2 &lt;a href="http://monotouch.net/Documentation/System.Data"&gt;System.Data&lt;/a&gt; implementation a try!&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;//HACK:&lt;/b&gt; &lt;code&gt;System.Data&lt;/code&gt; &lt;a href="http://conceptdev.blogspot.com/2009/10/monotouch-corp411-part-iii-revenge-of.html"&gt;example now available&lt;/a&gt; (26-Oct)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-7568324714045003060?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/7568324714045003060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/10/monotouch-corp411-part-ii.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/7568324714045003060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/7568324714045003060'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/10/monotouch-corp411-part-ii.html' title='MonoTouch &quot;Corp411&quot; (part II)'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ba76y6K7kvs/SuGQ6g-MlII/AAAAAAAABHo/M5gG1MpWtbU/s72-c/corp411_icon.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-3429141264882075081</id><published>2009-10-21T21:51:00.006+11:00</published><updated>2009-10-21T22:23:08.336+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>MonoTouch flip-flop with UIView animation</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/Stl40OWvAII/AAAAAAAABFw/bqMCbHhDr5w/s1600-h/Monospace.png" target="_blank"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 77px; height: 84px; padding: 5px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/Stl40OWvAII/AAAAAAAABFw/bqMCbHhDr5w/s320/Monospace.png" border="0" alt="Monospace" id="BLOGGER_PHOTO_ID_5393474867354861698" align="left"/&gt;&lt;/a&gt;Thanks to &lt;a href="http://www.amazon.com/Beginning-iPhone-Development-Exploring-SDK/dp/1430216263/" target="20091021"&gt;Beginning iPhone Development&lt;/a&gt;'s Objective-C examples the &lt;a href="http://conceptdev.blogspot.com/2009/10/monotouch-for-monospace.html" target="20091019"&gt;Monospace app&lt;/a&gt; now does a flip-flop between two views (the map and a new list of map locations to 'pan to'). The source code is available for download (you'll also notice the UI has been made "black"... I just like the way it looks).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://conceptdevelopment.net/iPhone/Monospace02/Monospace22.zip"&gt;&lt;b&gt;Monospace22.zip (188Kb)&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Ba76y6K7kvs/St7rs7NHYiI/AAAAAAAABHI/an21OS4g9ug/s1600-h/Flip01.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/St7rs7NHYiI/AAAAAAAABHI/an21OS4g9ug/s200/Flip01.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5395008560675906082" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ba76y6K7kvs/St7rtH4ZS3I/AAAAAAAABHQ/MoH4vxmiEdc/s1600-h/Flip02.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/St7rtH4ZS3I/AAAAAAAABHQ/MoH4vxmiEdc/s200/Flip02.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5395008564078660466" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Ba76y6K7kvs/St7rtTztryI/AAAAAAAABHY/7vjWIk0xVlA/s1600-h/Flip03.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/St7rtTztryI/AAAAAAAABHY/7vjWIk0xVlA/s200/Flip03.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5395008567280250658" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Ba76y6K7kvs/St7rtx1Mk6I/AAAAAAAABHg/ni9L0eV8gAQ/s1600-h/Flip04.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/St7rtx1Mk6I/AAAAAAAABHg/ni9L0eV8gAQ/s200/Flip04.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5395008575339533218" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The view is driven by the &lt;code&gt;MapFlipViewController&lt;/code&gt; (which is what we add to the &lt;code&gt;TabViewController&lt;/code&gt;). It is responsible for creating/displaying the two 'flippable' views using &lt;code&gt;UIView&lt;/code&gt; animation features.&lt;br /&gt;&lt;br /&gt;The two views - &lt;code&gt;MapViewController&lt;/code&gt; &amp;amp; &lt;code&gt;MapLocationViewController&lt;/code&gt; - have a constructor which accepts a reference to the 'flipper' so they can call back to it's &lt;code&gt;Flip()&lt;/code&gt; method, which looks something like this...&lt;pre&gt;UIView.BeginAnimations("Flipper");&lt;br /&gt;UIView.SetAnimationDuration(1.25);&lt;br /&gt;UIView.SetAnimationCurve(UIViewAnimationCurve.EaseInOut);&lt;br /&gt;if (mapView.View.Superview == null)&lt;br /&gt;{&lt;br /&gt;   Console.WriteLine("to map");&lt;br /&gt;   UIView.SetAnimationTransition &lt;br /&gt;        (UIViewAnimationTransition.FlipFromRight, this.View, true);&lt;br /&gt;   locationView.ViewWillAppear(true);&lt;br /&gt;   mapView.ViewWillDisappear(true);&lt;br /&gt; &lt;br /&gt;   locationView.View.RemoveFromSuperview();&lt;br /&gt;   this.View.AddSubview(mapView.View);&lt;br /&gt;&lt;br /&gt;   mapView.ViewDidDisappear(true);&lt;br /&gt;   locationView.ViewDidAppear(true);&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;   Console.WriteLine("to list");&lt;br /&gt;   UIView.SetAnimationTransition &lt;br /&gt;         (UIViewAnimationTransition.FlipFromLeft, this.View, true);&lt;br /&gt;   mapView.ViewWillAppear(true);&lt;br /&gt;   locationView.ViewWillDisappear(true);&lt;br /&gt; &lt;br /&gt;   mapView.View.RemoveFromSuperview();&lt;br /&gt;   this.View.AddSubview(locationView.View);&lt;br /&gt; &lt;br /&gt;   locationView.ViewDidDisappear(true);&lt;br /&gt;   mapView.ViewDidAppear(true);&lt;br /&gt;}&lt;br /&gt;UIView.CommitAnimations();&lt;/pre&gt;There is other code to actually &lt;i&gt;set&lt;/i&gt; the map to a specific location - but that's actually pretty simple :)&lt;pre&gt;mapView.SetLocation(toLocation);&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-3429141264882075081?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/3429141264882075081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/10/monotouch-flip-flop-with-uiview.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/3429141264882075081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/3429141264882075081'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/10/monotouch-flip-flop-with-uiview.html' title='MonoTouch flip-flop with UIView animation'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Ba76y6K7kvs/Stl40OWvAII/AAAAAAAABFw/bqMCbHhDr5w/s72-c/Monospace.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-5068959516957229850</id><published>2009-10-19T22:07:00.006+11:00</published><updated>2009-10-19T22:42:55.128+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Monospace app .1 release</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/Stl40OWvAII/AAAAAAAABFw/bqMCbHhDr5w/s1600-h/Monospace.png" target="_blank"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 77px; height: 84px; padding: 5px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/Stl40OWvAII/AAAAAAAABFw/bqMCbHhDr5w/s320/Monospace.png" border="0" alt="Monospace" id="BLOGGER_PHOTO_ID_5393474867354861698" align="left"/&gt;&lt;/a&gt;The &lt;a href="http://conceptdev.blogspot.com/2009/10/monotouch-for-monospace.html" target="20091019"&gt;first version&lt;/a&gt; of the &lt;a href="http://monospace.us" target="20091019"&gt;Monospace&lt;/a&gt; schedule app had a few issues (extra UITableView lines, for example); here is an updated version (with at least one less bug):&lt;br /&gt;&lt;br /&gt;&lt;a href="http://conceptdevelopment.net/iPhone/Monospace02/Monospace21.zip"&gt;&lt;b&gt;Monospace21.zip (183Kb)&lt;/b&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;A couple of additional features were also added...&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;&lt;code&gt;UITabBarController&lt;/code&gt; More &amp;amp; Edit&lt;/b&gt;&lt;br /&gt;Two of the cool things about &lt;code&gt;UITabBarController&lt;/code&gt; are (a) when you add more than five items, it automatically creates the &lt;b&gt;More...&lt;/b&gt; option; and (b) when the &lt;b&gt;More&lt;/b&gt; list is visible you can also edit the order/position of items in the tab bar. Bonus!&lt;br /&gt;&lt;br /&gt;There is a new 'Sponsors' ViewController to show this functionality:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Ba76y6K7kvs/StxIugcizVI/AAAAAAAABGw/g8wv4aIuicY/s1600-h/IMG_0554.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/StxIugcizVI/AAAAAAAABGw/g8wv4aIuicY/s200/IMG_0554.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5394266417503849810" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Ba76y6K7kvs/StxIvTbn_dI/AAAAAAAABG4/NLPUFallzDQ/s1600-h/IMG_0555.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/StxIvTbn_dI/AAAAAAAABG4/NLPUFallzDQ/s200/IMG_0555.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5394266431190203858" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ba76y6K7kvs/StxIv1P4HSI/AAAAAAAABHA/FU2HsopZ-1Q/s1600-h/IMG_0556.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/StxIv1P4HSI/AAAAAAAABHA/FU2HsopZ-1Q/s200/IMG_0556.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5394266440267734306" /&gt;&lt;/a&gt;&lt;br /&gt;I've used a UIWebView with images saved locally as a quick hack to get the sponsors page working. Setting the &lt;code&gt;baseUrl&lt;/code&gt; makes is easy to reference images saved in the application bundle from local Html.&lt;pre&gt;string basedir = Environment.GetFolderPath &lt;br /&gt;     (System.Environment.SpecialFolder.Personal);&lt;br /&gt;basedir = basedir.Replace("Documents", "Monospace2.app");&lt;br /&gt;webView.LoadHtmlString(FormatText(), &lt;br /&gt;     new NSUrl(basedir+"/Sponsors/", true));&lt;/pre&gt;&lt;b style='color:darkred'&gt;&lt;code&gt;CoreLocation&lt;/code&gt; with &lt;code&gt;MapKit&lt;/code&gt;&lt;/b&gt;&lt;br /&gt;The &lt;code&gt;MapViewController&lt;/code&gt; now also uses &lt;code&gt;CoreLocation.CLLocationManager&lt;/code&gt; and custom delegate to track your location and calculate the distance to the conference center:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ba76y6K7kvs/StxItvWZEyI/AAAAAAAABGg/PXEclx0VZeU/s1600-h/IMG_0551.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/StxItvWZEyI/AAAAAAAABGg/PXEclx0VZeU/s200/IMG_0551.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5394266404324709154" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Ba76y6K7kvs/StxIuG7Y1uI/AAAAAAAABGo/i-lHqug96bY/s1600-h/IMG_0553.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/StxIuG7Y1uI/AAAAAAAABGo/i-lHqug96bY/s200/IMG_0553.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5394266410653898466" /&gt;&lt;/a&gt;&lt;br /&gt;It also includes a new &lt;a href="http://conceptdev.blogspot.com/2009/10/monotouch-sans-interface-builder.html" target="20091019"&gt;&lt;code&gt;UISegmentedControl&lt;/code&gt;&lt;/a&gt; to change the map style.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-5068959516957229850?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/5068959516957229850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/10/monospace-app-1-release.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/5068959516957229850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/5068959516957229850'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/10/monospace-app-1-release.html' title='Monospace app .1 release'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Ba76y6K7kvs/Stl40OWvAII/AAAAAAAABFw/bqMCbHhDr5w/s72-c/Monospace.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-3179535549058582553</id><published>2009-10-18T19:29:00.008+11:00</published><updated>2009-10-19T09:17:58.137+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>MonoTouch sans Interface Builder</title><content type='html'>I have nothing against Interface Builder &lt;i&gt;per se&lt;/i&gt;, but as I've said before when developing with Visual Studio I shun the design surface (if you've used the Xaml preview feature prior to 2010 you'll understand why). I also think you get a better understanding of your environment (and a greater ability to customize your UI) if you can create it in code.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ba76y6K7kvs/Strg7G2sffI/AAAAAAAABGI/3Ox_WtK1uFA/s1600-h/Segmented_GUI.jpg" target="20091018"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 386px; height: 241px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/Strg7G2sffI/AAAAAAAABGI/3Ox_WtK1uFA/s400/Segmented_GUI.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5393870809786514930" /&gt;&lt;/a&gt;&lt;br /&gt;But for new MonoTouch developers it can be difficult to figure out &lt;i&gt;how&lt;/i&gt; to create something in code. I've just been through this adding a &lt;code&gt;UISegmentedControl&lt;/code&gt; to the &lt;a href="http://conceptdev.blogspot.com/2009/10/monotouch-for-monospace.html" target="20091018"&gt;Monospace app&lt;/a&gt;... here are my (rather obvious) suggestions:&lt;ul&gt;&lt;li&gt;&lt;b&gt;Autocomplete/Intellisense&amp;trade;&lt;/b&gt; - the easiest and most obvious thing to try is reading through the properties and methods available to you via MonoDevelop. I got the &lt;code&gt;UITabBarController&lt;/code&gt; (mostly) working this way.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Interface Builder&lt;/b&gt; - look closely at the IB Inspector windows to get some ideas about the properties exposed.&lt;/li&gt;&lt;li&gt;&lt;b&gt;XIB file&lt;/b&gt; - further to the Inspector windows, the XIB file (in its weird XMLish format) might also give you some hints. Obviously this means you need to 'draw' the control/s in IB, but just roughly for inspiration...&lt;/li&gt;&lt;li&gt;&lt;b&gt;Objective-C references&lt;/b&gt; - for now most search results will be from Objective-C devs; it isn't hard to decode them (usually) so don't be dissuaded because it "looks different" :) &lt;br/&gt;Try Miguel's &lt;a href="http://tirania.org/tmp/rosetta.html" target="20091018"&gt;Rosetta stone&lt;/a&gt; decoder for Objective-C classes/properties &amp;rarr; MonoTouch&lt;/li&gt;&lt;li&gt;&lt;b&gt;MonoTouch docs&lt;/b&gt; - last but not least, the &lt;a href="http://www.go-mono.com/docs/monodoc.ashx?link=root%3a%2fMonoTouch-lib" target="20091018"&gt;documentation&lt;/a&gt; &lt;i&gt;will&lt;/i&gt; help you. Bookmark it now.&lt;/li&gt;&lt;/ul&gt;&lt;b style='color:darkred;'&gt;XIB and Inspector&lt;/b&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ba76y6K7kvs/StrhH1ndOxI/AAAAAAAABGY/9J_xrtuFRLE/s1600-h/Segmented_XIB.png" target="20091018"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 244px; height: 320px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/StrhH1ndOxI/AAAAAAAABGY/9J_xrtuFRLE/s320/Segmented_XIB.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5393871028497496850" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ba76y6K7kvs/StrhHQQspBI/AAAAAAAABGQ/zWPW0vTzykI/s1600-h/Segmented_Inspector.png" target="20091018"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 293px; height: 320px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/StrhHQQspBI/AAAAAAAABGQ/zWPW0vTzykI/s320/Segmented_Inspector.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5393871018469925906" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred;'&gt;&lt;code&gt;UISegmentedControl&lt;/code&gt; in c#&lt;/b&gt;&lt;pre&gt;// Don't forget your using statements &lt;br /&gt;// this example uses MonoTouch.MapKit &lt;br /&gt;// as well as UIKit and Foundation&lt;br /&gt;var segmentedControl = new UISegmentedControl();&lt;br /&gt;segmentedControl.Frame = new RectangleF(20, 350, 282,44);&lt;br /&gt;segmentedControl.InsertSegment("Map", 0, false);&lt;br /&gt;segmentedControl.InsertSegment("Satellite", 1, false);&lt;br /&gt;segmentedControl.InsertSegment("Hybrid", 2, false);&lt;br /&gt;segmentedControl.SelectedSegment = 0;&lt;br /&gt;segmentedControl.ControlStyle = UISegmentedControlStyle.Plain;&lt;br /&gt;&lt;br /&gt;segmentedControl.ValueChanged += delegate {&lt;br /&gt;   if (segmentedControl.SelectedSegment == 0)&lt;br /&gt;      mapView.MapType = MonoTouch.MapKit.MKMapType.Standard;&lt;br /&gt;   else if (segmentedControl.SelectedSegment == 1)&lt;br /&gt;      mapView.MapType = MonoTouch.MapKit.MKMapType.Satellite;&lt;br /&gt;   else if (segmentedControl.SelectedSegment == 2)&lt;br /&gt;      mapView.MapType = MonoTouch.MapKit.MKMapType.Hybrid;&lt;br /&gt;};&lt;br /&gt;// And further down the code, don't forget to Add it!&lt;br /&gt;this.View.AddSubview(segmentedControl);&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-3179535549058582553?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/3179535549058582553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/10/monotouch-sans-interface-builder.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/3179535549058582553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/3179535549058582553'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/10/monotouch-sans-interface-builder.html' title='MonoTouch &lt;i&gt;sans&lt;/i&gt; Interface Builder'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Ba76y6K7kvs/Strg7G2sffI/AAAAAAAABGI/3Ox_WtK1uFA/s72-c/Segmented_GUI.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-386519839675640602</id><published>2009-10-17T18:50:00.011+11:00</published><updated>2009-10-23T20:51:49.153+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monospace'/><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>MonoTouch for Monospace</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/Stl40OWvAII/AAAAAAAABFw/bqMCbHhDr5w/s1600-h/Monospace.png" target="_blank"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 77px; height: 84px; padding: 5px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/Stl40OWvAII/AAAAAAAABFw/bqMCbHhDr5w/s320/Monospace.png" border="0" alt="Monospace" id="BLOGGER_PHOTO_ID_5393474867354861698" align="left"/&gt;&lt;/a&gt;&lt;a href="http://monospace.us" target="20091017"&gt;Monospace&lt;/a&gt; is coming up fast, with a whole day's worth of &lt;a href="http://monotouch.net" target="20091017"&gt;MonoTouch&lt;/a&gt; sessions. With that in mind, it seems kinda obvious to make the Monospace schedule available as a MonoTouch app...&lt;br /&gt;&lt;br /&gt;Here are some screenshots:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/Stl7U7EEyeI/AAAAAAAABF4/nw7YEJ_u73w/s1600-h/Monospace_collage.png" target="_blank"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 226px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/Stl7U7EEyeI/AAAAAAAABF4/nw7YEJ_u73w/s400/Monospace_collage.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5393477628135262690" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In short, it provides:&lt;ul&gt;&lt;li&gt;Conference schedule (day/session/detail views)&lt;/li&gt;&lt;li&gt;Speakers (list/detail)&lt;/li&gt;&lt;li&gt;Access to the &lt;a href="http://monospaceconf.blogspot.com/" target="20091017"&gt;monospaceconf blog&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Access to &lt;a href="http://twitter.com/monospace_conf" target="20091017"&gt;@monospace_conf&lt;/a&gt;'s stream on Twitter&lt;/li&gt;&lt;li&gt;A map of the conference location&lt;/li&gt;&lt;/ul&gt;Some of the fun MonoTouch things I learned along the way include:&lt;ul&gt;&lt;li&gt;Creating a &lt;code&gt;UITabBarController&lt;/code&gt; in code (no IB)&lt;/li&gt;&lt;li&gt;Making icons for &lt;code&gt;UITabBarItem&lt;/code&gt; (&lt;a href="http://osmorphis.blogspot.com/2009/02/tab-bar-icons-part-1_4115.html" target="20091017"&gt;hint&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Creating an 'image watermark' with &lt;code&gt;UIImage&lt;/code&gt; behind a &lt;code&gt;UITableView&lt;/code&gt; (thanks &lt;a href="http://mikebluestein.wordpress.com/2009/10/05/setting-an-image-background-on-a-uitableview-using-monotouch/" target="20091017"&gt;Mike&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Using Linq for Xml to parse Atom feeds (like &lt;a href="http://softwareandservice.wordpress.com/2009/09/21/building-a-rss-reader-iphone-app-using-monotouch/" target="20091017"&gt;RSS&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Implementing the latest &lt;b&gt;SQLite&lt;/b&gt; wrapper from &lt;a href="http://code.google.com/p/sqlite-net/" target="20091017"&gt;Frank&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Changing the default &lt;code&gt;UITableViewCell&lt;/code&gt; layout in code (eg mutiple lines)&lt;/li&gt;&lt;li&gt;Creating a custom &lt;code&gt;UITableViewCell&lt;/code&gt; with &lt;code&gt;LoadNib&lt;/code&gt; (thanks &lt;a href="http://simon.nureality.ca/?p=91" target="20091017"&gt;Simon&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;I hope to write some more detail on each of these items... but for now you can download and run the code for yourself:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://conceptdevelopment.net/iPhone/Monospace01/Monospace2.zip"&gt;&lt;b&gt;Monospace2.zip (94Kb)&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;UPDATE 19-Oct: &lt;a href="http://conceptdev.blogspot.com/2009/10/monospace-app-1-release.html" target="20091019"&gt;newer version&lt;/a&gt; available&lt;/b&gt;&lt;br /&gt;&lt;a href="http://conceptdevelopment.net/iPhone/Monospace02/Monospace21.zip"&gt;&lt;b&gt;Monospace21.zip (183Kb)&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;UPDATE 21-Oct: &lt;a href="http://conceptdev.blogspot.com/2009/10/monotouch-flip-flop-with-uiview.html" target="20091019"&gt;even newer version&lt;/a&gt; available&lt;/b&gt;&lt;br /&gt;&lt;a href="http://conceptdevelopment.net/iPhone/Monospace02/Monospace22.zip"&gt;&lt;b&gt;Monospace22.zip (188Kb)&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and here's an annotated class diagram/placemat to help make sense of it all:&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/StmpR8XfZ5I/AAAAAAAABGA/h1QiSPu6f40/s1600-h/ClassDiagram-Annotated.png" target="20091017"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 205px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/StmpR8XfZ5I/AAAAAAAABGA/h1QiSPu6f40/s400/ClassDiagram-Annotated.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5393528154480404370" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;WARNING:&lt;/b&gt; there are plenty of shortcomings/hacks/missing features including: weird lines on the Speaker UITableView, no reloading of data from Blogger or Twitter without restarting, heaps of weird "pointer being freed was not allocated" errors accompanying the SQLite code (only visible in the Application Output window) and probably a pile of bugs I'm not aware of.&lt;br /&gt;&lt;b style='color:darkred'&gt;USE AT YOUR OWN RISK!&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-386519839675640602?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/386519839675640602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/10/monotouch-for-monospace.html#comment-form' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/386519839675640602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/386519839675640602'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/10/monotouch-for-monospace.html' title='MonoTouch for Monospace'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Ba76y6K7kvs/Stl40OWvAII/AAAAAAAABFw/bqMCbHhDr5w/s72-c/Monospace.png' height='72' width='72'/><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-1711441861847592073</id><published>2009-10-08T20:41:00.012+11:00</published><updated>2009-10-10T12:36:10.374+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>MonoTouch "Roget's 1911 Thesaurus"</title><content type='html'>This sample was inspired by &lt;a href="http://www.charlespetzold.com/blog/2009/08/Rogets-Hierarchical-Thesaurus-in-a-Silverlight-App.html" target="2009108"&gt;Roget’s Hierarchical Thesaurus in a Silverlight App&lt;/a&gt;. I highly recommend you check out the &lt;a href="http://www.charlespetzold.com/silverlight/Roget1911Experiment1/Roget1911Experiment1.html" target="20091008"&gt;Silverlight Thesaurus 'visualization'&lt;/a&gt; as it will give you some idea about why it seemed like a good match for the iPhone UINavigationController (ie. a hierarchy). The fact that it's not a uniform depth just makes the problem more interesting.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.charlespetzold.com/" target="20091008"&gt;Charles&lt;/a&gt; very generously provided me with the source data he worked on to produce the Silverlight app (and the associated C# classes). It's great that MonoTouch allows existing .NET source to be re-used so easily.&lt;br /&gt;&lt;br /&gt;Here are some screenshots of the iPhone app:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ba76y6K7kvs/Ss3FRTowf0I/AAAAAAAABEw/Vpp8Eudcm7I/s1600-h/IMG_0520.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/Ss3FRTowf0I/AAAAAAAABEw/Vpp8Eudcm7I/s200/IMG_0520.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5390181230152023874" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Ba76y6K7kvs/Ss3FR8WohkI/AAAAAAAABE4/AGQN7-gNQwQ/s1600-h/IMG_0521.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/Ss3FR8WohkI/AAAAAAAABE4/AGQN7-gNQwQ/s200/IMG_0521.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5390181241081857602" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ba76y6K7kvs/Ss3FSGOqOGI/AAAAAAAABFA/mmqaIGllQcA/s1600-h/IMG_0522.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/Ss3FSGOqOGI/AAAAAAAABFA/mmqaIGllQcA/s200/IMG_0522.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5390181243732768866" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Ba76y6K7kvs/Ss3FSlQRSkI/AAAAAAAABFI/Q-4huoGD05E/s1600-h/IMG_0523.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/Ss3FSlQRSkI/AAAAAAAABFI/Q-4huoGD05E/s200/IMG_0523.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5390181252061022786" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Ba76y6K7kvs/Ss3FTBX8A8I/AAAAAAAABFQ/pKg_N3oq6Jk/s1600-h/IMG_0524.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/Ss3FTBX8A8I/AAAAAAAABFQ/pKg_N3oq6Jk/s200/IMG_0524.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5390181259609375682" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Ba76y6K7kvs/Ss3FbbMy46I/AAAAAAAABFY/VMnaIllfUMc/s1600-h/IMG_0525.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/Ss3FbbMy46I/AAAAAAAABFY/VMnaIllfUMc/s200/IMG_0525.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5390181403980915618" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style="color:darkred"&gt;Xml de-serialization is easy...&lt;/b&gt;&lt;br /&gt;Loading 2.6Mb of Xml data into an object graph is &lt;i&gt;so&lt;/i&gt; easy with the &lt;code&gt;System.Xml.Serialization&lt;/code&gt; support in MonoTouch!&lt;pre&gt;using (TextReader reader = new StreamReader("roget15aCategories.xml"))&lt;br /&gt;{&lt;br /&gt;   XmlSerializer serializer = new XmlSerializer(typeof(RogetCategories));&lt;br /&gt;   Categories = (RogetCategories)serializer.Deserialize(reader);&lt;br /&gt;}&lt;/pre&gt;&lt;b style="color:darkred"&gt;...but don't forget the linker&lt;/b&gt;&lt;br /&gt;When you create the classes you will be de-serializing "into", don't forget to mark them with the &lt;code&gt;MonoTouch.Foundation&lt;/code&gt; attribute &lt;code&gt;[Preserve(AllMembers=true)]&lt;/code&gt;. This prevents the compiler/linker from 'optimising away' parts of your class that don't "appear" to be referenced in code (eg. the constructor) because they are only getting called at runtime as part of the deserialization process. Instead of marking the class declaration, you could alternatively mark specific members with &lt;code&gt;[Preserve]&lt;/code&gt; to give you greater control over the final output.&lt;br /&gt;&lt;br /&gt;&lt;b style="color:darkred"&gt;Use Linq&lt;/b&gt;&lt;br /&gt;Another great piece of .NET support is Linq. It isn't referenced in MonoDevelop MonoTouch solutions by default, so don't forget to right-click your &lt;b&gt;References&lt;/b&gt; and tick &lt;code&gt;System.Xml.Linq&lt;/code&gt; then add the &lt;code&gt;using&lt;/code&gt; clause and Linq away... &lt;pre&gt;public List&lt;RogetCategory&gt; GetRange (string start, string end)&lt;br /&gt;{&lt;br /&gt;   Console.WriteLine("Get {0} to {1}", start, end);&lt;br /&gt;   var l = from c in Categories&lt;br /&gt;      where c.Index &gt;= start.ToNumber() &amp;&amp; c.Index &lt;= end.ToNumber()&lt;br /&gt;      select c;&lt;br /&gt;   return l.ToList();&lt;br /&gt;}&lt;/pre&gt;&lt;b style="color:darkred"&gt;Use Extension Methods&lt;/b&gt;&lt;br /&gt;Obviously if Linq works, so do extension methods. &lt;code&gt;ToNumber()&lt;/code&gt; is a very simple (contrived, even) example of an extension method in MonoTouch:&lt;pre&gt;public static class RogetExtensions&lt;br /&gt;{&lt;br /&gt;   public static int ToNumber(this string num)&lt;br /&gt;   {&lt;br /&gt;      string s = num.Replace("a","");&lt;br /&gt;      int index;&lt;br /&gt;      if (int.TryParse(s, out index))&lt;br /&gt;         return index;&lt;br /&gt;      else&lt;br /&gt;         return -1;&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;&lt;b style="color:darkred"&gt;"Look ma, no Interface Builder"&lt;/b&gt;&lt;br /&gt;As I .NET developer I usually shun the design surface (in Xaml you don't really have a choice) so I was keen to try building an iPhone app without Interface Builder. It's a little difficult knowing where to start, but this &lt;a href="http://sabonrai.wordpress.com/2009/08/28/monotouch-sample-code-uitableview/" target="20091008"&gt;UITableView in code&lt;/a&gt; example was immensely helpful. &lt;br /&gt;&lt;br /&gt;There are four &lt;code&gt;ViewController&lt;/code&gt;s, and the basic format is the same for each: inherit from UIViewController (or a subclass), build up some controls in &lt;code&gt;ViewDidLoad()&lt;/code&gt; and implement any additional delegates required. &lt;br /&gt;&lt;br /&gt;The scrolling table views look like this:&lt;pre&gt;// no XIB !&lt;br /&gt;tableView = new UITableView()&lt;br /&gt;{&lt;br /&gt;    Delegate = new TableViewDelegate(Classes, this),&lt;br /&gt;    DataSource = new TableViewDataSource(Classes, this),&lt;br /&gt;    AutoresizingMask = UIViewAutoresizing.FlexibleHeight|&lt;br /&gt;                       UIViewAutoresizing.FlexibleWidth,&lt;br /&gt;    BackgroundColor = UIColor.White,&lt;br /&gt;};&lt;br /&gt;tableView.SizeToFit();&lt;br /&gt;tableView.Frame = new RectangleF (&lt;br /&gt;    0, 0, this.View.Frame.Width, this.View.Frame.Height);&lt;br /&gt;this.View.AddSubview(tableView);&lt;/pre&gt;and the 'details view' like this:&lt;pre&gt;// no XIB !&lt;br /&gt;webView = new UIWebView()&lt;br /&gt;{&lt;br /&gt; ScalesPageToFit = false&lt;br /&gt;};&lt;br /&gt;webView.LoadHtmlString(FormatText(), new NSUrl());&lt;br /&gt;webView.SizeToFit();&lt;br /&gt;webView.Frame = new RectangleF (&lt;br /&gt;    0, 0, this.View.Frame.Width, this.View.Frame.Height);&lt;br /&gt;this.View.AddSubview(webView);&lt;/pre&gt;Look in &lt;code&gt;MainViewController.cs&lt;/code&gt; and &lt;code&gt;AppController.cs&lt;/code&gt; to see how they are all wired together. The other ViewControllers pass around a reference to &lt;code&gt;MainViewController&lt;/code&gt; so they can call &lt;code&gt;mvc.NavigationController.PushViewController (????, true);&lt;/code&gt; which makes the navigation work (automatic 'back' buttons, animation between views, etc). I've no idea if this is the &lt;i&gt;best&lt;/i&gt; way to do it, but hey it works :)&lt;br /&gt;&lt;br /&gt;&lt;b style="color:darkred"&gt;THE CODE&lt;/b&gt;&lt;br /&gt;This sample code would not have been possible without the hard work of others. It also uses &lt;i&gt;content&lt;/i&gt; which can have copyright/ownership implications.&lt;ul&gt;&lt;li&gt;Thank you to &lt;a href="http://www.charlespetzold.com/" target="20091008"&gt;Charles Petzold&lt;/a&gt; for (a) researching/parsing the text (b) writing and supplying the .NET classes used to access it and (c) allowing his work to be included in this derivative&lt;/li&gt;&lt;li&gt;Acknowledgement to Project Gutenburg for providing the &lt;a href="http://www.gutenberg.org/etext/22" target="20091008"&gt;original text&lt;/a&gt;. The copyright status is listed as &lt;i&gt;Not copyrighted in the United States. If you live elsewhere check the laws of your country before downloading this ebook.&lt;/i&gt; - I presume the same applies to users of this derivative work&lt;/li&gt;&lt;li&gt;&lt;a href="http://sabonrai.wordpress.com/" target="20091008"&gt;Sabon Rai&lt;/a&gt; MonoTouch posts including &lt;a href="http://sabonrai.wordpress.com/2009/08/28/monotouch-sample-code-uitableview/" target="20091008"&gt;UITableView in code&lt;/a&gt; taught me a lot.&lt;/li&gt;&lt;/ul&gt;Anyway, you can &lt;b&gt;download&lt;/b&gt; the &lt;a href="http://conceptdevelopment.net/iPhone/Roget01/Roget01.zip"&gt;&lt;b&gt;MonoDevelop solution&lt;/b&gt;&lt;/a&gt; and try it for yourself.&lt;br /&gt;&lt;br /&gt;These two class diagrams show the structure of the code. The first shows the classes that are used to deserialize the Xml data:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Ba76y6K7kvs/Ss_ki6L--aI/AAAAAAAABFg/RtO04uu1E4A/s1600-h/ClassDiagram1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 115px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/Ss_ki6L--aI/AAAAAAAABFg/RtO04uu1E4A/s200/ClassDiagram1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5390778567371979170" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;while this shows the application and viewcontroller implementations:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ba76y6K7kvs/Ss_kjsLVGYI/AAAAAAAABFo/LpC6WVvCknM/s1600-h/ClassDiagram2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 199px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/Ss_kjsLVGYI/AAAAAAAABFo/LpC6WVvCknM/s200/ClassDiagram2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5390778580791007618" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-1711441861847592073?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/1711441861847592073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/10/monotouch-rogets-1911-thesaurus.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/1711441861847592073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/1711441861847592073'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/10/monotouch-rogets-1911-thesaurus.html' title='MonoTouch &quot;Roget&apos;s 1911 Thesaurus&quot;'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Ba76y6K7kvs/Ss3FRTowf0I/AAAAAAAABEw/Vpp8Eudcm7I/s72-c/IMG_0520.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-3524268121764082094</id><published>2009-10-06T22:06:00.012+11:00</published><updated>2009-10-10T13:05:25.458+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>MonoTouch "iSOFlair" 2.0</title><content type='html'>The &lt;a href="http://conceptdev.blogspot.com/2009/08/monotouch-isoflair.html" target="20091006"&gt;original iSOFlair post&lt;/a&gt; was purely a demonstration of using &lt;code&gt;Settings.bundle root.plist&lt;/code&gt; to drive the iPhone Settings application. It's just a bit of fun with the &lt;a href="http://stackoverflow.com/users/flair" target="20091006"&gt;"Flair"&lt;/a&gt; feature of &lt;a href="http://stackoverflow.com/" target="20091006"&gt;stackoverflow.com&lt;/a&gt; and related sites.&lt;br /&gt;&lt;br /&gt;Since then I've incorporated:&lt;ul&gt;&lt;li&gt;&lt;a href="http://simon.nureality.ca/?p=135" target="20091006"&gt;Simon's Page Control sample&lt;/a&gt; (with added Page Control handling)&lt;/li&gt;&lt;li&gt;Download and save image via HTTP&lt;/li&gt;&lt;li&gt;Shake gesture support&lt;/li&gt;&lt;li&gt;Screen capture to Photos, filesystem&lt;/li&gt;&lt;li&gt;Set the badge on the application's icon&lt;/li&gt;&lt;/ul&gt; This is what it looks like:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/SssqwfxdbOI/AAAAAAAABDw/0YaYATrIoCA/s1600-h/IMG_0506.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/SssqwfxdbOI/AAAAAAAABDw/0YaYATrIoCA/s200/IMG_0506.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5389448391729966306" /&gt;&lt;/a&gt; &lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SssqwzV0ZxI/AAAAAAAABD4/9-ykBjxKvUc/s1600-h/IMG_0507.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SssqwzV0ZxI/AAAAAAAABD4/9-ykBjxKvUc/s200/IMG_0507.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5389448396982740754" /&gt;&lt;/a&gt; &lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/SssqxZMIBlI/AAAAAAAABEA/NrAYfBm5iGA/s1600-h/IMG_0508.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/SssqxZMIBlI/AAAAAAAABEA/NrAYfBm5iGA/s200/IMG_0508.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5389448407142630994" /&gt;&lt;/a&gt; &lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/Sssqxq3jM3I/AAAAAAAABEI/EwcWQnITo-8/s1600-h/IMG_0510.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/Sssqxq3jM3I/AAAAAAAABEI/EwcWQnITo-8/s200/IMG_0510.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5389448411888169842" /&gt;&lt;/a&gt; &lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/Sss4MpRgTrI/AAAAAAAABEo/xA1tqsPkjRg/s1600-h/IMG_0517.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/Sss4MpRgTrI/AAAAAAAABEo/xA1tqsPkjRg/s200/IMG_0517.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5389463168967790258" /&gt;&lt;/a&gt; &lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/Sss1iH7TNhI/AAAAAAAABEg/xP9LVEJIhdo/s1600-h/IMG_0516.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/Sss1iH7TNhI/AAAAAAAABEg/xP9LVEJIhdo/s200/IMG_0516.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5389460239438525970" /&gt;&lt;/a&gt;&lt;br /&gt;and you can download the &lt;a href="http://conceptdevelopment.net/iPhone/iSOFlair02/iSOFlair20.zip" target=""20091006&gt;MonoTouch v1.1 source code&lt;/a&gt; to try for yourself.&lt;br /&gt;&lt;br /&gt;&lt;b style="color:darkred"&gt;Settings via root.plist&lt;/b&gt;&lt;br /&gt;Configuring the iSOFlair application to show a particular user's statistics is done by the built-in iPhone Settings on the home screen. Creating the &lt;code&gt;Settings.bundle&lt;/code&gt; and &lt;code&gt;root.plist&lt;/code&gt; is covered in &lt;a href="http://conceptdev.blogspot.com/2009/08/monotouch-settingsbundle.html" target="20091006"&gt;this post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b style="color:darkred"&gt;Page Control&lt;/b&gt;&lt;br /&gt;Simon's &lt;a href="http://simon.nureality.ca/?p=135" target="20091006"&gt;sample&lt;/a&gt; makes it easy to set-up a Page Control with swiping however it's also possible to move between 'pages' by touching to the left or right of the dots. I added this delegate to &lt;code&gt;FinishedLaunching&lt;/code&gt; to handle that case:&lt;pre&gt;// handler for when the user navigates via the pager, rather than swiping&lt;br /&gt;pageControl.ValueChanged += delegate(object sender, EventArgs e) {&lt;br /&gt;   var pc = (UIPageControl)sender;&lt;br /&gt;   double fromPage = Math.Floor((scrollView.ContentOffset.X - scrollView.Frame.Width / 2) / scrollView.Frame.Width) + 1;&lt;br /&gt;   var toPage = pc.CurrentPage;&lt;br /&gt;   var pageOffset = scrollView.ContentOffset.X + scrollView.Frame.Width;&lt;br /&gt;   Console.WriteLine("fromPage " + fromPage + " toPage " + toPage); &lt;br /&gt;   if (fromPage &gt; toPage)&lt;br /&gt;      pageOffset = scrollView.ContentOffset.X - scrollView.Frame.Width;&lt;br /&gt;   PointF p = new PointF(pageOffset, 0);&lt;br /&gt;   scrollView.SetContentOffset(p,true);&lt;br /&gt;   list[toPage].ViewController.BecomeFirstResponder(); // so it can "accept" shakes&lt;br /&gt;   // so we can change the 'badge' on the application icon&lt;br /&gt;   maxPageVisited = maxPageVisited&amp;lt;toPage?toPage:maxPageVisited;&lt;br /&gt;};&lt;/pre&gt;&lt;b style="color:darkred"&gt;Download, save and display PNG in &lt;code&gt;UIImage&lt;/code&gt;&lt;/b&gt;&lt;br /&gt;With &lt;code&gt;using System.Net&lt;/code&gt; added to the file, the following code will download a remote image, save to the filesystem on the iPhone and set that image to display in a &lt;code&gt;UIImage&lt;/code&gt; control on your view:&lt;pre&gt;string ImagePath = Environment.GetFolderPath (Environment.SpecialFolder.Personal);&lt;br /&gt;ImagePath = Path.Combine (DocumentsDirectory, Site.PreferencesPrefix+"gravatar.png");&lt;br /&gt;WebClient wc = new WebClient();&lt;br /&gt;Uri uri = new Uri(gravatarUrl);&lt;br /&gt;try&lt;br /&gt;{ &lt;br /&gt;   wc.DownloadFile (uri, ImagePath); // saves to filesystem&lt;br /&gt;} &lt;br /&gt;catch (Exception ex1) {Console.Write("oops");}&lt;br /&gt;//UIImage img = UIImage.FromFile (ImagePath); // WHY does this break???&lt;br /&gt;UIImage img = UIImage.FromFileUncached(ImagePath); // BUT this works???&lt;br /&gt;if (img != null)&lt;br /&gt;   this.imageAvatar.Image = img; // displays on View&lt;/pre&gt;&lt;b style="color:darkred"&gt;Shake gesture&lt;/b&gt;&lt;br /&gt;Responding to the iPhone OS 3.0 'shake' gesture was covered in &lt;a href="http://conceptdev.blogspot.com/2009/10/monotouch-shake-shake-shake.html" target="20091006"&gt;this post&lt;/a&gt;. As I said before, showing the network activity indicator &lt;code&gt;UIApplication.SharedApplication.NetworkActivityIndicatorVisible=true;&lt;/code&gt; and then &lt;code&gt;false&lt;/code&gt; is a good idea so the user knows that something is going on!&lt;br /&gt;&lt;br /&gt;&lt;b style="color:darkred"&gt;Screen capture&lt;/b&gt;&lt;br /&gt;Using &lt;code&gt;UIGraphics ImageContext&lt;/code&gt; to take a screenshot was covered in &lt;a href="http://conceptdev.blogspot.com/2009/10/monotouch-screen-capture-in-c-code.html" target="20091006"&gt;this post&lt;/a&gt;.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/SsszUluIccI/AAAAAAAABEY/SHopZzU1_6A/s1600-h/Screenshot.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 196px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/SsszUluIccI/AAAAAAAABEY/SHopZzU1_6A/s200/Screenshot.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5389457807894933954" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style="color:darkred"&gt;Set badge&lt;/b&gt;&lt;br /&gt;The 'badge' is pretty contrived in this example. Every time the application starts (in &lt;code&gt;FinishedLaunching&lt;/code&gt;) I start the badge at '4' then during paging we reduce the count for each page that has been viewed. Just before the app closes (in &lt;code&gt;WillTerminate&lt;/code&gt;) we set the badge via &lt;pre&gt;UIApplication.SharedApplication.ApplicationIconBadgeNumber = 3 - maxPageVisited;&lt;/pre&gt;so that it is effectively showing the number of 'unviewed' panels in the application for the last execution.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SsszUOF7fnI/AAAAAAAABEQ/BbXP_joRF1E/s1600-h/Badge.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 100px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SsszUOF7fnI/AAAAAAAABEQ/BbXP_joRF1E/s200/Badge.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5389457801552297586" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style="color:darkred"&gt;THE CODE&lt;/b&gt;&lt;br /&gt;You can &lt;a href="http://conceptdevelopment.net/iPhone/iSOFlair02/iSOFlair20.zip"&gt;&lt;b&gt;download the MonoDevelop solution&lt;/b&gt;&lt;/a&gt; to &lt;a href="http://monotouch.net/DownloadTrial" target="20091006"&gt;try it&lt;/a&gt; for yourself. The c# files are also listed below for your perusal:&lt;ul&gt;&lt;li&gt;&lt;a href="http://conceptdevelopment.net/iPhone/iSOFlair02/Main.cs.htm" target="20091006"&gt;Main.cs&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://conceptdevelopment.net/iPhone/iSOFlair02/MainWindow.xib.cs.htm" target="20091006"&gt;MainWindow.xib.cs&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://conceptdevelopment.net/iPhone/iSOFlair02/SOViewController.xib.cs.htm" target="20091006"&gt;SOViewController.xib.cs&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://conceptdevelopment.net/iPhone/iSOFlair02/TrilogySite.cs.htm" target="20091006"&gt;TrilogySite.cs&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://conceptdevelopment.net/iPhone/iSOFlair02/Root.plist.htm" target="20091006"&gt;Root.plist&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-3524268121764082094?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/3524268121764082094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/10/monotouch-isoflair-20.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/3524268121764082094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/3524268121764082094'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/10/monotouch-isoflair-20.html' title='MonoTouch &quot;iSOFlair&quot; 2.0'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Ba76y6K7kvs/SssqwfxdbOI/AAAAAAAABDw/0YaYATrIoCA/s72-c/IMG_0506.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-1619323541984341418</id><published>2009-10-05T20:46:00.008+11:00</published><updated>2009-10-06T07:15:43.631+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>MonoTouch screen capture in c# code</title><content type='html'>In a &lt;a href="http://conceptdev.blogspot.com/2009/09/monotouch-infoplist-and-defaultpng.html" target="20091005"&gt;previous post&lt;/a&gt; I said that if you capture a screenshot of your application's final 'state' (say in &lt;code&gt;WillTerminate&lt;/code&gt;) and save it as &lt;code&gt;Default.png&lt;/code&gt; then &lt;i&gt;it&lt;/i&gt; would be used as the 'splash screen' next time the application starts (the built-in iPhone apps like Mail seem to do this by zooming in/out with a screen capture of their last state).&lt;br /&gt;&lt;br /&gt;The code below takes a screenshot, and was supposed to overwrite the &lt;b&gt;Default.png&lt;/b&gt; you have in your MonoTouch application root (eg. &lt;b&gt;iSOFlair.app/&lt;/b&gt;) and become the new splash screen. In order to 'test' this theory I had to write the code below and place it in &lt;code&gt;UIViewController&lt;/code&gt; subclasses that I wanted to 'capture'.&lt;br /&gt;&lt;br /&gt;Anyway, here's the code... not sure what other uses it might have?&lt;br /&gt;&lt;pre&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// Capture a copy of the current View and:&lt;br /&gt;/// * re-display in a UIImage control&lt;br /&gt;/// * save to the Photos collection&lt;br /&gt;/// * save to disk in the application's Documents folder&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;public void ScreenCapture()&lt;br /&gt;{&lt;br /&gt;   var documentsDirectory = Environment.GetFolderPath&lt;br /&gt;                                  (Environment.SpecialFolder.Personal);&lt;br /&gt;&lt;br /&gt;   Console.WriteLine("start capture of frame: " + this.View.Frame.Size);&lt;br /&gt;   UIGraphics.BeginImageContext(View.Frame.Size); &lt;br /&gt;   var ctx = UIGraphics.GetCurrentContext();&lt;br /&gt;   if (ctx != null)&lt;br /&gt;   {&lt;br /&gt;      View.Layer.RenderInContext(ctx);&lt;br /&gt;      UIImage img = UIGraphics.GetImageFromCurrentImageContext();&lt;br /&gt;      UIGraphics.EndImageContext();&lt;br /&gt;  &lt;br /&gt;      // Set to display in a UIImage control _on_ the view&lt;br /&gt;      imageLogo.Image = img;&lt;br /&gt;  &lt;br /&gt;      // Save to Photos&lt;br /&gt;      img.SaveToPhotosAlbum(&lt;br /&gt;         (sender, args)=&gt;{Console.WriteLine("image saved to Photos");}&lt;br /&gt;      );&lt;br /&gt;  &lt;br /&gt;      // Save to application's Documents folder&lt;br /&gt;      string png = Path.Combine (documentsDirectory, "Screenshot.png");&lt;br /&gt;      &lt;b&gt;// HACK: overwrite the splash screen. iSOFlair is the application name&lt;br /&gt;      //string png = Path.Combine (documentsDirectory, "../iSOFlair.app/Default.png");&lt;/b&gt;&lt;br /&gt;      NSData imgData = img.AsPNG();&lt;br /&gt;      NSError err = null;&lt;br /&gt;      if (imgData.Save(png, false, out err))&lt;br /&gt;      {&lt;br /&gt;         Console.WriteLine("saved as " + png);&lt;br /&gt;      } else {&lt;br /&gt;         Console.WriteLine("NOT saved as" + png + &lt;br /&gt;                            " because" + err.LocalizedDescription);&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;   else&lt;br /&gt;   {&lt;br /&gt;      Console.WriteLine("ctx null - doesn't seem to happen");&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;Now your MonoTouch iPhone app would appear to "startup" much faster :) There is still a bit of a trick with the &lt;code&gt;View.Frame.Size&lt;/code&gt; - doesn't take the status bar into account - which I will try to fix up in future. &lt;span style="color:darkred"&gt;&lt;b&gt;UPDATE:&lt;/b&gt; Tested in Simulator - works fine - but doesn't appear to work on the Device :-(&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Here is a useful &lt;a href="http://iphoneincubator.com/blog/tag/uiimagewritetosavedphotosalbum" target="20091005"&gt;ObjectiveC image tricks post&lt;/a&gt; that was helpful.&lt;br /&gt;&lt;br /&gt;p.s. for those who don't already know - as a &lt;i&gt;user&lt;/i&gt; you can always take a screen capture of the current display by pressing the Home and Power buttons at the same time... a new file will be created in your Photos : Camera Roll.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-1619323541984341418?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/1619323541984341418/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/10/monotouch-screen-capture-in-c-code.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/1619323541984341418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/1619323541984341418'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/10/monotouch-screen-capture-in-c-code.html' title='MonoTouch screen capture in c# code'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-4107399910497646770</id><published>2009-10-03T19:46:00.002+10:00</published><updated>2009-10-03T20:20:47.396+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>MonoTouch shake shake shake</title><content type='html'>I like the way the iPhone Facebook application updates on a shake (no wasted screen real-estate with an Update button), so I went looking for some ideas how to do it. This &lt;a href="http://stackoverflow.com/questions/1170917/how-to-use-shake-api-in-iphone-sdk-3-0" target="20091003"&gt;StackOverflow thread about shake API&lt;/a&gt; describes both 'old school' (using accelerometer) and new OS3.0 built-in &lt;a href="http://www.go-mono.com/docs/index.aspx?link=M%3AMonoTouch.UIKit.UIResponder.MotionEnded(MonoTouch.UIKit.UIEventSubtype%2CMonoTouch.UIKit.UIEvent)" target="2009003"&gt;&lt;i&gt;MotionEnded&lt;/i&gt;&lt;/a&gt; methods.&lt;br /&gt;&lt;br /&gt;This c# code for MonoTouch just uses the OS3.0 feature - it's easier and the Simulator &lt;b&gt;Hardware&lt;/b&gt; menu has a &lt;b&gt;Shake Gesture&lt;/b&gt; item for testing :)&lt;br /&gt;&lt;br /&gt;Firstly, in your &lt;code&gt;Main.cs&lt;/code&gt; (or wherever &lt;code&gt;FinishedLaunching&lt;/code&gt; is defined) add&lt;pre&gt;UIApplication.SharedApplication.ApplicationSupportsShakeToEdit = true;&lt;/pre&gt;then put this code in your &lt;code&gt;UIViewController&lt;/code&gt; subclass/es.&lt;br /&gt;&lt;pre&gt;#region respond to shaking (OS3+)&lt;br /&gt;public override bool CanBecomeFirstResponder {&lt;br /&gt;   get {&lt;br /&gt;      return true;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;public override void ViewDidAppear (bool animated)&lt;br /&gt;{&lt;br /&gt;   base.ViewDidAppear (animated);&lt;br /&gt;   this.BecomeFirstResponder();&lt;br /&gt;}&lt;br /&gt;public override void ViewWillDisappear (bool animated)&lt;br /&gt;{&lt;br /&gt;   this.ResignFirstResponder();&lt;br /&gt;   base.ViewWillDisappear (animated);&lt;br /&gt;}&lt;br /&gt;public override void MotionEnded (UIEventSubtype motion, UIEvent evt)&lt;br /&gt;{&lt;br /&gt;   Console.WriteLine("Motion detected");&lt;br /&gt;   if (motion ==  UIEventSubtype.MotionShake)&lt;br /&gt;   {&lt;br /&gt;      Console.WriteLine("and was a shake");&lt;br /&gt;      // Do your application-specific shake response here...&lt;br /&gt;      Update();   &lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;#endregion&lt;/pre&gt;Within your &lt;code&gt;Update&lt;/code&gt; method (or whatever you call it), you probably want to wrap your internet access with code to show/hide the network indicator spinner in the status bar (&lt;code&gt;NetworkActivityIndicatorVisible = true&lt;/code&gt;) so the user knows that something is happening. Here's a basic example:&lt;pre&gt;WebClient wc = new WebClient();&lt;br /&gt;Uri uri = new Uri("http://sample.corp/stuff");&lt;br /&gt;byte[] bytes = null;&lt;br /&gt;try {&lt;br /&gt;   UIApplication.SharedApplication.&lt;b&gt;NetworkActivityIndicatorVisible&lt;/b&gt; = true;&lt;br /&gt;   bytes = wc.DownloadData(uri);&lt;br /&gt;}&lt;br /&gt;catch (Exception ex) {&lt;br /&gt;   Console.WriteLine("Internet connection failed: " + ex.Message);&lt;br /&gt;   return;&lt;br /&gt;} &lt;br /&gt;finally {&lt;br /&gt;   UIApplication.SharedApplication.&lt;b&gt;NetworkActivityIndicatorVisible&lt;/b&gt; = false;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;NOTE:&lt;/b&gt; other iPhone applications use the shake gesture for Undo - here's a simple &lt;a href="http://www.mobileorchard.com/new-in-iphone-30-tutorial-series-part-1-shake-to-undoredo-nsundomanager/" target="20091003"&gt;NSUndoManager example&lt;/a&gt; (ObjectiveC, but fairly easy to follow).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-4107399910497646770?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/4107399910497646770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/10/monotouch-shake-shake-shake.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/4107399910497646770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/4107399910497646770'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/10/monotouch-shake-shake-shake.html' title='MonoTouch shake shake shake'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-6045966775260565493</id><published>2009-09-27T21:10:00.016+10:00</published><updated>2009-10-13T20:51:54.629+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>MonoTouch MapKit 103</title><content type='html'>&lt;b style="color:darkred"&gt;UPDATE 13-Oct:&lt;/b&gt; This code all works in the latest version of MonoTouch - v1.1 - on devices AND in the simulator. You can download a &lt;a href="http://conceptdevelopment.net/iPhone/MapKit03/MapKit03.zip" target="20091013"&gt;MonoDevelop solution&lt;/a&gt; or view the c# files:&lt;ul&gt;&lt;li&gt;&lt;a href="http://conceptdevelopment.net/iPhone/MapKit03/Main.cs.htm" target="20091013"&gt;Main.cs&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://conceptdevelopment.net/iPhone/MapKit03/MainWindow.xib.designer.cs.htm" target="20091013"&gt;MainWindow.xib.designer.cs&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b style="color:darkred"&gt;UPDATE 28-Sep:confirmation from Geoff that the problem with the Simulator should be fixed in 1.1, coming soon...&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Once again thanks to a hint from &lt;a href="http://blog.sublimeintervention.com/" target="20090926"&gt;Geoff&lt;/a&gt;, I've pieced a little more of MapKit together. This has been tested with RC2 of MonoTouch. The trick? It ONLY WORKS ON THE DEVICE - the simulator will 'crash' with the Stack Trace shown at the bottom of this post (I'm sure this will be fixed in a future release). &lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/Sr9LoEuOU8I/AAAAAAAABDo/Cn2fos1ebuA/s1600-h/MKAnnotation1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 310px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/Sr9LoEuOU8I/AAAAAAAABDo/Cn2fos1ebuA/s320/MKAnnotation1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5386106831192871874" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style="color:darkred"&gt;This code in &lt;code&gt;FinishedLaunching&lt;/code&gt;&lt;/b&gt;&lt;br /&gt;Once again, use the 'new' AddAnnotation&lt;i&gt;Object&lt;/i&gt; method.&lt;pre&gt;mapView.Delegate = new MapViewDelegate(this);&lt;br /&gt;MyAnnotation a = new MyAnnotation(&lt;br /&gt;    new CLLocationCoordinate2D(-33.867139,151.207114)&lt;br /&gt;    , "Home"&lt;br /&gt;   , "is where the heart is"&lt;br /&gt;   );&lt;br /&gt;Console.WriteLine(" ### This breaks in the simulator BUT it works on device!!!");&lt;br /&gt;mapView.AddAnnotation&lt;b&gt;Object&lt;/b&gt;(a);&lt;/pre&gt;&lt;b style="color:darkred"&gt;with this &lt;code&gt;MKAnnotation&lt;/code&gt; subclass&lt;/b&gt;&lt;br /&gt;In MonoTouch &lt;code&gt;MKAnnotation&lt;/code&gt; is an abstract class, but in ObjectiveC it's a &lt;i&gt;@protocol&lt;/i&gt;. This kinda explains why everything in the class is read-only - &lt;i&gt;@protocol&lt;/i&gt;s are akin to &lt;code&gt;interface&lt;/code&gt;s in C#, but they cannot be "modelled" as interfaces in MonoTouch because &lt;i&gt;@protocol&lt;/i&gt;s members can be optional! The simplest way to get an annotation is therefore this implementation (although I &lt;i&gt;think&lt;/i&gt; you could also create your own subclass of &lt;code&gt;NSObject&lt;/code&gt; and &lt;code&gt;Export()&lt;/code&gt; the &lt;code&gt;MKAnnotation&lt;/code&gt; members manually).&lt;pre&gt;public class MyAnnotation : MKAnnotation&lt;br /&gt;{&lt;br /&gt;   private CLLocationCoordinate2D _coordinate;&lt;br /&gt;   private string _title, _subtitle;&lt;br /&gt;   public override CLLocationCoordinate2D Coordinate {&lt;br /&gt;      get { return _coordinate; }&lt;br /&gt;   }&lt;br /&gt;   public override string Title {&lt;br /&gt;      get { return _title; }&lt;br /&gt;   }&lt;br /&gt;   public override string Subtitle {&lt;br /&gt;      get { return _subtitle; }&lt;br /&gt;   }&lt;br /&gt;   /// &amp;lt;summary&amp;gt;&lt;br /&gt;   /// Need this constructor to set the fields, since the public&lt;br /&gt;   /// interface of this class is all READ-ONLY&lt;br /&gt;   /// &amp;lt;summary&amp;gt;&lt;br /&gt;   public MyAnnotation (CLLocationCoordinate2D coord,&lt;br /&gt;                            string t, string s) : base()&lt;br /&gt;   {&lt;br /&gt;      _coordinate=coord;&lt;br /&gt;      _title=t; &lt;br /&gt;      _subtitle=s;&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;&lt;b style="color:darkred"&gt;and this &lt;code&gt;MKMapViewDelegate&lt;/code&gt; implementation&lt;/b&gt;&lt;pre&gt;public class MapViewDelegate : MKMapViewDelegate&lt;br /&gt;{&lt;br /&gt;   private AppDelegate _appd;&lt;br /&gt;   public MapViewDelegate (AppDelegate appd):base()&lt;br /&gt;   {&lt;br /&gt;      _appd = appd;&lt;br /&gt;   }&lt;br /&gt;   /// &lt;summary&gt;&lt;br /&gt;   /// When user moves the map, update lat,long text in label&lt;br /&gt;   /// &lt;/summary&gt;&lt;br /&gt;   public override void RegionChanged &lt;br /&gt;                        (MKMapView mapView, bool animated)&lt;br /&gt;   {&lt;br /&gt;      Console.WriteLine("Region did change");&lt;br /&gt;      _appd.labelCurrent.Text = "Map Center " &lt;br /&gt;         + mapView.CenterCoordinate.Latitude + ", " &lt;br /&gt;         + mapView.CenterCoordinate.Longitude;&lt;br /&gt;   }&lt;br /&gt;   /// &lt;summary&gt;&lt;br /&gt;   /// Seems to work in the Simulator now&lt;br /&gt;   /// &lt;/summary&gt;&lt;br /&gt;   public override MKAnnotationView GetViewForAnnotation &lt;br /&gt;                    (MKMapView mapView, NSObject annotation)&lt;br /&gt;   {&lt;br /&gt;      var anv = mapView.DequeueReusableAnnotation("thislocation");&lt;br /&gt;      if (anv == null)&lt;br /&gt;      {&lt;br /&gt;         Console.WriteLine("creating new MKAnnotationView");&lt;br /&gt;         anv = new MKPinAnnotationView(annotation, "thislocation");&lt;br /&gt;      }&lt;br /&gt;      else &lt;br /&gt;      {&lt;br /&gt;         anv.Annotation = annotation;&lt;br /&gt;      }&lt;br /&gt;      anv.AnimatesDrop = true;&lt;br /&gt;      anv.PinColor = MKPinAnnotationColor.Green;&lt;br /&gt;      anv.CanShowCallout = true;&lt;br /&gt;      return anv;&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;This Stack Trace (below) is what you'll see in MonoDevelop when using the Simulator - upload to the device to get it working (or if you are using the trial version, you may have to wait for an update to MonoTouch). &lt;b style="color:darkred"&gt;UPDATE:fixed in MonoTouch 1.1&lt;/b&gt;&lt;br /&gt;&lt;pre style="font-size:small"&gt;  at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication.UIApplicationMain (int,string[],intptr,intptr) &lt;0x00004&gt;&lt;br /&gt;  at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication.UIApplicationMain (int,string[],intptr,intptr) &lt;IL 0x0009f, 0xffffffff&gt;&lt;br /&gt;  at MonoTouch.UIKit.UIApplication.Main (string[],string,string) &lt;IL 0x0003e, 0x00089&gt;&lt;br /&gt;  at MonoTouch.UIKit.UIApplication.Main (string[]) &lt;IL 0x00003, 0x00014&gt;&lt;br /&gt;  at MapKit01.Application.Main (string[]) &lt;IL 0x00001, 0x00017&gt;&lt;br /&gt;  at (wrapper runtime-invoke) &lt;Module&gt;.runtime_invoke_void_object (object,intptr,intptr,intptr) &lt;IL 0x00044, 0xffffffff&gt;&lt;br /&gt;Native stacktrace:&lt;br /&gt; 0   MapKit01          0x00092d1a mono_handle_native_sigsegv + 266&lt;br /&gt; 1   MapKit01          0x00006f3a mono_sigsegv_signal_handler + 298&lt;br /&gt; 2   libSystem.B.dylib 0x90b25b9b _sigtramp + 43&lt;br /&gt; 3   ???               0xffffffff 0x0 + 4294967295&lt;br /&gt;Debug info from gdb:&lt;br /&gt;warning: Trying to remove a section from the ordered section list that did not exist at 0x2d4000.&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-6045966775260565493?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/6045966775260565493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/09/monotouch-mapkit-103.html#comment-form' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/6045966775260565493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/6045966775260565493'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/09/monotouch-mapkit-103.html' title='MonoTouch MapKit 103'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Ba76y6K7kvs/Sr9LoEuOU8I/AAAAAAAABDo/Cn2fos1ebuA/s72-c/MKAnnotation1.png' height='72' width='72'/><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-8351816483565807221</id><published>2009-09-25T20:57:00.006+10:00</published><updated>2009-09-27T21:49:55.703+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>MonoTouch MapKit 102</title><content type='html'>&lt;span style="color:darkred"&gt;&lt;b&gt;UPDATE 27-Sep:&lt;/b&gt;&lt;a href="http://conceptdev.blogspot.com/2009/09/monotouch-mapkit-103.html"&gt;MapKit 103&lt;/a&gt; has the &lt;code&gt;MKAnnotation&lt;/code&gt; working - DEVICE ONLY.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Thanks to &lt;a href="http://blog.sublimeintervention.com/" target="20090925"&gt;Geoff&lt;/a&gt; and a bit of &lt;a href="http://www.iphonedevsdk.com/forum/iphone-sdk-development/14008-mkannotation-problem.html" target="20090925"&gt;ObjC sample code&lt;/a&gt; I've figured out a little bit more of MapKit with MonoTouch. &lt;code&gt;MKPlacemarks&lt;/code&gt; now appear (although I'm still working on &lt;code&gt;MKAnnotation&lt;/code&gt;).&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Ba76y6K7kvs/SrytDSkIFVI/AAAAAAAABDg/QAjk8FWh24k/s1600-h/MapKit102b.jpg"&gt;&lt;img style="cursor: pointer; width: 104px; height: 200px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/SrytDSkIFVI/AAAAAAAABDg/QAjk8FWh24k/s200/MapKit102b.jpg" alt="" id="BLOGGER_PHOTO_ID_5385369526462846290" border="0" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SrytDBMWa7I/AAAAAAAABDY/fRYBYCVUVKg/s1600-h/MapKit102.jpg"&gt;&lt;img style="cursor: pointer; width: 104px; height: 200px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SrytDBMWa7I/AAAAAAAABDY/fRYBYCVUVKg/s200/MapKit102.jpg" alt="" id="BLOGGER_PHOTO_ID_5385369521799719858" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The main changes from &lt;a href="http://conceptdev.blogspot.com/2009/09/monotouch-mapkit-101.html" target="20090925"&gt;MapKit 101&lt;/a&gt; are:&lt;br /&gt;&lt;br /&gt;&lt;b style="color: darkred;"&gt;&lt;code&gt;FoundWithPlacemark&lt;/code&gt;&lt;/b&gt;&lt;br /&gt;Now calls the *Object method added by Geoff.&lt;br /&gt;&lt;code&gt;_appd.mapView.AddAnnotation&lt;b&gt;Object&lt;/b&gt;(placemark); &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style="color: darkred;"&gt;&lt;code&gt;MapViewDelegate&lt;/code&gt;&lt;/b&gt;&lt;br /&gt;Updated to pass the annotation into the constructor of &lt;code&gt;MKPinAnnotationView&lt;/code&gt; and also set the properties for animation, color and showing the callout when clicked.&lt;br /&gt;&lt;pre&gt;public override MKAnnotationView GetViewForAnnotation&lt;br /&gt;                 (MKMapView mapView, NSObject annotation)&lt;br /&gt;{&lt;br /&gt;  Console.WriteLine("get view MKAnnotation "+annotation);&lt;br /&gt;  var anv = mapView.DequeueReusableAnnotation("thislocation");&lt;br /&gt;  if (anv == null)&lt;br /&gt;  {&lt;br /&gt;     Console.WriteLine("creating new MKAnnotationView");&lt;br /&gt;     anv = new MKPinAnnotationView(annotation, "thislocation");&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;  {&lt;br /&gt;     anv.Annotation = annotation;&lt;br /&gt;  }&lt;br /&gt;  anv.AnimatesDrop = true;&lt;br /&gt;  anv.PinColor = MKPinAnnotationColor.Green;&lt;br /&gt;  anv.CanShowCallout = true;&lt;br /&gt;  return anv;&lt;br /&gt;}&lt;/pre&gt;Hopefully I can figure out the &lt;code&gt;MKAnnotation&lt;/code&gt; issue too...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-8351816483565807221?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/8351816483565807221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/09/monotouch-mapkit-102.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/8351816483565807221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/8351816483565807221'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/09/monotouch-mapkit-102.html' title='MonoTouch MapKit 102'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Ba76y6K7kvs/SrytDSkIFVI/AAAAAAAABDg/QAjk8FWh24k/s72-c/MapKit102b.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-6456344457575533864</id><published>2009-09-24T19:47:00.007+10:00</published><updated>2009-09-24T20:02:00.325+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iis7'/><title type='text'>#ScottGuAnnouncement : WebsiteSpark (free IIS7)</title><content type='html'>There was certainly a lot of 'buzz' about &lt;a href="http://search.twitter.com/search?q=%23ScottGuAnnouncement" target="20090924"&gt;#ScottGuAnnouncement&lt;/a&gt; on Twitter... although I'm not sure it has lived up to the hype...&lt;br /&gt;&lt;br /&gt;Seems like the main announcement was 'BizSpark-lite' - &lt;a href="http://www.microsoft.com/web/websitespark/" target="20090924"&gt;WebsiteSpark&lt;/a&gt; - which lowers the cost barrier to small companies 'starting out' with Microsoft. Meh.&lt;br /&gt;&lt;br /&gt;More interesting (to me) was &lt;a href="http://www.microsoft.com/web/downloads/platform.aspx" target="20090924"&gt;Web Platform Installer v2&lt;/a&gt;... I don't know whether it already did this - but there is now the ability to install IIS7 very easily. If this has been around for ages without me realizing, all I can say is "d'oh".&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SrtAUr8Zr3I/AAAAAAAABCw/zFW4SOXRng4/s1600-h/WebPlatform_IIS7_Installer.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 100px; height: 200px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SrtAUr8Zr3I/AAAAAAAABCw/zFW4SOXRng4/s200/WebPlatform_IIS7_Installer.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5384968503589187442" /&gt;&lt;/a&gt; &lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/SrtAVSutiwI/AAAAAAAABC4/qkJ_p_nDamc/s1600-h/WebPlatform_IIS7_Installer2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 176px; height: 200px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/SrtAVSutiwI/AAAAAAAABC4/qkJ_p_nDamc/s200/WebPlatform_IIS7_Installer2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5384968514000751362" /&gt;&lt;/a&gt; &lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/SrtAV_g3puI/AAAAAAAABDA/ih4v2ep2oas/s1600-h/WebPlatform_IIS7_Installer3.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 177px; height: 200px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/SrtAV_g3puI/AAAAAAAABDA/ih4v2ep2oas/s200/WebPlatform_IIS7_Installer3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5384968526022289122" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/SrtCsdJQDnI/AAAAAAAABDQ/XYNV-M01nFg/s1600-h/WebPlatform_IIS7_Installer5.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 159px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/SrtCsdJQDnI/AAAAAAAABDQ/XYNV-M01nFg/s200/WebPlatform_IIS7_Installer5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5384971110956666482" /&gt;&lt;/a&gt; &lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/SrtCXCeFf4I/AAAAAAAABDI/SnRyZrgksuI/s1600-h/WebPlatform_IIS7_Installer4.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 170px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/SrtCXCeFf4I/AAAAAAAABDI/SnRyZrgksuI/s200/WebPlatform_IIS7_Installer4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5384970743019044738" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So should we now just use IIS7 with Visual Studio 2008/10? Is Cassini dead?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;p.s. not sure what to make of this announcement: &lt;a href="http://www.linuxworld.com/news/2009/092309-microsoft-silverlight-to-run-on.html" target="20090924"&gt;"Microsoft Silverlight to run on Moblin devices"&lt;/a&gt;? And Microsoft has let Novell toil away on Moonlight &lt;i&gt;why?&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-6456344457575533864?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/6456344457575533864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/09/scottguannouncement-websitespark-free.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/6456344457575533864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/6456344457575533864'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/09/scottguannouncement-websitespark-free.html' title='#ScottGuAnnouncement : WebsiteSpark (free IIS7)'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Ba76y6K7kvs/SrtAUr8Zr3I/AAAAAAAABCw/zFW4SOXRng4/s72-c/WebPlatform_IIS7_Installer.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-2828085530258264591</id><published>2009-09-20T21:24:00.005+10:00</published><updated>2009-09-20T21:41:49.022+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maps'/><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><title type='text'>Silverlight mapanimation</title><content type='html'>Taking a small break from &lt;a href="http://monotouch.net" target="20090920"&gt;MonoTouch&lt;/a&gt; to update &lt;a href="http://racereplay.net" target="20090920"&gt;RaceReplay.net&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Click to view each image&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/SrYUmL9bymI/AAAAAAAABCo/LlJn0DK9srU/s1600-h/rr_bridge.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 200px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/SrYUmL9bymI/AAAAAAAABCo/LlJn0DK9srU/s200/rr_bridge.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5383513050846055010" /&gt;&lt;/a&gt; &lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/SrYUl8yCoEI/AAAAAAAABCg/HX3dMF7VgcY/s1600-h/rr_half.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 200px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/SrYUl8yCoEI/AAAAAAAABCg/HX3dMF7VgcY/s200/rr_half.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5383513046771736642" /&gt;&lt;/a&gt; &lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SrYUlOIAv6I/AAAAAAAABCY/iGkBKkAygdY/s1600-h/rr_full.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 200px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SrYUlOIAv6I/AAAAAAAABCY/iGkBKkAygdY/s200/rr_full.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5383513034247421858" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;or if you already have &lt;a href="http://silverlight.net" target="20090920"&gt;Silverlight&lt;/a&gt;, watch the animations of today's &lt;a href="http://www.sydneyrunningfestival.com.au/" target="20090920"&gt;Sydney Running Festival&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://RaceReplay.net/SydneyFestival/Marathon/" target="20090920"&gt;Marathon (42.2km)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://RaceReplay.net/SydneyFestival/HalfMarathon/" target="20090920"&gt;Half Marathon (21.1km)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://RaceReplay.net/SydneyFestival/BridgeRun/" target="20090920"&gt;Bridge Run (9km)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b style="color:darkred"&gt;Missing MonoTouch?&lt;/b&gt;&lt;br /&gt;To get your MonoTouch fix for the day, I recommend the following screencasts by &lt;a href="http://www.codesnack.com/about-me/" target="20090920"&gt;Brent Schooley&lt;/a&gt;:&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.codesnack.com/blog/2009/9/20/getting-started-with-monotouch.html" target="20090920"&gt;Getting Started with MonoTouch&lt;/a&gt; - installing the pre-requisites and building 'Hello World'&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codesnack.com/blog/2009/9/18/uitabbarcontroller-xcode-and-monotouch.html" target="20090920"&gt;UITabBarController&lt;/a&gt; - a two-parter that contrasts the same sample application being built in Objective-C/XCode and C#/MonoTouch.&lt;/li&gt;&lt;/ul&gt;Highly recommended.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-2828085530258264591?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/2828085530258264591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/09/silverlight-mapanimation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/2828085530258264591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/2828085530258264591'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/09/silverlight-mapanimation.html' title='Silverlight mapanimation'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Ba76y6K7kvs/SrYUmL9bymI/AAAAAAAABCo/LlJn0DK9srU/s72-c/rr_bridge.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-4408973160184936392</id><published>2009-09-18T19:14:00.017+10:00</published><updated>2009-10-06T07:00:37.048+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>MonoTouch Info.plist &amp; Default.png</title><content type='html'>I'm the first to admit this is a somewhat lazy post... but hey it's Friday. There's not a lot of MonoTouch-C#-specific content today - but .NET developers coming to the iPhone might not be aware of this stuff, so here goes:&lt;br /&gt;&lt;br /&gt;&lt;b style="color:darkred"&gt;Default.png&lt;/b&gt;&lt;br /&gt;AKA "Splash screen", if you place a file named &lt;b&gt;Default.png&lt;/b&gt; in the root of your application with &lt;code&gt;Build action: Content&lt;/code&gt; then the iPhone will automatically display this while the application loads (rather than the "black screen").&lt;br /&gt;There's a few approaches you can take: the &lt;i&gt;awesome&lt;/i&gt; &lt;a href="http://www.firemint.com/flightcontrol/fcappstore.html" target="20090917"&gt;&lt;b&gt;Flight Control&lt;/b&gt;&lt;/a&gt; app uses a simple 'Please wait' banner (which conveniently prompts you to turn the phone sideways); my &lt;a href="http://conceptdev.blogspot.com/2009/08/monotouch-restaurant-bill-splitter.html" target="20090917"&gt;other sample&lt;/a&gt; uses a 'greyed out' copy of its UI with a 'loading...' message.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SrNibxuEglI/AAAAAAAABBI/AdhgOTEbfnA/s1600-h/Default2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SrNibxuEglI/AAAAAAAABBI/AdhgOTEbfnA/s320/Default2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5382754208980435538" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ba76y6K7kvs/SrNicTy3cJI/AAAAAAAABBQ/YNAD2TD_Rus/s1600-h/Default1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/SrNicTy3cJI/AAAAAAAABBQ/YNAD2TD_Rus/s320/Default1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5382754218127356050" /&gt;&lt;/a&gt;&lt;br /&gt;Alternatively you could take a screenshot before shut-down and save it as /Name.app/Default.png, so the next time it starts up it &lt;i&gt;looks&lt;/i&gt; like you are continuing where you left off - even before the app is finished loading. &lt;span style="color:red"&gt;UPDATE: here's some &lt;a href="http://conceptdev.blogspot.com/2009/10/monotouch-screen-capture-in-c-code.html" target="20090917"&gt;sample screenshot code&lt;/a&gt; to add to your &lt;code&gt;WillTerminate&lt;/code&gt; method&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style="color:darkred"&gt;Info.plist&lt;/b&gt;&lt;br /&gt;Whether you realise it or not, your MonoTouch app &lt;i&gt;already&lt;/i&gt; contains an &lt;b&gt;Info.plist&lt;/b&gt; file - right-click on your project &amp;rarr; &lt;code&gt;Options&lt;/code&gt; &amp;rarr; &lt;code&gt;iPhone Application&lt;/code&gt; &amp;rarr; &lt;code&gt;Application Bundle&lt;/code&gt; - these fields all end up in a MonoTouch-generated Info.plist. &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SrNs9cTyApI/AAAAAAAABB4/1qItv5d1o1M/s1600-h/AppOptions.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 142px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SrNs9cTyApI/AAAAAAAABB4/1qItv5d1o1M/s200/AppOptions.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5382765782464856722" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you navigate with Finder to &lt;code&gt;/Projects/&amp;lt;your project&amp;gt;/bin/iPhone/debug/&lt;/code&gt; and remove the &lt;code&gt;.app&lt;/code&gt; extension you can open your 'app' (it's just a folder!) then you can view the generated &lt;b&gt;Info.plist&lt;/b&gt; that is sent to your device.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SrNko_JAuQI/AAAAAAAABBY/P2OkseFsWEs/s1600-h/Infoplist.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 295px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SrNko_JAuQI/AAAAAAAABBY/P2OkseFsWEs/s320/Infoplist.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5382756634944649474" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That doesn't mean you are restricted from adding more details though! Remember that plist files are basically just a special 'Apple' form of XML. Simply add a text file to the root of your project and rename it &lt;b&gt;Info.plist&lt;/b&gt; - MonoTouch will merge it with the &lt;code&gt;Options&lt;/code&gt; before copying to the simulator/device. Here is a &lt;a href="http://conceptdevelopment.net/iPhone/InitiateCall02/Info.plist.htm" target="20090917"&gt;sample Info.plist&lt;/a&gt; (described below). DON'T FORGET to set the &lt;code&gt;Build action:Content&lt;/code&gt; in the file's properties.&lt;br /&gt;&lt;br /&gt;&lt;i style="color:darkred"&gt;SBUsesNetwork &amp;amp; UIRequiresPersistentWiFi&lt;/i&gt;&lt;br /&gt;Indicates to the operating system that your app uses connectivity. The &lt;a href="http://www.iphonedevsdk.com/forum/iphone-sdk-development/24108-question-about-uirequirespersistentwifi-usage.html" target="20090917"&gt;Persistent&lt;/a&gt; setting keeps the WiFi running (so beware of running down the battery).&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ba76y6K7kvs/SrNnTMaAMXI/AAAAAAAABBo/Rw4Z3umV-6U/s1600-h/UsesNetwork.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 299px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/SrNnTMaAMXI/AAAAAAAABBo/Rw4Z3umV-6U/s320/UsesNetwork.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5382759559083340146" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;i style="color:darkred"&gt;UIPrerenderedIcon&lt;/i&gt;&lt;br /&gt;When &lt;code&gt;true&lt;/code&gt; it tells the operating system that your icon is already pretty, and not to mess with it! When &lt;code&gt;false&lt;/code&gt; the icon is made shiny with curved corners for you. &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SrNnS6Qw-3I/AAAAAAAABBg/Fq0KkGusQAs/s1600-h/Prerender.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 303px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SrNnS6Qw-3I/AAAAAAAABBg/Fq0KkGusQAs/s320/Prerender.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5382759554212756338" /&gt;&lt;/a&gt;&lt;br /&gt;You probably want to leave it as the default: &lt;b&gt;false&lt;/b&gt;!&lt;br /&gt;&lt;br /&gt;&lt;i style="color:darkred"&gt;UIStatusBarHidden&lt;/i&gt;&lt;br /&gt;If true, totally HIDES the status bar (eg. for games such as &lt;b&gt;Flight Control&lt;/b&gt;). &lt;br /&gt;&lt;br /&gt;&lt;i style="color:darkred"&gt;UIStatusBarStyle&lt;/i&gt;&lt;br /&gt;Use this to turn the status bar from grey to black! The &lt;code&gt;UIPrerenderedIcon&lt;/code&gt; example above also shows the &lt;code&gt;UIStatusBarStyleOpaqueBlack&lt;/code&gt; status bar style.&lt;br /&gt;&lt;br /&gt;&lt;i style="color:darkred"&gt;UIInterfaceOrientation&lt;/i&gt;&lt;br /&gt;If you change this from the default setting (eg. to &lt;code&gt;UIInterfaceOrientationLandscapeRight&lt;/code&gt;) you should ensure you have provided landscape views in your application. You really don't want this effect:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SrNpB_ZcXhI/AAAAAAAABBw/Tfe2P_tZZmA/s1600-h/Orientation.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SrNpB_ZcXhI/AAAAAAAABBw/Tfe2P_tZZmA/s200/Orientation.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5382761462556810770" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;i style="color:darkred"&gt;CFBundleURLTypes&lt;/i&gt;&lt;br /&gt;If you read about &lt;a href="http://conceptdev.blogspot.com/2009/09/initiate-call-with-monotouch.html" target="20090917"&gt;initiating a call or other actions&lt;/a&gt; in MonoTouch you'll know about the use of &lt;code&gt;OpenURL&lt;/code&gt; schemes to open other applications. &lt;br /&gt;&lt;br /&gt;Using &lt;code&gt;CFBundleURLTypes&lt;/code&gt; in &lt;b&gt;Info.plist&lt;/b&gt; informs the operating system of what schemes &lt;i&gt;your&lt;/i&gt; application will respond to. If you use the &lt;a href="http://conceptdevelopment.net/iPhone/InitiateCall02/Info.plist.htm" target="20090917"&gt;sample Info.plist&lt;/a&gt; and view this blogpost on your iPhone, clicking &lt;a href="initdial://123456789"&gt;initdial://123456789&lt;/a&gt; will open your app! You probably also want to parse the parameters... but that's another post :)&lt;br /&gt;&lt;br /&gt;Custom schemes are really useful for social apps (eg. twitter clients, map stuff, etc). To learn more about what schemes are already available/used check out &lt;a href="http://www.handleopenurl.com/" target="20090917"&gt;handleopenurl.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;There are many more options you can set in &lt;b&gt;Info.plist&lt;/b&gt;, and also other ways to control some of the things above (such as showing/hiding and changing the appearance of the status bar). Check out some of the Objective-C resources and try them for yourself!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-4408973160184936392?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/4408973160184936392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/09/monotouch-infoplist-and-defaultpng.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/4408973160184936392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/4408973160184936392'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/09/monotouch-infoplist-and-defaultpng.html' title='MonoTouch Info.plist &amp; Default.png'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Ba76y6K7kvs/SrNibxuEglI/AAAAAAAABBI/AdhgOTEbfnA/s72-c/Default2.png' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-352806436030534571</id><published>2009-09-14T21:30:00.005+10:00</published><updated>2009-09-16T09:13:22.706+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>MonoTouch released</title><content type='html'>&lt;a href="http://monotouch.net/" target="20090914"&gt;MonoTouch 1.0&lt;/a&gt; has been released and is available for purchase!&lt;br /&gt;&lt;img src="http://monotouch.net/skins/monotouch/mt/mt-logo.png" alt="MonoTouch logo" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style="color:darkred"&gt;Phonebook sample updated&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Thank's to &lt;a href="http://simon.nureality.ca/" target="20090914"&gt;Simon's&lt;/a&gt; &lt;a href="http://simon.nureality.ca/?p=91" target="20090914"&gt;Build a Customer UITableViewCell&lt;/a&gt; post the &lt;a href="http://conceptdev.blogspot.com/2009/09/monotouch-with-sqlite-corporate.html" target="20090914"&gt;Corporate Phonebook sample&lt;/a&gt; has been updated: now featuring custom &lt;code&gt;UITableViewCell&lt;/code&gt;s (and the phonenumbers don't overflow any more). Read more in the &lt;a href="http://conceptdev.blogspot.com/2009/09/monotouch-with-sqlite-corporate.html" target="20090914"&gt;previous post&lt;/a&gt;. &lt;br /&gt; &lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/Sq4qOHr1GSI/AAAAAAAABBA/0EaQKS_lPpc/s1600-h/Corp411a.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 164px; height: 320px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/Sq4qOHr1GSI/AAAAAAAABBA/0EaQKS_lPpc/s320/Corp411a.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5381285026823739682" /&gt;&lt;/a&gt; &lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/Sq4pk9IkzXI/AAAAAAAABAo/Y2LspBwQTtE/s1600-h/Corp411b.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 164px; height: 320px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/Sq4pk9IkzXI/AAAAAAAABAo/Y2LspBwQTtE/s320/Corp411b.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5381284319616879986" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The project can be &lt;a href="http://conceptdevelopment.net/iPhone/CorpPhonebook02/Corp411.zip" target="20090914"&gt;downloaded (29Kb)&lt;/a&gt; to try out on your newly registered copy of MonoTouch! Maybe having the company phonebook on the iPhone will help convince your employer to spring for an Enterprise licence :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-352806436030534571?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/352806436030534571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/09/monotouch-released.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/352806436030534571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/352806436030534571'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/09/monotouch-released.html' title='MonoTouch released'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ba76y6K7kvs/Sq4qOHr1GSI/AAAAAAAABBA/0EaQKS_lPpc/s72-c/Corp411a.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-7470041780368537249</id><published>2009-09-11T21:01:00.006+10:00</published><updated>2009-09-11T21:32:52.810+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>MonoTouch with SQLite "Corporate Phonebook"</title><content type='html'>Firstly, let me begin by saying this sample totally relies on the contribution of &lt;a href="http://kruegersystems.com" target="20090911"&gt;Frank Krueger&lt;/a&gt; who posted the &lt;a href="http://conceptdevelopment.net/iPhone/CorpPhonebook01/SQLiteClient.cs.htm" target="20090911"&gt;&lt;code&gt;SQLClient.cs&lt;/code&gt;&lt;/a&gt; code to the MonoTouch mailing list &lt;blockquote&gt;Here is the code. Consider it released into the public domain. If there's interest, I can start a Google code project or something.&lt;/blockquote&gt;Many thanks Frank! This is a VERY simple application using that library: it lists 'employees' from an SQLite database and allows you to call or email them:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/SqowmIRfMVI/AAAAAAAABAY/4466Kmlv8x8/s1600-h/01.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/SqowmIRfMVI/AAAAAAAABAY/4466Kmlv8x8/s200/01.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5380166136461472082" /&gt;&lt;/a&gt; &lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/SqowljX0yfI/AAAAAAAABAQ/xtgeVYTLKV8/s1600-h/02.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/SqowljX0yfI/AAAAAAAABAQ/xtgeVYTLKV8/s200/02.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5380166126555941362" /&gt;&lt;/a&gt; &lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/SqowlBruhYI/AAAAAAAABAI/7Ei_Io0xU8o/s1600-h/03.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/SqowlBruhYI/AAAAAAAABAI/7Ei_Io0xU8o/s200/03.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5380166117512611202" /&gt;&lt;/a&gt;*&lt;br /&gt;&lt;i&gt;* note: may not adhere to iPhone user interface guidelines!&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;The c# code itself can be &lt;a href="http://conceptdevelopment.net/iPhone/CorpPhonebook01/CorporateDirectory.ZIP"&gt;downloaded (26Kb)&lt;/a&gt; or browsed below:&lt;ul&gt;&lt;li&gt;&lt;a href="http://conceptdevelopment.net/iPhone/CorpPhonebook01/Main.cs.htm" target="20090911"&gt;Main.cs&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://conceptdevelopment.net/iPhone/CorpPhonebook01/MainWindow.xib.designer.cs.htm" target="20090911"&gt;MainWindow.xib.designer.cs&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://conceptdevelopment.net/iPhone/CorpPhonebook01/Employee.cs.htm" target="20090911"&gt;Employee.cs&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://conceptdevelopment.net/iPhone/CorpPhonebook01/SQLiteClient.cs.htm" target="20090911"&gt;SQLiteClient.cs&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;This first sample only &lt;i&gt;reads&lt;/i&gt; from SQLite on the iPhone - just a single database call&lt;pre&gt;using (var db = new SQLiteClient.SQLiteConnection("phonebook")) {&lt;br /&gt;   db.Open();&lt;br /&gt;   var users = db.Query&lt;Employee&gt;(&lt;br /&gt;      "SELECT Firstname, Lastname, Work, Mobile, &lt;br /&gt;      Department, Email &lt;br /&gt;      FROM Phonebook ORDER BY Lastname"&lt;br /&gt;   , 1000);&lt;br /&gt;   listData = users.ToList();&lt;br /&gt;}&lt;/pre&gt;which queries data that was set-up in the &lt;a href="http://sqlitebrowser.sourceforge.net/" target="20090911"&gt;SQLite Database Browser&lt;/a&gt; and included with the application as a 'Content' file within the MonoTouch project.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/Sqozu1N82VI/AAAAAAAABAg/oJYujISAqeA/s1600-h/SQLiteBrowser.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 182px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/Sqozu1N82VI/AAAAAAAABAg/oJYujISAqeA/s320/SQLiteBrowser.png" border="0" alt="Creating a database using SQLite Database Browser" id="BLOGGER_PHOTO_ID_5380169584500070738" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It uses &lt;code&gt;UITableViewDelegate&lt;/code&gt;, &lt;code&gt;UITableViewDataSource&lt;/code&gt; and &lt;code&gt;UIAlertViewDelegate&lt;/code&gt; implementations to populate the scrolling list and react to touch 'events'.&lt;br /&gt;&lt;br /&gt;When you touch a row, we use the &lt;a href="http://conceptdev.blogspot.com/2009/09/initiate-call-with-monotouch.html" target="20090911"&gt;&lt;code&gt;OpenUrl&lt;/code&gt; method discussed previously&lt;/a&gt; to trigger a call or email.&lt;br /&gt;&lt;br /&gt;Future additions to this sample might include alphabetized sections, search function and a proper 'user page' rather than using &lt;code&gt;UIAlertView&lt;/code&gt;. Perhaps some hierarchical navigation and an online 'updater' function as well?&lt;br /&gt;&lt;br /&gt;&lt;i&gt;p.s. yes, I shouldn't have used INTEGER for the telephone numbers in SQLite... they seem to be overflowing. I will convert them to TEXT in a future post..&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-7470041780368537249?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/7470041780368537249/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/09/monotouch-with-sqlite-corporate.html#comment-form' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/7470041780368537249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/7470041780368537249'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/09/monotouch-with-sqlite-corporate.html' title='MonoTouch with SQLite &quot;Corporate Phonebook&quot;'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Ba76y6K7kvs/SqowmIRfMVI/AAAAAAAABAY/4466Kmlv8x8/s72-c/01.jpg' height='72' width='72'/><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-1308136813461524819</id><published>2009-09-06T19:46:00.010+10:00</published><updated>2009-09-27T21:49:24.374+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>MonoTouch MapKit 101</title><content type='html'>&lt;span style="color:darkred"&gt;&lt;b&gt;UPDATE 27-Sep:&lt;/b&gt;&lt;a href="http://conceptdev.blogspot.com/2009/09/monotouch-mapkit-103.html"&gt;MapKit 103&lt;/a&gt; has the &lt;code&gt;MKAnnotation&lt;/code&gt; working - DEVICE ONLY.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:darkred"&gt;&lt;b&gt;UPDATE 25-Sep:&lt;/b&gt;&lt;a href="http://conceptdev.blogspot.com/2009/09/monotouch-mapkit-102.html"&gt;MapKit 102&lt;/a&gt; has the &lt;code&gt;MKPlacemark&lt;/code&gt; working.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:darkred"&gt;&lt;b&gt;UPDATE 14-Sep:&lt;/b&gt;This post was written against MonoTouch beta 0.8; some issues have been addressed in the released version. Updated blog post coming soon...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/SqOFbfmIg5I/AAAAAAAAA_w/vkkg5BTkbrY/s1600-h/MapKit.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 209px; height: 400px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/SqOFbfmIg5I/AAAAAAAAA_w/vkkg5BTkbrY/s400/MapKit.png" border="0" alt="MonoTouch MapKit" id="BLOGGER_PHOTO_ID_5378289087394907026" align="left" /&gt;&lt;/a&gt;&lt;a href="http://developer.apple.com/iphone/library/navigation/Frameworks/CocoaTouch/MapKit/index.html" target="20090906"&gt;MapKit&lt;/a&gt; seems to have the following 'features' which were supposed to be covered by this sample:&lt;br /&gt;&amp;bull; Display a map&lt;br /&gt;&amp;bull; Change map appearance&lt;br /&gt;&amp;bull; Interact with the user's location via GPS&lt;br /&gt;&amp;bull; Reverse-geocode a location&lt;br /&gt;&amp;bull; Place pins (with popups) on the map&lt;br /&gt;&lt;br /&gt;The sample manages to cover four out of five of those, but pin-placement just refused to work...&lt;br /&gt;&lt;br /&gt;Firstly, you can download the &lt;a href="http://conceptdevelopment.net/iPhone/MapKit01/MapKit.zip" target="20090906"&gt;MapKit.zip (16Kb)&lt;/a&gt; if you want to give it a try or just view &lt;a href="http://conceptdevelopment.net/iPhone/MapKit01/Main.cs.htm" target="20090906"&gt;Main.cs&lt;/a&gt; and &lt;a href="http://conceptdevelopment.net/iPhone/MapKit01/Main.cs.htm" target="20090906"&gt;MainWindow.xib.designer.cs.htm&lt;/a&gt; online.&lt;br /&gt;&lt;br /&gt;To start with, don't forget you will need &lt;code&gt;using MonoTouch.MapKit; using MonoTouch.CoreLocation;&lt;/code&gt; in your c#.&lt;br /&gt;&lt;br /&gt;Some of the 'code highlights' are shown below - I'm not sure if this is the &lt;i&gt;best&lt;/i&gt; way to do it, just that it "works" (and if you have any ideas why MKAnnotation is so problematic, let me know).&lt;br /&gt;&lt;br /&gt;&lt;b style="color:darkred"&gt;Show current location&lt;/b&gt;&lt;br /&gt;Actually this sample doesn't &lt;i&gt;use&lt;/i&gt; MapKit's built-in feature to put a little blue pin on your current position, but it is VERY easy to configure:&lt;pre&gt;mapView.ShowsUserLocation = true;&lt;/pre&gt;&lt;br /&gt;&lt;b style="color:darkred"&gt;Change map location&lt;/b&gt;&lt;br /&gt;It's also pretty easy to &lt;i&gt;set&lt;/i&gt; the map's current center-point (and optionally animate the transition):&lt;pre&gt;mapView.SetCenterCoordinate(new CLLocationCoordinate2D(&lt;br /&gt;                 Convert.ToDouble(textfieldLatitude.Text),&lt;br /&gt;                 Convert.ToDouble(textfieldLongitude.Text)), &lt;br /&gt;                 true);&lt;/pre&gt;&lt;br /&gt;&lt;b style="color:darkred"&gt;Respond to map being 'dragged'&lt;/b&gt;&lt;br /&gt;When the map is dragged, a &lt;code&gt;MKMapViewDelegate&lt;/code&gt; subclass is provided to 'listen' for various things and take some action. The &lt;code&gt;MapViewDelegate&lt;/code&gt; class takes a reference to the &lt;code&gt;AppDelegate&lt;/code&gt; so it can interact with the UI.&lt;br /&gt;Firstly you must 'attach' the delegate (NOTE: this is NOT a c# &lt;code&gt;delegate&lt;/code&gt; but a different concept with the same name!)&lt;pre&gt;mapView.Delegate = new MapViewDelegate(this);&lt;/pre&gt;and then do our UI update in the class itself&lt;pre&gt;public class MapViewDelegate : MKMapViewDelegate&lt;br /&gt;{&lt;br /&gt;  public override void RegionChanged(MKMapView mapView, bool animated)&lt;br /&gt;  {&lt;br /&gt;    Console.WriteLine("Region did change");&lt;br /&gt;    _appd.labelCurrent.Text = "Map Center " + &lt;br /&gt;        mapView.CenterCoordinate.Latitude + ", " + &lt;br /&gt;        mapView.CenterCoordinate.Longitude;&lt;br /&gt;  }&lt;/pre&gt;&lt;br /&gt;&lt;b style="color:darkred"&gt;Reverse geocoding a location&lt;/b&gt;&lt;br /&gt;&lt;code&gt;MKReverseGeocoder&lt;/code&gt; follows the same delegate pattern as &lt;code&gt;MKMapView&lt;/code&gt;, first you 'configure' the geocoder&lt;pre&gt;geoCoder = new MKReverseGeocoder(mapView.CenterCoordinate);&lt;br /&gt;geoCoder.Delegate = new GeoCoderDelegate(this);&lt;br /&gt;geoCoder.Start();&lt;/pre&gt;then provide the implementation in another class. In this case &lt;b&gt;MonoTouch.MapKit&lt;/b&gt; does not currently provide the method we need, so here is the full class with special MonoTouch attributes included (meaning the c# name &lt;code&gt;FoundPlacemark&lt;/code&gt; is not important - just make sure you get the parameters correct)&lt;pre&gt;public class GeoCoderDelegate : MKReverseGeocoderDelegate&lt;br /&gt;{&lt;br /&gt;    AppDelegate _appd;&lt;br /&gt;    public GeoCoderDelegate(AppDelegate appd) {_appd = appd;}&lt;br /&gt;    // Not currently exposed by MonoTouch, use ExportAttribute&lt;br /&gt;    &lt;span style="background-color:yellow"&gt;[Export("reverseGeocoder:didFindPlacemark:")]&lt;/span&gt;&lt;br /&gt;    public void FoundPlacemark(&lt;span style="background-color:yellow"&gt;MKReverseGeocoder geocoder&lt;br /&gt;                             , MKPlacemark placemark&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        Console.WriteLine("Found in " + placemark.Country);&lt;br /&gt;        _appd.labelPlacemark.Text = placemark.SubThoroughfare&lt;br /&gt;                            + " " + placemark.Thoroughfare&lt;br /&gt;                            + " " + placemark.Locality&lt;br /&gt;                            + " " + placemark.AdministrativeArea&lt;br /&gt;                            + " " + placemark.Country;&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;b style="color:darkred"&gt;GPS Tracking with &lt;code&gt;CoreLocation&lt;/code&gt;&lt;/b&gt;&lt;br /&gt;You can spot the &lt;code&gt;CoreLocation&lt;/code&gt; classes with their &lt;b&gt;CL&lt;/b&gt; prefix (as opposed to &lt;b&gt;MK&lt;/b&gt;). Once again we have the 'delegate pattern' in play, first creating it with some custom constructor parameters (and not forgetting to start the tracking)&lt;pre&gt;locationManager = new CLLocationManager();&lt;br /&gt;locationManager.Delegate = new LocationManagerDelegate(mapView, this);&lt;br /&gt;&lt;span style="background-color:yellow"&gt;locationManager.StartUpdatingLocation();&lt;/span&gt;&lt;/pre&gt;with the implementation in another class&lt;pre&gt;private class LocationManagerDelegate : CLLocationManagerDelegate&lt;br /&gt;{&lt;br /&gt;    private MKMapView _mapview;&lt;br /&gt;    private AppDelegate _appd;&lt;br /&gt;    public LocationManagerDelegate(MKMapView mapview, AppDelegate appd)&lt;br /&gt;    {&lt;br /&gt;        _mapview = mapview; _appd = appd;&lt;br /&gt;    }&lt;br /&gt;    public override void UpdatedLocation(CLLocationManager manager&lt;br /&gt;        , CLLocation newLocation, CLLocation oldLocation)&lt;br /&gt;    {&lt;br /&gt;        MKCoordinateSpan span = new MKCoordinateSpan(0.2, 0.2);&lt;br /&gt;        MKCoordinateRegion region = &lt;br /&gt;           new MKCoordinateRegion(newLocation.Coordinate, span);&lt;br /&gt;        _appd.mylocation = newLocation;&lt;br /&gt;        _mapview.SetRegion(region, true);&lt;br /&gt;        _appd.labelInfo.Text = "UserLocation " &lt;br /&gt;           + newLocation.Coordinate.Latitude + ", " &lt;br /&gt;           + newLocation.Coordinate.Longitude;&lt;br /&gt;        Console.WriteLine("Location updated");&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;You can stop it when you are done 'tracking', and you can also set &lt;code&gt;locationManager.DesiredAccuracy&lt;/code&gt; (if you can figure out what the CONST values need to be!).&lt;br /&gt;&lt;br /&gt;Here's the class diagram (the three delegates are actually nested in AppDelegate, as is a subclass of MKAnnotation which isn't working just yet...)&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SqOP3Hk3V-I/AAAAAAAAA_4/Oeb3sz2zKsA/s1600-h/ClassDiagram.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 268px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SqOP3Hk3V-I/AAAAAAAAA_4/Oeb3sz2zKsA/s320/ClassDiagram.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5378300557099751394" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And yes, the user-interface on this sample isn't exactly intuitive... so here's the "manual" :)&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SqOQcrjRTdI/AAAAAAAABAA/oJTUNnDBlM8/s1600-h/MapKitInstructions.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 388px; height: 400px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SqOQcrjRTdI/AAAAAAAABAA/oJTUNnDBlM8/s400/MapKitInstructions.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5378301202411900370" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-1308136813461524819?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/1308136813461524819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/09/monotouch-mapkit-101.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/1308136813461524819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/1308136813461524819'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/09/monotouch-mapkit-101.html' title='MonoTouch MapKit 101'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Ba76y6K7kvs/SqOFbfmIg5I/AAAAAAAAA_w/vkkg5BTkbrY/s72-c/MapKit.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-2101393193103967089</id><published>2009-09-04T06:59:00.006+10:00</published><updated>2009-09-04T21:35:15.368+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Initiate a call with MonoTouch</title><content type='html'>Initiating calls, text messages and triggering other applications on the iPhone is a pretty basic requirement for MonoTouch applications - but it still took me a little while to "translate" the examples I found (eg &lt;a href="http://iphonedevelopertips.com/cocoa/launching-other-apps-within-an-iphone-application.html" target="20090904"&gt;developertips&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/SqD4zMrwYaI/AAAAAAAAA_E/ziV8iyVMF8g/s1600-h/InitCall00.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/SqD4zMrwYaI/AAAAAAAAA_E/ziV8iyVMF8g/s200/InitCall00.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5377571513542140322" /&gt;&lt;/a&gt; &lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/SqD4zwiI2fI/AAAAAAAAA_M/dG-GgEri0_w/s1600-h/InitCall03.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/SqD4zwiI2fI/AAAAAAAAA_M/dG-GgEri0_w/s200/InitCall03.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5377571523165477362" /&gt;&lt;/a&gt; &lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/SqD40Wcyx7I/AAAAAAAAA_U/zXzZrCHKvGc/s1600-h/InitCall04.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 134px; height: 200px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/SqD40Wcyx7I/AAAAAAAAA_U/zXzZrCHKvGc/s200/InitCall04.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5377571533343606706" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/SqD542h5s4I/AAAAAAAAA_c/9ihAcfNMLfI/s1600-h/InitCall05a.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/SqD542h5s4I/AAAAAAAAA_c/9ihAcfNMLfI/s320/InitCall05a.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5377572710186070914" /&gt;&lt;/a&gt; &lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SqD55B3mqZI/AAAAAAAAA_k/w3YY9rTSuak/s1600-h/InitCall06a.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SqD55B3mqZI/AAAAAAAAA_k/w3YY9rTSuak/s320/InitCall06a.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5377572713229887890" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The mechanism is pretty simple - you just need to construct a &lt;b&gt;Url&lt;/b&gt; with a specific 'scheme' and call the &lt;code&gt;OpenURL&lt;/code&gt; method. I kept finding examples using &lt;code&gt;self&lt;/code&gt; to reference &lt;code&gt;OpenURL&lt;/code&gt; so it took me a second to figure out the method is actually on &lt;code&gt;&lt;a href="http://developer.apple.com/IPhone/library/documentation/UIKit/Reference/UIApplication_Class/Reference/Reference.html" target="20090904"&gt;UIApplication&lt;/a&gt;&lt;/code&gt;. I'm working with iPhone OS 3.0 so &lt;code&gt;OpenURL&lt;/code&gt; returns a &lt;code&gt;bool&lt;/code&gt; if the action is 'possible': &lt;code&gt;false&lt;/code&gt; if that scheme is not recognised on the device.&lt;pre&gt;public partial class AppDelegate : UIApplicationDelegate&lt;br /&gt;{&lt;br /&gt;    public override bool FinishedLaunching(UIApplication app, NSDictionary options)&lt;br /&gt;    {&lt;br /&gt;        window.MakeKeyAndVisible();&lt;br /&gt;        buttonCall.TouchDown += delegate { // trigger action&lt;br /&gt;            NSUrl url = &lt;span style="background-color:yellow;"&gt;new NSUrl("tel:" + textfieldInput.Text)&lt;/span&gt;;&lt;br /&gt;            if (!&lt;span style="background-color:yellow;"&gt;UIApplication.SharedApplication.OpenUrl(url)&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                var av = new UIAlertView("Not supported"&lt;br /&gt;                    , "Scheme 'tel:' is not supported on this device"&lt;br /&gt;                    , null&lt;br /&gt;                    , "Ok thanks"&lt;br /&gt;                    , null);&lt;br /&gt;                av.Show();&lt;br /&gt;            }&lt;br /&gt;        };&lt;/pre&gt;* Note: you can read about the singleton &lt;code&gt;SharedApplication&lt;/code&gt; property in the &lt;a href="http://developer.apple.com/IPhone/library/documentation/UIKit/Reference/UIApplication_Class/Reference/Reference.html" target="20090904"&gt;UIApplication reference&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Some of the other common schemes look like this:&lt;pre&gt;new NSUrl("sms:" + textfieldInput.Text);&lt;br /&gt;new NSUrl("http://maps.google.com/maps?q=" + textfieldInput.Text); // opens Maps&lt;br /&gt;new NSUrl("http://" + textfieldInput.Text); // opens Safari&lt;br /&gt;new NSUrl("mailto:you@gmail.com?subject=" + textfieldInput.Text);&lt;/pre&gt;and two others I've added for testing are&lt;pre&gt;new NSUrl("tweetie:///post?message=" + textfieldInput.Text);&lt;br /&gt;new NSUrl("comgoogleearth://");&lt;/pre&gt;You can view the full code for the test app - &lt;a href="http://conceptdevelopment.net/iPhone/InitiateCall01/Main.cs.htm" target="20090904"&gt;Main.cs&lt;/a&gt; and &lt;a href="http://conceptdevelopment.net/iPhone/InitiateCall01/MainWindow.xib.designer.cs.htm" target="20090904"&gt;MainWindow.xib.designer.cs&lt;/a&gt; - the Xib is basically a textfield and seven buttons - complete source in &lt;a href="http://conceptdevelopment.net/iPhone/InitiateCall01/InitiateCall.zip" target="20090904"&gt;MonoTouch solution ZIP (14k)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here's a link to &lt;a href="http://developer.apple.com/iphone/library/featuredarticles/iPhoneURLScheme_Reference/iPhoneURLScheme_Reference.pdf"&gt;Apple's Url Scheme Reference (PDF)&lt;/a&gt;&lt;br /&gt;and two lists of the currently available url types: &lt;a href="http://wiki.akosma.com/IPhone_URL_Schemes"&gt;iPhone Url Schemes&lt;/a&gt; &amp;amp; &lt;a href="http://applookup.com/" target="20090904"&gt;AppLookup&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-2101393193103967089?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/2101393193103967089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/09/initiate-call-with-monotouch.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/2101393193103967089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/2101393193103967089'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/09/initiate-call-with-monotouch.html' title='Initiate a call with MonoTouch'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Ba76y6K7kvs/SqD4zMrwYaI/AAAAAAAAA_E/ziV8iyVMF8g/s72-c/InitCall00.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-8582409859867596741</id><published>2009-08-30T21:39:00.007+10:00</published><updated>2009-08-30T22:29:03.425+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>MonoTouch Settings.bundle</title><content type='html'>Property Lists (&lt;code&gt;plist&lt;/code&gt;) and Bundles are probably so obvious to seasoned Mac/iPhone developers that they're not even worth mentioning, however for someone with a '100% .NET' background you can't take anything for granted. I had a -lot-bit of trouble getting iPhone &lt;b&gt;Settings&lt;/b&gt; working with MonoTouch (see &lt;a href="http://conceptdev.blogspot.com/2009/08/monotouch-isoflair.html" target="20090830"&gt;here&lt;/a&gt;), but now that I've figured it out it seems very simple. Here's a quick guide:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. Bundles are folders&lt;/b&gt;&lt;br /&gt;Within your MonoTouch project, create a new folder (&lt;code&gt;right-click solution &amp;rarr; Add &amp;rarr; New Folder&lt;/code&gt;) and call it &lt;b&gt;Settings.bundle&lt;/b&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/Sppu7kHyAHI/AAAAAAAAA-0/q6DdRFa1uQU/s1600-h/Settings00.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 273px; height: 248px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/Sppu7kHyAHI/AAAAAAAAA-0/q6DdRFa1uQU/s320/Settings00.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5375731074807758962" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. Plist files are some sort of hybrid Xml key-value&lt;/b&gt;&lt;br /&gt;(&lt;code&gt;right-click solution &amp;rarr; Add &amp;rarr; New File... &amp;rarr; Empty Text File&lt;/code&gt;) and call it &lt;b&gt;Root.plist&lt;/b&gt;. You could add an existing plist-xml-formatted file if you like - but we're just going to create one from scratch (in the next step).&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SppsUjteb6I/AAAAAAAAA-M/tANfjw24Z3w/s1600-h/Settings01.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 137px; height: 200px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SppsUjteb6I/AAAAAAAAA-M/tANfjw24Z3w/s200/Settings01.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5375728205659271074" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. Edit Root.plist with the Property List Editor&lt;/b&gt;&lt;br /&gt;The structure of the &lt;code&gt;plist&lt;/code&gt; is very specific - look for some doco or Chapter 10 of &lt;a href="http://www.amazon.com/Beginning-iPhone-Development-Exploring-BEGINNING/dp/B001TM92AW/" target="20090830"&gt;Beginning iPhone Development&lt;/a&gt;. In this example I've only used &lt;code&gt;PSGroupSpecifier&lt;/code&gt; and &lt;code&gt;PSTextFieldSpecifier&lt;/code&gt; but there are many other types (PSMultiValueSpecifier, PSToggleSwitchSpecifier, PSChildPaneSpecifier...).&lt;br /&gt;Double-click the &lt;a href="http://www.conceptdevelopment.net/iPhone/iSOFlair01/Root.plist2.htm" target="20090830"&gt;&lt;b&gt;Root.plist&lt;/b&gt;&lt;/a&gt; file inside MonoDevelop to open the &lt;b&gt;Property List Editor&lt;/b&gt; - type carefully as there is no 'validation' and if you mis-spell (or mis-capitalize) something it &lt;i&gt;just won't work&lt;/i&gt;:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SppsVEIcZWI/AAAAAAAAA-U/I1Izs1mQ4pw/s1600-h/Settings03.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 164px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SppsVEIcZWI/AAAAAAAAA-U/I1Izs1mQ4pw/s200/Settings03.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5375728214362318178" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4. Set the correct build action for Root.plist&lt;/b&gt;&lt;br /&gt;This is important (and I think the cause of my &lt;a href="http://conceptdev.blogspot.com/2009/08/monotouch-isoflair.html" target="20090830"&gt;earlier problem&lt;/a&gt;) - you MUST tell the IDE to make sure this file is copied to the phone.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/SppslZKsGEI/AAAAAAAAA-c/u6uVndq6RzM/s1600-h/Settings04.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 302px; height: 247px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/SppslZKsGEI/AAAAAAAAA-c/u6uVndq6RzM/s320/Settings04.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5375728494886787138" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5. Access the settings&lt;/b&gt;&lt;br /&gt;Use the &lt;code&gt;NSUserDefaults.StandardUserDefaults&lt;/code&gt; property to access the values set by the user.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/Sppslhu3plI/AAAAAAAAA-k/n0Fg_D_3CLA/s1600-h/Settings05a.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 166px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/Sppslhu3plI/AAAAAAAAA-k/n0Fg_D_3CLA/s320/Settings05a.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5375728497186022994" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;6. See/Edit "Settings" on the iPhone&lt;/b&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/SppwclKgzII/AAAAAAAAA-8/ME0Zo4xolew/s1600-h/isoflair_settings.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 104px; height: 200px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/SppwclKgzII/AAAAAAAAA-8/ME0Zo4xolew/s200/isoflair_settings.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5375732741534960770" /&gt;&lt;/a&gt; &lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/SppsmPV_5uI/AAAAAAAAA-s/whdB6k372rY/s1600-h/Settings06.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 164px; height: 320px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/SppsmPV_5uI/AAAAAAAAA-s/whdB6k372rY/s320/Settings06.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5375728509429737186" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's worthwhile noting that the 'useability' for these kinds of &lt;b&gt;Settings&lt;/b&gt; is 'unusual' for desktop applications, but probably familiar to iPhone users... the settings for a whole swag of unrelated applications are grouped under the &lt;b&gt;Settings&lt;/b&gt; icon (it's not necessarily obvious from with the application that they are available). The user must also quit the application to get to these settings - which means they're most useful for things that don't change much (eg. the users identity and servers in the Mail.app).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-8582409859867596741?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/8582409859867596741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/08/monotouch-settingsbundle.html#comment-form' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/8582409859867596741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/8582409859867596741'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/08/monotouch-settingsbundle.html' title='MonoTouch Settings.bundle'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Ba76y6K7kvs/Sppu7kHyAHI/AAAAAAAAA-0/q6DdRFa1uQU/s72-c/Settings00.png' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-2694188579177586333</id><published>2009-08-27T22:13:00.008+10:00</published><updated>2009-10-06T23:24:41.233+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>MonoTouch "iSOFlair"</title><content type='html'>&lt;span style="color:darkred"&gt;&lt;b&gt;UPDATE:&lt;/b&gt; 6-Oct &lt;a href="http://conceptdev.blogspot.com/2009/10/monotouch-isoflair-20.html"&gt;version 2.0&lt;/a&gt; adds some functionality and the source code.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I didn't get as far as I'd have liked with today's MonoTouch app - a pretty basic rendering of your 'score' on &lt;a href="http://stackoverflow.com" target="20090827"&gt;stackoverflow.com&lt;/a&gt; (via their &lt;a href="http://stackoverflow.com/users/flair#html" target="20090827"&gt;'flair'&lt;/a&gt; feature). Yep, definitely not a 'practical' application.&lt;br /&gt;&lt;br /&gt;The main goals were to play with &lt;code&gt;WebClient&lt;/code&gt;, the 'filesystem' and then to get a multi-page/view app working with proper Settings (to configure the various stackoverflow variants). As you can see from the screenshots below I only got half-way there...&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/SpZ89em1vqI/AAAAAAAAA98/RuqROI0gDFc/s1600-h/isoflair.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 207px; height: 400px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/SpZ89em1vqI/AAAAAAAAA98/RuqROI0gDFc/s400/isoflair.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5374620600943099554" /&gt;&lt;/a&gt; &lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SpZ4tMdYC7I/AAAAAAAAA9M/4W4O-hM0R30/s1600-h/isoflair_settings.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 207px; height: 400px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SpZ4tMdYC7I/AAAAAAAAA9M/4W4O-hM0R30/s400/isoflair_settings.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5374615923147148210" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here's the code: &lt;a href="http://conceptdevelopment.net/iPhone/iSOFlair01/Main.cs.htm" target="20090827"&gt;Main.cs&lt;/a&gt;, &lt;a href="http://conceptdevelopment.net/iPhone/iSOFlair01/MainWindow.xib.designer.cs.htm" target="20090827"&gt;MainWindow.xib.designer.cs&lt;/a&gt; and &lt;a href="http://conceptdevelopment.net/iPhone/iSOFlair01/root.plist.htm" target="20090827"&gt;root.plist&lt;/a&gt;. At least the &lt;code&gt;WebClient&lt;/code&gt; for text and images worked well, as did saving and loading from the local file system. You'll have to excuse the dodgy Html parsing ;)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SpZ7GUQP60I/AAAAAAAAA90/P_QbfS5e9eE/s1600-h/isoflair_nosettings.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 104px; height: 200px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SpZ7GUQP60I/AAAAAAAAA90/P_QbfS5e9eE/s200/isoflair_nosettings.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5374618553759558466" style="float:left;margin-right:5px;"/&gt;&lt;/a&gt;Unfortunately I've wasted a bit of time trying to figure out the &lt;b&gt;Settings&lt;/b&gt; and how to get the &lt;code&gt;plist&lt;/code&gt; setup correctly. I first created a folder in &lt;b&gt;MonoDevelop&lt;/b&gt; called &lt;code&gt;Settings.bundle&lt;/code&gt; with the &lt;code&gt;root.plist&lt;/code&gt; inside. It has to be "partly" correct because the application now appears in the &lt;b&gt;Settings menu&lt;/b&gt; - which it wasn't before - BUT when you select it the screen is empty of inputs :-(&lt;br /&gt;I'm probably missing something really basic - the &lt;a href="http://conceptdevelopment.net/iPhone/iSOFlair01/root.plist.htm" target="20090827"&gt;root.plist&lt;/a&gt; file is shown in the editor below:&lt;br /&gt;&lt;a style="clear:all;" href="http://2.bp.blogspot.com/_Ba76y6K7kvs/SpZ4uc7An1I/AAAAAAAAA9k/nBCGWQL7HEo/s1600-h/isoflair_rootplist.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 235px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/SpZ4uc7An1I/AAAAAAAAA9k/nBCGWQL7HEo/s400/isoflair_rootplist.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5374615944746278738" /&gt;&lt;/a&gt;&lt;br /&gt;Anyway, I'll do some more reading and try again tomorrow!&lt;br /&gt;&lt;br /&gt;Obligatory Interface Builder screenshot...&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/SpZ4t3IXpCI/AAAAAAAAA9c/eGSiTlFNsnQ/s1600-h/isoflair_interfacebuilder.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 226px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/SpZ4t3IXpCI/AAAAAAAAA9c/eGSiTlFNsnQ/s400/isoflair_interfacebuilder.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5374615934601765922" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-2694188579177586333?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/2694188579177586333/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/08/monotouch-isoflair.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/2694188579177586333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/2694188579177586333'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/08/monotouch-isoflair.html' title='MonoTouch &quot;iSOFlair&quot;'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Ba76y6K7kvs/SpZ89em1vqI/AAAAAAAAA98/RuqROI0gDFc/s72-c/isoflair.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-5740082331566781302</id><published>2009-08-26T21:50:00.005+10:00</published><updated>2009-08-30T12:32:57.503+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>MonoTouch "Restaurant Bill Splitter"</title><content type='html'>Okay - my first "real" iPhone via &lt;a href="http://www.mono-project.com/MonoTouch_Beta" target="20090826"&gt;MonoTouch beta&lt;/a&gt; application is complete... welcome to &lt;b&gt;Restaurant Bill Splitter&lt;/b&gt;, the easiest way to determine who pays the check :-)&lt;br /&gt;&lt;br /&gt;Here it is &lt;i&gt;before&lt;/i&gt; any data entry and &lt;i&gt;after&lt;/i&gt; you have entered the total restaurant bill (plus the subtotal of any alcohol in that figure) and chosen the number of drinkers versus non-drinkers who are going to pay.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/SpUhz9hxBjI/AAAAAAAAA80/DgHR6sGTeZY/s1600-h/BillSplitter01.png" target="20090826"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 207px; height: 400px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/SpUhz9hxBjI/AAAAAAAAA80/DgHR6sGTeZY/s400/BillSplitter01.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5374238906909787698" /&gt;&lt;/a&gt; &lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/SpUh0iD61II/AAAAAAAAA88/qbBmkR2E-bc/s1600-h/BillSplitter02.png" target="20090826"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 208px; height: 400px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/SpUh0iD61II/AAAAAAAAA88/qbBmkR2E-bc/s400/BillSplitter02.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5374238916716713090" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here is the &lt;b&gt;Interface Builder&lt;/b&gt; screen shot&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SpUh072yKRI/AAAAAAAAA9E/kHJZwxYu_EA/s1600-h/BIllSplitter_XIB.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 226px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SpUh072yKRI/AAAAAAAAA9E/kHJZwxYu_EA/s400/BIllSplitter_XIB.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5374238923640940818" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can also &lt;a href="http://conceptdevelopment.net/iPhone/BillSplitter01/BillSplitterSoln.zip" target="20090826"&gt;download the MonoTouch BillSplitter solution (11Kb)&lt;/a&gt; and view the c# code for &lt;a href="http://conceptdevelopment.net/iPhone/BillSplitter01/Main.cs.htm" target="20090826"&gt;&lt;code&gt;Main.cs&lt;/code&gt;&lt;/a&gt; and &lt;a href="http://conceptdevelopment.net/iPhone/BillSplitter01/MainWindow.xib.designer.cs.htm" target="20090826"&gt;&lt;code&gt;MainWindow.xib.designer.cs&lt;/code&gt;&lt;/a&gt;. Even though MonoTouch is currently still in (closed) beta, it is VERY cool to be able to write c#/.NET targetting the iPhone platform. There is still quite a bit to get my head around (mostly the Apple stuff: XIBs, Views, delegates, events, Interface Builder, etc) but hopefully once I get the hang of it, much more complex applications will be forthcoming...&lt;br /&gt;&lt;br /&gt;&lt;i&gt;NOTE: there is one known bug in there... I'm having trouble making the keyboard disappear when you press the [Done] button - so if you're wondering what all the &lt;code&gt;ResignFirstResponder() delegates&lt;/code&gt; are for, it's my attempt to debug/fix the keyboard problem. That is also the reason for the [Split] button, which otherwise wouldn't really be required since the calculations happen 'on change' for each of the input controls...&lt;/i&gt;&lt;br /&gt;&lt;!--http://primates.ximian.com/~miguel/tmp/monocatalog/picker.cs--&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;UPDATE: this is the class diagram for the app (obviously excludes stuff *in* the XIB, but includes the &lt;code&gt;.xib.designer.cs&lt;/code&gt;)&lt;/i&gt;. I've also &lt;a href="http://conceptdevelopment.net/iPhone/MonoTouchClassDiagramb5/" target="20090830"&gt;posted the class diagrams for Foundation and UIKit&lt;/a&gt; online.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SpnkKS5AGNI/AAAAAAAAA-E/o785LsWhKLY/s1600-h/BillSplitter.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 263px; height: 400px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SpnkKS5AGNI/AAAAAAAAA-E/o785LsWhKLY/s400/BillSplitter.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5375578495764142290" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-5740082331566781302?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/5740082331566781302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/08/monotouch-restaurant-bill-splitter.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/5740082331566781302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/5740082331566781302'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/08/monotouch-restaurant-bill-splitter.html' title='MonoTouch &quot;Restaurant Bill Splitter&quot;'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Ba76y6K7kvs/SpUhz9hxBjI/AAAAAAAAA80/DgHR6sGTeZY/s72-c/BillSplitter01.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-9217178124372311609</id><published>2009-08-25T21:53:00.004+10:00</published><updated>2009-08-25T22:08:11.052+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>MonoTouch "Hello World"</title><content type='html'>First, let me say that this is the &lt;i&gt;MonoTouch team's&lt;/i&gt; &lt;a href="http://www.mono-project.com/MonoTouch_Tutorial_MonoDevelop_HelloWorld" target="20090825"&gt;"Hello World"&lt;/a&gt; code. I'm still trying to figure this whole MonoTouch thing out, so I've given &lt;a href="http://twitter.com/redth" target="20090825"&gt;@redth&lt;/a&gt;'s &lt;a href="http://www.youtube.com/watch?v=M0VoyhKFmWg&amp;fmt=22" target="20090825"&gt;YouTube screencast&lt;/a&gt; a try, and posted my own screenshots (even though they look a lot like &lt;a href="http://www.mono-project.com/MonoTouch_Tutorial_MonoDevelop_HelloWorld" target="20090825"&gt;these&lt;/a&gt;)... &lt;br /&gt;&lt;br /&gt;Massive thanks for &lt;a href="http://twitter.com/redth" target="20090825"&gt;@redth&lt;/a&gt; for the screencast - hopefully I'll be posting something of my own creation very soon. It made a lot more sense (more quickly) than &lt;a href="http://www.mono-project.com/MonoTouch_Tutorial_MonoDevelop_HelloWorld" target="20090825"&gt;reading&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Anyway, here's the quick links:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;0. Read &lt;a href="http://www.mono-project.com/MonoTouch_Tutorial_MonoDevelop_HelloWorld" target="20090825"&gt;"Hello World"&lt;/a&gt; on the MonoTouch official site&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. Watch &lt;a href="http://twitter.com/redth" target="20090825"&gt;@redth&lt;/a&gt;'s &lt;a href="http://www.youtube.com/watch?v=M0VoyhKFmWg&amp;fmt=22" target="20090825"&gt;screencast&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. Check out my &lt;a href="http://conceptdevelopment.net/iPhone/MonoTouch01/"&gt;screenshots&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;i&gt;Here are a couple of them...&lt;/i&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SpPR8fR-DfI/AAAAAAAAA8c/ycebapCBaOU/s1600-h/NewWorld04.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 226px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SpPR8fR-DfI/AAAAAAAAA8c/ycebapCBaOU/s400/NewWorld04.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5373869617502359026" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/SpPR8hek6DI/AAAAAAAAA8k/deFzjIAR4BY/s1600-h/NewWorld06.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 226px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/SpPR8hek6DI/AAAAAAAAA8k/deFzjIAR4BY/s400/NewWorld06.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5373869618092107826" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/SpPR9GhdaYI/AAAAAAAAA8s/6eHJM2HGN-Q/s1600-h/NewWorld07.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/SpPR9GhdaYI/AAAAAAAAA8s/6eHJM2HGN-Q/s400/NewWorld07.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5373869628036311426" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-9217178124372311609?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/9217178124372311609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/08/monotouch-hello-world.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/9217178124372311609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/9217178124372311609'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/08/monotouch-hello-world.html' title='MonoTouch &quot;Hello World&quot;'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Ba76y6K7kvs/SpPR8fR-DfI/AAAAAAAAA8c/ycebapCBaOU/s72-c/NewWorld04.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-6929410959550016915</id><published>2009-08-19T20:57:00.003+10:00</published><updated>2009-08-19T21:56:44.551+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Parsing XML with PHP4</title><content type='html'>PHP is not something I'm familiar with, but I was recently helping out a friend and was surprised how difficult it was to find some sample code for downloading/parsing an XML (specifically using PHP4, apparently PHP5 has some built-in functionality).&lt;br /&gt;&lt;br /&gt;Thankfully I stumbled across &lt;a href="http://phpclasses.dknss.com/browse/package/4484.html" target="20090818"&gt;Taha Paksu's SimpleXML for PHP4&lt;/a&gt; - you must join/login to download it, but it's worth it.&lt;br /&gt;&lt;br /&gt;Once you have downloaded the ZIP file, place &lt;b&gt;simplexml.class.php&lt;/b&gt; in your PHP 'app', and use the supplied example &lt;b&gt;test.php&lt;/b&gt; to ensure everything is working:&lt;pre&gt;&amp;lt;?&lt;br /&gt;require_once "simplexml.class.php";&lt;br /&gt;&lt;br /&gt;echo "&amp;lt;pre&amp;gt;";&lt;br /&gt;$file = "http://musicbrainz.org/ws/1/track/?query=metallica&amp;type=xml";&lt;br /&gt;$sxml = new simplexml;&lt;br /&gt;$data = $sxml-&gt;xml_load_file($file);&lt;br /&gt;print_r($data);&lt;br /&gt;?&amp;gt;&lt;/pre&gt;which prints out a 'tree view' of the XML data.&lt;br /&gt;&lt;br /&gt;If that works, you can then address individual elements (say your XML looks like this - an example from the download)&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="ISO-8859-1"?&amp;gt;&lt;br /&gt;&amp;lt;note&amp;gt;&lt;br /&gt; &amp;lt;to&amp;gt;Tove&amp;lt;/to&amp;gt;&lt;br /&gt; &amp;lt;from&amp;gt;Jani&amp;lt;/from&amp;gt;&lt;br /&gt; &amp;lt;heading&amp;gt;Reminder&amp;lt;/heading&amp;gt;&lt;br /&gt; &amp;lt;body&amp;gt;&lt;br /&gt;  &amp;lt;format&amp;gt;text&amp;lt;/format&amp;gt;&lt;br /&gt;  &amp;lt;content&amp;gt;Don't forget me this weekend!&amp;lt;/content&amp;gt;&lt;br /&gt; &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/note&amp;gt;&lt;/pre&gt;then your PHP might look like this:&lt;pre&gt;&amp;lt;?&lt;br /&gt;require_once "simplexml.class.php";&lt;br /&gt;&lt;br /&gt;$file = "http://SOMESERVER.com/example.xml";&lt;br /&gt;$sxml = new simplexml;&lt;br /&gt;$data = $sxml-&gt;xml_load_file($file);&lt;br /&gt;?&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;table&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;to:&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;?php echo $data-&gt;to; ?&amp;gt;&amp;lt/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;sender:&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;?php echo $data-&gt;from; ?&amp;gt;&amp;lt/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;subject:&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;?php echo $data-&gt;heading; ?&amp;gt;&amp;lt/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;message:&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;?php echo $data-&gt;body-&gt;content; ?&amp;gt;&amp;lt/td&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;You can read more in the &lt;a href="http://phpclasses.dknss.com/discuss/package/4484/" target="20090818"&gt;SimpleXML for PHP4 forum&lt;/a&gt;... That's enough PHP for now - back to c#/t-sql/xaml/html/javascript... and hopefully soon MonoTouch!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-6929410959550016915?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/6929410959550016915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/08/parsing-xml-with-php4.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/6929410959550016915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/6929410959550016915'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/08/parsing-xml-with-php4.html' title='Parsing XML with PHP4'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-7099369502736213225</id><published>2009-08-15T16:41:00.004+10:00</published><updated>2009-08-15T17:03:45.450+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='search'/><category scheme='http://www.blogger.com/atom/ns#' term='monotouch'/><category scheme='http://www.blogger.com/atom/ns#' term='mono'/><title type='text'>When Mono "just works" - Searcharoo 'ported'</title><content type='html'>Decided to have another play with &lt;a href="http://mono-project.com/" target="20090815"&gt;Mono&lt;/a&gt; today, in preparation for &lt;a href="http://www.mono-project.com/news/archive/2009/Aug-03.html" target="20090815"&gt;MonoTouch&lt;/a&gt; to come out of beta (or for my beta-participation to be approved)...&lt;br /&gt;&lt;br /&gt;It was very easy to install Mono and &lt;a href="http://monodevelop.com/" target="20090815"&gt;MonoDevelop&lt;/a&gt; on my Mac, and because MonoDevelop supports Visual Studio 2008 solution files the current release of &lt;a href="http://searcharoo.codeplex.com" target="20090815"&gt;Searcharoo&lt;/a&gt; opened straight away*, compiled and could be tested with the 'provided' XSP2 webserver:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ba76y6K7kvs/SoZZed_sU_I/AAAAAAAAA8M/U2T-3tbR1Ko/s1600-h/Searchaoo-on-Mono-1.gif"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 226px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/SoZZed_sU_I/AAAAAAAAA8M/U2T-3tbR1Ko/s400/Searchaoo-on-Mono-1.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5370077985668617202" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;* I removed the Silverlight project from the Searcharoo solution (playing with Moonlight is a project for another day), but the Silverlight XAP from my Windows machine runs happily on the Mac against the Mono-version of the website:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SoZZfLVkvBI/AAAAAAAAA8U/DUh_gMPPsV0/s1600-h/Searcharoo-with-Silverlight-Mac.gif"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 226px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SoZZfLVkvBI/AAAAAAAAA8U/DUh_gMPPsV0/s400/Searcharoo-with-Silverlight-Mac.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5370077997839989778" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The other cool thing about MonoDevelop is that it already supports the iPhone/MonoTouch 'project types'. You can't compile/test/run anything (you need &lt;code&gt;MonoTouch.Foundation&lt;/code&gt; and &lt;code&gt;MonoTouch.UIKit&lt;/code&gt; which are in 'private beta'), but you &lt;i&gt;can&lt;/i&gt; browse the &lt;a href="http://www.mono-project.com/MonoTouch_Samples" target="20090815"&gt;MonoTouch Samples&lt;/a&gt; - so at least you can see what C# code for the iPhone &lt;i&gt;looks like&lt;/i&gt;. Fingers crossed &lt;a href="http://tirania.org/blog/" target="20090815"&gt;Miguel&lt;/a&gt; and the team release the bits publicly ASAP :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-7099369502736213225?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/7099369502736213225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/08/when-mono-just-works-searcharoo-ported.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/7099369502736213225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/7099369502736213225'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/08/when-mono-just-works-searcharoo-ported.html' title='When Mono &quot;just works&quot; - Searcharoo &apos;ported&apos;'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ba76y6K7kvs/SoZZed_sU_I/AAAAAAAAA8M/U2T-3tbR1Ko/s72-c/Searchaoo-on-Mono-1.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-3716136313526613935</id><published>2009-08-12T22:06:00.005+10:00</published><updated>2009-08-12T22:23:44.604+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maps'/><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualearth'/><category scheme='http://www.blogger.com/atom/ns#' term='bingmaps'/><title type='text'>City2Surf 2009 on RaceReplay.net with Flickr</title><content type='html'>The world's "largest timed footrace" - Sydney's &lt;a href="http://city2surf.com.au" target="20090812"&gt;City2Surf&lt;/a&gt; - is now viewable on &lt;a href="http://racereplay.net/City2Surf" target="20090812"&gt;RaceReplay.net&lt;/a&gt; thanks to &lt;a href="http://silverlight.net" target="20090812"&gt;Silverlight&lt;/a&gt; and BingMaps.&lt;br /&gt;&lt;br /&gt;There are two 'new' features:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1) Flickr photo integration&lt;/b&gt; (&lt;a href="http://racereplay.net/City2Surf" target="20090812"&gt;try it&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Using the &lt;a href="http://www.flickr.com/services/api/flickr.photos.search.html" target="20090812"&gt;Flickr photo search API&lt;/a&gt;, the Silverlight client renders small pink-and-blue dots for photos that are both geo-tagged &lt;i&gt;and&lt;/i&gt; tagged:"city2surf". Clicking on the dot will open the Flickr page.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SoKwrbxjjzI/AAAAAAAAA70/nKqX11-dFGU/s1600-h/RaceReplay_Flickr.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 344px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SoKwrbxjjzI/AAAAAAAAA70/nKqX11-dFGU/s400/RaceReplay_Flickr.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5369047966015524658" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2) Visualizing the entire race&lt;/b&gt; (&lt;a href="http://racereplay.net/City2Surf/?ReplayId=906" target="20090812"&gt;try it&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;It is (unfortunately) impossible to animate the 65,000 or so points that would represent every runner and walker taking part in the event. By aggregating the finishers into timebands (and using both size &amp; opacity to represent 'value') you can get some idea of the distribution of participants over time, over the course.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/SoKwrzCkVFI/AAAAAAAAA78/V49HclzG1NA/s1600-h/RaceReplay_Visualization.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 191px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/SoKwrzCkVFI/AAAAAAAAA78/V49HclzG1NA/s400/RaceReplay_Visualization.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5369047972260893778" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Add yourself!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;As always, you can search for and add more 'runners' to the animation. Start typing a name into the autocomplete box, select from the list (optionally choose a color from the color-picker) and click &lt;i&gt;Add runner&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SoKz6ee7B4I/AAAAAAAAA8E/tRy7TTzmJsU/s1600-h/RaceReplay_AddAnother.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 339px; height: 287px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SoKz6ee7B4I/AAAAAAAAA8E/tRy7TTzmJsU/s400/RaceReplay_AddAnother.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5369051522975598466" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-3716136313526613935?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/3716136313526613935/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/08/city2surf-2009-on-racereplaynet-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/3716136313526613935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/3716136313526613935'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/08/city2surf-2009-on-racereplaynet-with.html' title='City2Surf 2009 on RaceReplay.net with Flickr'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Ba76y6K7kvs/SoKwrbxjjzI/AAAAAAAAA70/nKqX11-dFGU/s72-c/RaceReplay_Flickr.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-5940736901377859032</id><published>2009-08-01T10:12:00.004+10:00</published><updated>2009-08-01T10:45:51.686+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='deepzoom'/><title type='text'>Seadragon - Deep Zoom on Demand</title><content type='html'>Microsoft &lt;a href="http://livelabs.com/blog/seadragon-com/" target="20090801"&gt;LiveLabs&lt;/a&gt; just announced the release of &lt;a href="http://seadragon.com" target="20090801"&gt;Seadragon.com&lt;/a&gt;, an Azure-based service that creates hosted DeepZoom images 'on demand', making it super-easy to share very-high-resolution images with a quick link.&lt;br /&gt;&lt;br /&gt;I tried it out with a few images from my Flickr account (they only take a minute or two to 'process')... &lt;i&gt;click the links to play with Seadragon, click the images just to see a larger copy&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://seadragon.com/view/c2"&gt;Sydney skyline&lt;/a&gt; 9774 x 2154 (21 megapixels)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/SnONqb-kP-I/AAAAAAAAA7M/nk0CDIY8Qws/s1600-h/Seadragon-Sydney01.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 190px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/SnONqb-kP-I/AAAAAAAAA7M/nk0CDIY8Qws/s320/Seadragon-Sydney01.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5364787341332594658" /&gt;&lt;/a&gt; &lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SnONqgAdoeI/AAAAAAAAA7U/RBz8Uwa1Lnw/s1600-h/Seadragon-Sydney02.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 190px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SnONqgAdoeI/AAAAAAAAA7U/RBz8Uwa1Lnw/s320/Seadragon-Sydney02.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5364787342414291426" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://seadragon.com/view/208"&gt;Seattle suburbs from the Space Needle&lt;/a&gt; 11991 x 2186 (26 megapixels)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/SnONqwUDJ1I/AAAAAAAAA7c/hOC-xm3L84g/s1600-h/Seadragon-Seattle01.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 190px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/SnONqwUDJ1I/AAAAAAAAA7c/hOC-xm3L84g/s320/Seadragon-Seattle01.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5364787346791409490" /&gt;&lt;/a&gt; &lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/SnONrVPBRNI/AAAAAAAAA7k/wAd1MNmKewA/s1600-h/Seadragon-Seattle02.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 190px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/SnONrVPBRNI/AAAAAAAAA7k/wAd1MNmKewA/s320/Seadragon-Seattle02.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5364787356702426322" /&gt;&lt;/a&gt; &lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/SnONrarPlVI/AAAAAAAAA7s/qyQZjM9r0Eo/s1600-h/Seadragon-Seattle03.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 190px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/SnONrarPlVI/AAAAAAAAA7s/qyQZjM9r0Eo/s320/Seadragon-Seattle03.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5364787358162982226" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here's a few more to try for yourself:&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://seadragon.com/view/c1"&gt;Sydney at night&lt;/a&gt; 2048 x 768 (1.6 megapixels)&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://seadragon.com/view/205"&gt;Pike Place Farmers Market&lt;/a&gt; 5273 x 2309 (12 megapixels)&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://seadragon.com/view/207"&gt;Space Needle and Mt Rainier&lt;/a&gt; 6388 x 2366 (15 megapixels)&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://seadragon.com/view/20f"&gt;Seattle waterfront from the Space Needle&lt;/a&gt; 8861 x 2062 (18 megapixels)&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://seadragon.com/view/20d"&gt;Pike Place close-up&lt;/a&gt; 11323 x 3026 (34 megapixels)&lt;br /&gt;&lt;br /&gt;As LiveLabs mentions on their website - an easy way to add hi-res images to your eBay listing, real-estate website, ecommerce store, blog, etc...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-5940736901377859032?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/5940736901377859032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/08/seadragon-deep-zoom-on-demand.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/5940736901377859032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/5940736901377859032'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/08/seadragon-deep-zoom-on-demand.html' title='Seadragon - Deep Zoom on Demand'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Ba76y6K7kvs/SnONqb-kP-I/AAAAAAAAA7M/nk0CDIY8Qws/s72-c/Seadragon-Sydney01.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-1149628037373436805</id><published>2009-07-12T16:46:00.008+10:00</published><updated>2009-07-12T22:24:40.964+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>SQL in Silverlight</title><content type='html'>It never ceases to amaze me how short my attention span has become... &lt;br /&gt;&lt;br /&gt;what was I saying :) ?&lt;br /&gt;&lt;br /&gt;Aaanyway, I sat down in front of my PC today planning to accomplish a few different things... but before that I had to catch up on blogs and twitter. A tweet caught my eye&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/SlmHn3Hd_hI/AAAAAAAAA68/yprYL6KwfIg/s1600-h/sqlport.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 57px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/SlmHn3Hd_hI/AAAAAAAAA68/yprYL6KwfIg/s400/sqlport.png" border="0" alt="migueldeicaza IDEA: SOmeone to do a line-by-line port of Sqlite to C# to run inside Silverlight" id="BLOGGER_PHOTO_ID_5357462350613839378" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;"Great idea" I thought... but seemed like quite a big job and certainly not something I have the time to tackle. Then I started to recall seeing a C# port of an SQL engine (&lt;i&gt;ages&lt;/i&gt; ago) and thought it might be fun to have a poke around. At least it would be easier to port something &lt;i&gt;already&lt;/i&gt; in .NET land.&lt;br /&gt;&lt;br /&gt;A couple of Google results later, I came across &lt;a href="http://www.codeproject.com/KB/database/sharphsql.aspx" target="20090712"&gt;Sharp HSql&lt;/a&gt;, a circa 2001 port of the Java-based &lt;a href="http://hsqldb.org/" target="20090712"&gt;hsqldb&lt;/a&gt; (&lt;a href="http://hsqldb.org/web/hsqlLicense.html" target="20090712"&gt;licence&lt;/a&gt;). The code was subsequently added to &lt;a href="http://sharphsql.codeplex.com/" target="20090712"&gt;Codeplex&lt;/a&gt; with the following warning: &lt;b style="color:darkred"&gt;This version is not ready for production grade applications. More testing is needed and some important bugs has to be fixed before that. You are warned.&lt;/b&gt;&lt;blockquote&gt;Long story short...&lt;/blockquote&gt;it's a couple of hours later and I've done nothing that I'd planned to, but here is an 'alpha' of &lt;a href="http://conceptdevelopment.net/Silverlight2/SharpSql01/default.html" target="20090712"&gt;SharpHSql for Silverlight (try it out)&lt;/a&gt; - there's some test SQL at the bottom of the post.&lt;br /&gt;&lt;!--a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/SlmHk9fjzsI/AAAAAAAAA60/2VbZITirxJ4/s1600-h/SharpHSql.png"--&gt;&lt;a href="http://conceptdevelopment.net/Silverlight2/SharpSql01/default.html" target="20090712"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 219px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/SlmHk9fjzsI/AAAAAAAAA60/2VbZITirxJ4/s400/SharpHSql.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5357462300785888962" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The "port" mainly consisted of:&lt;ul&gt;&lt;li&gt;'implementing' ArrayList and Hashtable (umm, can you say &lt;code&gt;List&amp;lt;object&amp;gt;&lt;/code&gt; and &lt;code&gt;Dictionary&amp;lt;object, object&amp;gt;&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;removing the 'Provider' and all the dependencies on &lt;code&gt;System.Data&lt;/code&gt; that work fine in the full framework, but are missing from Silverlight (would be nice to add some sort of wrapper back in...)&lt;/li&gt;&lt;li&gt;converting &lt;code&gt;FileInfo&lt;/code&gt; and related operations to &lt;code&gt;IsolatedStorageFileStream&lt;/code&gt; (still some persistence testing to do...)&lt;/li&gt;&lt;li&gt;breaking DateTime handling (for now)&lt;/li&gt;&lt;/ul&gt;The REAL work was all done by &lt;a href="http://www.onthemarksolutions.net/" target="20090712"&gt;Mark Tutt&lt;/a&gt; so don't get the idea that I'm taking any credit - all the goodness is his, any errors are mine. &lt;br /&gt;&lt;br /&gt;The full source of the consuming Silverlight app is this &lt;a href="http://conceptdevelopment.net/Silverlight2/SharpSql01/Page.xaml.html" target="20090712"&gt;Page.xaml&lt;/a&gt; and &lt;a href="http://conceptdevelopment.net/Silverlight2/SharpSql01/Page.xaml.html" target="20090712"&gt;Page.xaml.cs&lt;/a&gt;; the full &lt;a href="http://conceptdevelopment.net/Silverlight2/SharpSql01/SharpSql01.ZIP" target="20090712"&gt;Visual Studio 2008 project ZIP (199Kb)&lt;/a&gt; is available to download. Anywhere I've touched the code you'll find a &lt;code style="color:darkgreen"&gt;//HACK:&lt;/code&gt; tag!&lt;br /&gt;&lt;br /&gt;&lt;b style="color:darkred"&gt;Disclaimer:&lt;/b&gt; I've no idea if this is fit for any purpose at all... it &lt;i&gt;seems&lt;/i&gt; to be able to DROP and CREATE tables, INSERT rows and SELECT/JOIN - but even that could be a fluke. Try it out at your own risk; leave a comment if you find something good or bad. Have fun! &lt;br /&gt;&lt;br /&gt;&lt;b style="color:darkgrey"&gt;UPDATE:&lt;/b&gt; the &lt;a href="http://conceptdevelopment.net/Silverlight2/SharpSql02/default.html" target="20090712"&gt;output is a lot prettier (try it)&lt;/a&gt; with the Silverlight DataGrid and &lt;a href="http://blog.bodurov.com/How-to-bind-Silverlight-DataGrid-from-IEnumerable-of-IDictionary" target="20090712"&gt;Vladimir Bodurov's awesome dynamic datasource compiler&lt;/a&gt; - &lt;a href="http://conceptdevelopment.net/Silverlight2/SharpSql02/DataSourceCreator.cs.html" target="20090712"&gt;updated for generic types&lt;/a&gt;&lt;br /&gt;&lt;!--a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/SlnUF2B5Z2I/AAAAAAAAA7E/Y8EZjxSpwx0/s1600-h/SharpSql02.png"--&gt;&lt;a href="http://conceptdevelopment.net/Silverlight2/SharpSql02/default.html" target="20090712"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 273px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/SlnUF2B5Z2I/AAAAAAAAA7E/Y8EZjxSpwx0/s400/SharpSql02.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5357546428601821026" /&gt;&lt;/a&gt;&lt;br /&gt;(&lt;a href="http://conceptdevelopment.net/Silverlight2/SharpSql01/SharpSql02.ZIP"&gt;updated source (277Kb)&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Test SQL&lt;/h2&gt;#1&lt;pre&gt;DROP TABLE IF EXIST "books";CREATE TABLE "books" ("id" INT NOT NULL PRIMARY KEY, "name" char, "author" char, "qty" int, "value" numeric);&lt;br /&gt;&lt;br /&gt;INSERT INTO "books" VALUES (1, 'Book000', 'Amy', 1, 23.5);&lt;br /&gt;INSERT INTO "books" VALUES (2, 'Book001', 'Andy', 2, 43.9);&lt;br /&gt;INSERT INTO "books" VALUES (3, 'Book002', 'Andy', 3, 37.25);&lt;br /&gt;INSERT INTO "books" VALUES (4, 'Book 21', 'Amy', 99, 20.5);&lt;br /&gt;INSERT INTO "books" VALUES (5, 'Book 22', 'Andy', 2, 903.9);&lt;br /&gt;INSERT INTO "books" VALUES (6, 'Book 23', 'Andy', 5, 0.25);&lt;br /&gt;&lt;br /&gt;SELECT * FROM "books" ORDER BY "value"&lt;br /&gt;&lt;br /&gt;DROP TABLE IF EXIST "author";CREATE TABLE "author" ("name" char NOT NULL PRIMARY KEY, "country" char);&lt;br /&gt;&lt;br /&gt;INSERT INTO "Author" VALUES ('Andy', 'UK');&lt;br /&gt;INSERT INTO "Author" VALUES ('Amy', 'USA');&lt;br /&gt;&lt;br /&gt;SELECT * FROM "author" ORDER BY "value"&lt;br /&gt;&lt;br /&gt;SELECT * FROM "books" LEFT JOIN "author" ON "author"."name" = "books"."name"&lt;/pre&gt;#2&lt;pre&gt;CREATE TABLE "clients" ("id" int NOT NULL IDENTITY PRIMARY KEY, "DoubleValue" double, "nombre" char, "photo" varbinary, "created" date );&lt;br /&gt;INSERT INTO "clients" ("DoubleValue", "nombre", "photo", "created") VALUES (1.1, 'NOMBRE')&lt;br /&gt;SELECT * FROM "clients"&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-1149628037373436805?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/1149628037373436805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/07/sql-in-silverlight.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/1149628037373436805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/1149628037373436805'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/07/sql-in-silverlight.html' title='SQL in Silverlight'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Ba76y6K7kvs/SlmHn3Hd_hI/AAAAAAAAA68/yprYL6KwfIg/s72-c/sqlport.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-2092813512315061177</id><published>2009-07-10T19:41:00.004+10:00</published><updated>2009-07-10T20:59:25.613+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='silverlight3'/><title type='text'>Silverlight 3.0 - can't upgrade Runtime without DevTools?</title><content type='html'>Silverlight 3.0 has been RTW (Released To Web), so I rushed straight to &lt;a href="http://silverlight.net/GetStarted/" target="_blank"&gt;Silverlight.net&lt;/a&gt; to install it. Because I'm a Silverlight developer, I already have Silverlight 2.0 and the Silverlight 2.0 Tools for Visual Studio installed (of course).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://silverlight.net/GetStarted/" target="_blank"&gt;Silverlight.net&lt;/a&gt; immediately notices I'm "out of date" and suggests I install the latest version. &lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SlcPltQZNnI/AAAAAAAAA6M/4R2_6YDzdb4/s1600-h/SL01.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 265px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SlcPltQZNnI/AAAAAAAAA6M/4R2_6YDzdb4/s400/SL01.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5356767422258427506" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After the quick 4Mb download, the installation seems to be going well...&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/SlcPmIWmugI/AAAAAAAAA6U/kYsdzGCyv8Y/s1600-h/SL02.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 185px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/SlcPmIWmugI/AAAAAAAAA6U/kYsdzGCyv8Y/s400/SL02.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5356767429532236290" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;...until... oops, I can't upgrade the Runtime in browser if the Visual Studio developer tools are out-of-date (ie. for 2.0)??&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/SlcPmIw8luI/AAAAAAAAA6c/gizdy9aqc5E/s1600-h/SL03.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 185px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/SlcPmIw8luI/AAAAAAAAA6c/gizdy9aqc5E/s400/SL03.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5356767429642720994" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'll just click 'more information' to read more - oh wait, &lt;b&gt;404&lt;/b&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/SlcPmc0AhnI/AAAAAAAAA6k/poElxW10oQA/s1600-h/SL04.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 185px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/SlcPmc0AhnI/AAAAAAAAA6k/poElxW10oQA/s400/SL04.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5356767435024270962" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;At the moment it seems like you'll &lt;b&gt;have&lt;/b&gt; to install the full &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=9442b0f2-7465-417a-88f3-5e7b5409e9dd&amp;displaylang=en" target="_blank"&gt;Silverlight 3.0 Developer Tools&lt;/a&gt; just to view Silverlight 3.0 content (if you were previously developing for Silverlight 2.0).&lt;br /&gt;&lt;br /&gt;Only problem is, &lt;a href="http://go.microsoft.com/fwlink/?LinkId=157632" target="_blank"&gt;Silverlight 3 Release Notes&lt;/a&gt; says&lt;blockquote&gt;Silverlight 2 projects cannot be created with the Silverlight 3 Tools for Visual Studio 2008. To create Silveright 2 projects, uninstall the Silverlight 3 runtime and the Silverlight 3 Tools from Add or Remove Programs and re-install the Silverlight 2 Tools for Visual Studio 2008.&lt;br /&gt;&lt;/blockquote&gt;I'm not sure I want to force all my users to upgrade to Silverlight 3.0 right now - I don't wany &lt;i&gt;my&lt;/i&gt; website to be the one that forces a 4Mb download until I really need it (ie. I start using 3.0 features). So... to keep &lt;i&gt;developing&lt;/i&gt; on 2.0 (for now), I can't even &lt;i&gt;view&lt;/i&gt; Silverlight 3.0 content?&lt;br /&gt;&lt;br /&gt;Please - tell me I'm wrong and that I've missed something?&lt;br /&gt;&lt;br /&gt;&lt;b style="color:darkred"&gt;UPDATE:&lt;/b&gt; Thankfully, in a VirtualPC set aside for SL3.0, &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=9442b0f2-7465-417a-88f3-5e7b5409e9dd&amp;displaylang=en" target="_blank"&gt;the tools&lt;/a&gt; happily uninstalled previous versions and enabled me to open, recompile and deploy my 3.0 beta stuff...&lt;br /&gt;&lt;br /&gt;Here are some beta samples updated for RTW&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.conceptdevelopment.net/silverlight3/MapsThatBend01/Default.html" target="20090710"&gt;Maps That Bend Upwards&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.conceptdevelopment.net/silverlight3/DeepZoom01/Default.html" target="20090710"&gt;PlaneProjection with DeepZoom tiles&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.conceptdevelopment.net/silverlight3/VEMap01/Default.html"&gt;Bing Maps Control with PlaneProjection&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.conceptdevelopment.net/silverlight3/OutOfBrowser01/default.html" target="20090710"&gt;OutOfBrowser DeepZoom Tile Viewer&lt;/a&gt; - breaking change: remove the &lt;code&gt;Deployment.ApplicationIdentity&lt;/code&gt; element from &lt;code&gt;AppManifest.xml&lt;/code&gt; and use the right-click+Properties to setup Out-of-Browser (creates a new &lt;code&gt;OutOfBrowserSettings.xml&lt;/code&gt; file you)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-2092813512315061177?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/2092813512315061177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/07/silverlight-30-cant-upgrade-runtime.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/2092813512315061177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/2092813512315061177'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/07/silverlight-30-cant-upgrade-runtime.html' title='Silverlight 3.0 - can&apos;t upgrade Runtime without DevTools?'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Ba76y6K7kvs/SlcPltQZNnI/AAAAAAAAA6M/4R2_6YDzdb4/s72-c/SL01.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-5272215872414320764</id><published>2009-06-18T22:13:00.005+10:00</published><updated>2009-06-18T22:43:27.787+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ipodtouch'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>iPhone OS 3.0 - Safari Geolocation</title><content type='html'>Having installed iPhone OS 3.0 today, the first thing I wanted to play with (after MMS and Copy/Paste) was the &lt;a href="http://developer.apple.com/safari/library/documentation/AppleApplications/Reference/SafariWebContent/GettingGeographicalLocations/GettingGeographicalLocations.html" target="_blank"&gt;Safari Geographical Location support&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The best example code I found was this &lt;a href="http://blog.bemoko.com/2009/06/17/iphone-30-geolocation-javascript-api/" target="_blank"&gt;iPhone 3.0 geolocation javascript API&lt;/a&gt; example... however for some reason the Google 'static map' images wouldn't work for me. I'm not 100% sure why (since the blog post appears to show it working) - but Safari on the iPhone &lt;i&gt;does&lt;/i&gt; handle &lt;i&gt;http://maps.google.com&lt;/i&gt; URLs in a special way (at least it does if they're anchor/links, in which case it triggers the &lt;b&gt;Maps&lt;/b&gt; application).&lt;br /&gt;&lt;br /&gt;Anyway, since I was keen to get "something" working, I Googled a basic 'image passthrough proxy' - which seemed to fix the problem.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/SjoyS9P6BfI/AAAAAAAAA6E/BvUYhxA-FLg/s1600-h/photo.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 267px; height: 400px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/SjoyS9P6BfI/AAAAAAAAA6E/BvUYhxA-FLg/s400/photo.jpg" border="0" alt="iPhone safari geolocation" id="BLOGGER_PHOTO_ID_5348642808716199410" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://conceptdevelopment.net/Fun/GoogleMaps2/Map.html" target="_blank"&gt;HTML and javascript&lt;/a&gt; is very simple (it's repeated from &lt;a href="http://blog.bemoko.com/2009/06/17/iphone-30-geolocation-javascript-api/" target="_blank"&gt;here&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;function handler(location) {&lt;br /&gt;    var message = document.getElementById("message");&lt;br /&gt;    var loc = location.coords.latitude + "," + location.coords.longitude;&lt;br /&gt;    message.innerHTML = "&amp;lt;img src='MapImageHandler.aspx?centerPoint="+ loc +"' /&amp;gt;";&lt;br /&gt;    message.innerHTML+="&amp;lt;p&amp;gt;Longitude: " + location.coords.longitude + "&amp;lt;br /&amp;gt;";&lt;br /&gt;    message.innerHTML+="Latitude: " + location.coords.latitude + "&amp;lt;br /&amp;gt;";&lt;br /&gt;    message.innerHTML += "Accuracy: " + location.coords.accuracy + "&amp;lt;/p&amp;gt;";&lt;br /&gt;}&lt;br /&gt;navigator.geolocation.getCurrentPosition(handler);&lt;/pre&gt;The &lt;a href="http://conceptdevelopment.net/Fun/GoogleMaps2/MapImageHandler.aspx.html" target="_blank"&gt;MapImageHandler.aspx&lt;/a&gt; code is also very short (and was sourced from &lt;a href="http://www.codeproject.com/KB/webforms/GoogleStaticMapWebControl.aspx?fid=1216153&amp;df=90&amp;mpp=25&amp;noise=3&amp;sort=Position&amp;view=Quick&amp;select=2601991#xx2601991xx" target="_blank"&gt;here&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;That's about the most basic geolocation sample you could... now to find something useful to do with it! Thanks to the two authors of the code I stitched together (&lt;a href="http://blog.bemoko.com/" target="_blank"&gt;blog.bemoko.com&lt;/a&gt; and &lt;a href="http://www.codeproject.com/KB/webforms/GoogleStaticMapWebControl.aspx?fid=1216153&amp;df=90&amp;mpp=25&amp;noise=3&amp;sort=Position&amp;view=Quick&amp;select=2601991#xx2601991xx" target="_blank"&gt;guy off CodeProject&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-5272215872414320764?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/5272215872414320764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/06/iphone-os-30-safari-geolocation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/5272215872414320764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/5272215872414320764'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/06/iphone-os-30-safari-geolocation.html' title='iPhone OS 3.0 - Safari Geolocation'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ba76y6K7kvs/SjoyS9P6BfI/AAAAAAAAA6E/BvUYhxA-FLg/s72-c/photo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-4969399830408690430</id><published>2009-06-17T21:05:00.001+10:00</published><updated>2009-06-17T22:03:48.498+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='search'/><title type='text'>Customizing Bing (on your site)</title><content type='html'>It's fairly easy to create a site-specific, bing-powered search box, using the basic wizard at &lt;a href="http://www.bing.com/siteowner/"&gt;www.bing.com/siteowner&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;However, it turned out to be less obvious how to 'customize' it's behaviour... specifically I wanted the search to search 'sites in Australia' by default. The final result is shown below, and you can &lt;a href="http://conceptdevelopment.net/Search/Bing01/"&gt;try it here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/SjjZX5kWiSI/AAAAAAAAA58/zh4U0aTwR1s/s1600-h/BingSilverlight.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 294px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/SjjZX5kWiSI/AAAAAAAAA58/zh4U0aTwR1s/s400/BingSilverlight.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5348263562115975458" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa905321.aspx"&gt;Working with Advanced Queries in the Windows Live Search Box&lt;/a&gt; provides some hints about how you can customize the javascript &lt;code&gt;var WLSearchBoxConfiguration={...}&lt;/code&gt; which controls how the search box works.&lt;br /&gt;&lt;br /&gt;By default it looks like this&lt;pre&gt;var WLSearchBoxConfiguration=&lt;br /&gt;{&lt;br /&gt;"global":{&lt;br /&gt; "serverDNS":"www.bing.com",&lt;br /&gt; "market":"en-AU"&lt;br /&gt;},&lt;br /&gt;"appearance":{&lt;br /&gt; "autoHideTopControl":false,&lt;br /&gt; "width":600,&lt;br /&gt; "height":400,&lt;br /&gt; "theme":"Blue"&lt;br /&gt;},&lt;br /&gt;"scopes":[&lt;br /&gt; {&lt;br /&gt;  "type":"web",&lt;br /&gt;  "caption":"&amp;amp;#x57;&amp;amp;#x65;&amp;amp;#x62;",&lt;br /&gt;  "searchParam":""&lt;br /&gt; }&lt;br /&gt;]&lt;br /&gt;}&lt;/pre&gt;which provides a simple web search. To force the search to be "only for sites from Australia" we needed to add a new &lt;code&gt;scope&lt;/code&gt; with a &lt;b&gt;searchParam&lt;/b&gt; set:&lt;pre&gt;"searchParam":"loc:AU"&lt;/pre&gt;&lt;br /&gt;Restricting to a specific site/domain is more obvious:&lt;pre&gt;"searchParam": "site:conceptdev.blogspot.com"&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;It ends up looking like this:&lt;pre style='width:400px;'&gt;var WLSearchBoxConfiguration=&lt;br /&gt;{&lt;br /&gt;    "global":{&lt;br /&gt;        "serverDNS":"www.bing.com",&lt;br /&gt;        "market":"en-AU"&lt;br /&gt;    },&lt;br /&gt;    "appearance":{&lt;br /&gt;        "autoHideTopControl":false,&lt;br /&gt;        "width":600,&lt;br /&gt;        "height":400,&lt;br /&gt;        "theme":"Blue"&lt;br /&gt;    },&lt;br /&gt;    "scopes": [&lt;br /&gt;        {&lt;br /&gt;            "type": "web",&lt;br /&gt;            "caption": "this site",&lt;br /&gt;            "searchParam": "site:conceptdevelopment.net"&lt;br /&gt;        }&lt;br /&gt;        ,&lt;br /&gt;        {&lt;br /&gt;            "type": "web",&lt;br /&gt;            "caption": "ConceptDev Blog",&lt;br /&gt;            "searchParam": "site:conceptdev.blogspot.com"&lt;br /&gt;        }&lt;br /&gt;        ,&lt;br /&gt;        {&lt;br /&gt;            "type":"web",&lt;br /&gt;            "caption":"&amp;amp;#x57;&amp;amp;#x65;&amp;amp;#x62;&amp;amp;#x20;&amp;amp;#x28;&amp;amp;#x41;&amp;amp;#x75;&amp;amp;#x73;&amp;amp;#x74;&amp;amp;#x72;&amp;amp;#x61;&amp;amp;#x6C;&amp;amp;#x69;&amp;amp;#x61;&amp;amp;#x29;",&lt;br /&gt;            "searchParam":"loc:AU"&lt;br /&gt;        }&lt;br /&gt;        ,&lt;br /&gt;        {&lt;br /&gt;            "type":"web",&lt;br /&gt;            "caption":"&amp;amp;#x57;&amp;amp;#x65;&amp;amp;#x62;&amp;amp;#x20;&amp;amp;#x28;&amp;amp;#x61;&amp;amp;#x6c;&amp;amp;#x6C;&amp;amp;#x29;",&lt;br /&gt;            "searchParam":""&lt;br /&gt;        }&lt;br /&gt;    ]&lt;br /&gt;}&lt;/pre&gt;It doesn't look like you need to worry too much about the ASCII-Hex encoding for simple characters (although if you want to encode them, there are plenty of &lt;a href="http://www.dolcevie.com/js/converter.html" target="_blank"&gt;tools&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-4969399830408690430?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/4969399830408690430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/06/customizing-bing-on-your-site.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/4969399830408690430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/4969399830408690430'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/06/customizing-bing-on-your-site.html' title='Customizing Bing (on your site)'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Ba76y6K7kvs/SjjZX5kWiSI/AAAAAAAAA58/zh4U0aTwR1s/s72-c/BingSilverlight.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-7440682855160168906</id><published>2009-06-10T09:40:00.003+10:00</published><updated>2009-06-10T09:51:00.847+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hiring'/><category scheme='http://www.blogger.com/atom/ns#' term='resume'/><title type='text'>How I read a resumé...</title><content type='html'>I came across this graphic today - linked from a great post on &lt;a href="http://www.lostechies.com/blogs/chad_myers/archive/2009/03/23/how-to-apply-for-a-professional-job.aspx" target="_blank"&gt;How to apply for a professional job&lt;/a&gt; - and &lt;i&gt;had&lt;/i&gt; to post a link to it. Many of the points are funny/humorous - generally because they're (kinda) true! All the ones about attention-to-detail in your CV are 100% spot-on.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.hanovsolutions.com/resume_comic.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 333px; height: 617px;" src="http://www.hanovsolutions.com/resume_comic.png" border="0" alt=""  /&gt;&lt;/a&gt;&lt;!--1000px; height: 1853px;--&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-7440682855160168906?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/7440682855160168906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/06/how-i-read-resum.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/7440682855160168906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/7440682855160168906'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/06/how-i-read-resum.html' title='How I read a resum&amp;eacute;...'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-7722871204683515521</id><published>2009-05-27T19:43:00.007+10:00</published><updated>2009-11-15T19:57:50.778+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spam'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>Twitter spam=FAIL (UPDATE Customer Service=WIN)</title><content type='html'>&lt;span style='color:darkred'&gt;&lt;b&gt;Update Nov-09:&lt;/b&gt; It's been a few months since I 'let off steam' with the post below. It sounds a bit over-the-top reading it now. Anyway, as you can see in the comments I was recently contact by the company directly and I couldn't be more impressed with how they handled my 'complaint'. That sort of honesty in customer service deserves another look. The remainder of the post reads 'as it was'.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In the normal course of tweeting today, I happened to post&lt;blockquote&gt;Argh - moving an ASP.NET app that requires Crystal Reports for VS 2003... oh the humanity&lt;/blockquote&gt;Nothing special about that - I often complain about stuff on Twitter... but mostly programming and stuff, not specific products or companies (see &lt;a href="http://www.hanselman.com/blog/WhenWordOfMouthGotAPermalinkCompaniesCustomersAndTwitter.aspx" target="20090527"&gt;When Word of Mouth Got a Permalink&lt;/a&gt;) so I was unprepared for what happened next...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/Sh0L1F7MCOI/AAAAAAAAA50/HBSytc-EDs4/s1600-h/twitterspam.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 51px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/Sh0L1F7MCOI/AAAAAAAAA50/HBSytc-EDs4/s400/twitterspam.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5340437739882678498" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;W.T.F.!? Okay so Twitter is totally open and there are all sorts of search-bots BUT give-me-a-break with the crappy marketing line and unattended twitter account.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/Sv-_-BEo9iI/AAAAAAAABIw/Is_3qHLWdYo/s1600-h/whinge.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 195px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/Sv-_-BEo9iI/AAAAAAAABIw/Is_3qHLWdYo/s400/whinge.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5404249150028576290" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Phew now I feel better :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-7722871204683515521?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/7722871204683515521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/05/twitter-spam-fail.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/7722871204683515521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/7722871204683515521'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/05/twitter-spam-fail.html' title='Twitter spam=FAIL (UPDATE Customer Service=WIN)'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Ba76y6K7kvs/Sh0L1F7MCOI/AAAAAAAAA50/HBSytc-EDs4/s72-c/twitterspam.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-8251391990181206113</id><published>2009-05-14T21:28:00.004+10:00</published><updated>2009-05-14T21:41:26.248+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='translator'/><title type='text'>Microsoft Translator Widget</title><content type='html'>The &lt;a href="http://www.microsofttranslator.com/" target="20090514"&gt;Microsoft Translator Widget&lt;/a&gt; has been popping up on various sites recently - and now some of mine...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://conceptdevelopment.net/#mstto=es" target="20090514"&gt;ConceptDevelopment.net in Spanish&lt;/a&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/SgwBaJjDx8I/AAAAAAAAA5k/wY7sKpWPsSA/s1600-h/condev-spanish.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 310px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/SgwBaJjDx8I/AAAAAAAAA5k/wY7sKpWPsSA/s400/condev-spanish.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5335641207278389186" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://geoquery2008.com/Screenshots.aspx#mstto=ja" target="20090514"&gt;Geoquery2008.com in Japanese&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/SgwBaGMl6JI/AAAAAAAAA5s/KZC75vCuUEw/s1600-h/geoquery-japanese.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 269px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/SgwBaGMl6JI/AAAAAAAAA5s/KZC75vCuUEw/s400/geoquery-japanese.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5335641206378850450" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's difficult to tell how useful this will be - unless Google can 'discover' this content is available in other languages it will be difficult to attract foreign-language traffic to Translator-enabled sites. It's all client-side/script-driven, so Google isn't going to get any translated content under normal spidering conditions. Those who land on the content organically may find it helpful I suppose... &lt;br /&gt;I wonder if Live Search does anything special for Translator sites?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-8251391990181206113?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/8251391990181206113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/05/microsoft-translator-widget.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/8251391990181206113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/8251391990181206113'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/05/microsoft-translator-widget.html' title='Microsoft Translator Widget'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ba76y6K7kvs/SgwBaJjDx8I/AAAAAAAAA5k/wY7sKpWPsSA/s72-c/condev-spanish.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-374844679840474641</id><published>2009-05-12T21:01:00.003+10:00</published><updated>2009-05-12T21:23:44.412+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maps'/><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><title type='text'>Draw on Silverlight Virtual Earth Map Control</title><content type='html'>There are a couple of different projects where I'd like to enable 'drawing' on a map (including &lt;a href="http://racereplay.net" target="20090512"&gt;RaceReplay.net&lt;/a&gt;) - this is a basic first-cut of drawing within the &lt;a href="http://connect.microsoft.com/silverlightmapcontrolctp" target="_TOP"&gt;Microsoft VE Map Control&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Each click on the map will start/continue a line. The MouseLeave event is wired to start a 'new' line. Navigating the map (dragging/double-click zoom) also causes points to be drawn - obviously this needs some work...&lt;br /&gt;&lt;iframe src="http://conceptdevelopment.net/Silverlight2/MapInfo01/Default.html" width="400" height="300"&gt;&lt;br /&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;The two files required to build it are &lt;a href="http://conceptdevelopment.net/Silverlight2/MapInfo01/Page.xaml.html"&gt;&lt;code&gt;Page.xaml&lt;/code&gt;&lt;/a&gt; and &lt;a href="http://conceptdevelopment.net/Silverlight2/MapInfo01/Page.xaml.cs.html"&gt;&lt;code&gt;Page.xaml.cs&lt;/code&gt;&lt;/a&gt;, the key pieces of code being&lt;pre&gt;private void VEMap_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)&lt;br /&gt;{&lt;br /&gt;    Map m = (Map)sender;&lt;br /&gt;    Location l = m.ViewportPointToLocation(e.GetPosition(m));&lt;br /&gt;    if (polyline == null)&lt;br /&gt;        CreateNewPolyline(l);&lt;br /&gt;    else&lt;br /&gt;        polyline.Locations.Add(l);&lt;br /&gt;}&lt;/pre&gt;and&lt;pre&gt;private void CreateNewPolyline(Location startPoint)&lt;br /&gt;{&lt;br /&gt;    polyline = new MapPolyline();&lt;br /&gt;    polyline.Stroke = new SolidColorBrush(Colors.Red);&lt;br /&gt;    polyline.StrokeThickness = 2;&lt;br /&gt;    var lc = new LocationCollection();&lt;br /&gt;    lc.Add(startPoint);&lt;br /&gt;    polyline.Locations = lc;&lt;br /&gt;    VEMap.Children.Add(polyline);&lt;br /&gt;}&lt;/pre&gt;Simple, eh?&lt;br /&gt;&lt;br /&gt;p.s. these are plain old straight lines - at the 'continent' level you might expect them to curve as though on a great-circle; I'm not too worried about implementing that right now since the target usage of my drawing is at a much "smaller scale"... however &lt;a href="http://geoquery2008.com" target="20090512"&gt;Geoquery2008&lt;/a&gt; does &lt;a href="http://geoquery2008.com/Examples/airports01/" target="20090512"&gt;draw great circle lines correctly&lt;/a&gt;...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-374844679840474641?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/374844679840474641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/05/draw-on-silverlight-virtual-earth-map.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/374844679840474641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/374844679840474641'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/05/draw-on-silverlight-virtual-earth-map.html' title='Draw on Silverlight Virtual Earth Map Control'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-2769825806243716276</id><published>2009-05-09T20:50:00.005+10:00</published><updated>2009-05-09T21:25:56.082+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='json'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>Silverlight DataContractJsonSerializer Error</title><content type='html'>Admittedly there is very little excuse for hand-crafting &lt;b&gt;Json&lt;/b&gt; output these days, with libraries like &lt;a href="http://www.codeplex.com/Json" target="20090509"&gt;Json.NET&lt;/a&gt; available, and &lt;a href"http://msdn.microsoft.com/en-us/library/bb412173.aspx" target="20090509"&gt;WCF supporting Json natively&lt;/a&gt;. However, I was tweaking an existing ASPX page (that was actually &lt;a href="http://www.racereplay.net/Scene4.xaml.aspx?ReplayId=8&amp;SimTime=60" target="20090509"&gt;rendering Xaml&lt;/a&gt; for a Silverlight 1.0 application) to turn it into a 'service' for Silverlight 2.0... and it &lt;i&gt;seemed&lt;/i&gt; like the fastest way to do that was simply replace a whole pile of &amp;lt;s and &amp;gt;s with {}&lt;br /&gt;&lt;br /&gt;I got some hints/reminders on how to &lt;a href="http://www.85turns.com/2008/03/12/consume-a-json-object-in-silverlight/" target="20090509"&gt;Consume a JSON object in Silverlight&lt;/a&gt;, and found &lt;a href="http://www.jsonlint.com/" target="20090509"&gt;Jsonlint&lt;/a&gt; really helpful in tuning the output until it was valid Json.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/SgVlFs9sDrI/AAAAAAAAA5M/jWSY_joQIsg/s1600-h/JsonLint.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 273px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/SgVlFs9sDrI/AAAAAAAAA5M/jWSY_joQIsg/s320/JsonLint.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5333780482333871794" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Then I created a 'matching' object model in Silverlight C# &lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/SgVlF384BTI/AAAAAAAAA5U/aopLdv8f13Y/s1600-h/ObjectModel.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 198px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/SgVlF384BTI/AAAAAAAAA5U/aopLdv8f13Y/s320/ObjectModel.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5333780485283251506" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and wired up the &lt;code&gt;OpenReadCompleted&lt;/code&gt; event using &lt;code&gt;DataContractJsonSerializer&lt;/code&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/SgVlJCgQjpI/AAAAAAAAA5c/b4LYNlJRLeY/s1600-h/Code.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 255px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/SgVlJCgQjpI/AAAAAAAAA5c/b4LYNlJRLeY/s400/Code.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5333780539655622290" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Everything LOOKED like it should work, so at first I was confused by this error message: &lt;br /&gt;&lt;b style='color:darkred'&gt;&lt;code&gt;Unable to cast object of type 'System.Collections.Generic.List`1[System.Object]' to type 'System.Collections.Generic.Dictionary`2[System.String,System.Object]'&lt;/code&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;After staring blankly at the code for a while, I finally realised where my Json had gone wrong -- &lt;i&gt;at the very root of my Json response (see Jsonlint image above) I was "accidentally" wrapping the entire Json output with an unnecessary &lt;b&gt;[]&lt;/b&gt; pair&lt;/i&gt;. I guess this meant the Deserializer was expecting to cast into a collection (albeit with a single element), but I was intending the root Json element to be a single object (to match my C# &lt;code&gt;JsonCourse&lt;/code&gt;).&lt;br /&gt;&lt;br /&gt;The simple fix was removing the enclosing &lt;b&gt;[]&lt;/b&gt; so that my Json started off like this instead:&lt;pre&gt;{&lt;br /&gt;    "width": 800 ,&lt;br /&gt;    "height": 600 ,&lt;br /&gt;    "runners": [&lt;br /&gt;        {&lt;br /&gt;            "name": "mapcanberramarathon",&lt;br /&gt;            "points": [&lt;/pre&gt;Lesson for tonight is to better understand the underlying Json representation before consuming it (or else use a library rather than hand-craft the output). Anyway now it is fixed &lt;a href="http://racereplay.net" target="20090509"&gt;RaceReplay.net 2.0&lt;/a&gt; is that much closer to fruition...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-2769825806243716276?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/2769825806243716276/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/05/silverlight-datacontractjsonserializer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/2769825806243716276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/2769825806243716276'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/05/silverlight-datacontractjsonserializer.html' title='Silverlight DataContractJsonSerializer Error'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ba76y6K7kvs/SgVlFs9sDrI/AAAAAAAAA5M/jWSY_joQIsg/s72-c/JsonLint.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-2942952037518155323</id><published>2009-05-02T18:12:00.007+10:00</published><updated>2009-05-02T20:47:09.922+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maps'/><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='silverlight3'/><title type='text'>Silverlight "Maps That Bend Upwards"</title><content type='html'>&lt;img src="http://conceptdevelopment.net/Silverlight3/MapsThatBend01/MapsThatBend01.jpg" align="right" /&gt;I was inspired today by &lt;a href="http://schulzeandwebb.com/hat/" target="20090502"&gt;HERE &amp;amp; THERE's &lt;i&gt;horizonless projection&lt;/i&gt; of Manhattan&lt;/a&gt; (via &lt;a href="http://www.mcwetboy.net/maproom/2009/05/maps_of_manhatt.php" target="20090502"&gt;The Map Room: Maps that Bend Upwards&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Using Silverlight 3.0 beta and it's new &lt;code&gt;PlaneProjection&lt;/code&gt; feature, I have hooked up three &lt;a href="https://sharepoint.connect.microsoft.com/silverlightmapcontrolctp/iSDK/default.htm?wa=wsignin1.0" target="20090502"&gt;Silverlight Map Controls&lt;/a&gt; with different values for &lt;code&gt;RotationX&lt;/code&gt;, &lt;code&gt;GlobalOffsetY&lt;/code&gt; (vertical displacement) and &lt;code&gt;GlobalOffsetZ&lt;/code&gt; (in/out of the page) to create a very crude 'interactive' version of their horizonless-map.&lt;br /&gt;&lt;br /&gt;If you have Silverlight 3.0 beta installed, you can &lt;a href="http://www.conceptdevelopment.net/silverlight3/MapsThatBend01/Default.html" target="20090502"&gt;try out the &lt;b&gt;Silverlight Virtual Earth Maps That Bend Upwards&lt;/b&gt;&lt;/a&gt; OR if you don't have the beta installed, you can &lt;a href="http://conceptdevelopment.net/Silverlight3/MapsThatBend01/" target="20090502"&gt;watch a screencast&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/SfwMHdJcMsI/AAAAAAAAA5E/ME9GHpAixFU/s1600-h/London_1103x759.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 275px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/SfwMHdJcMsI/AAAAAAAAA5E/ME9GHpAixFU/s400/London_1103x759.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5331149381122667202" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.conceptdevelopment.net/silverlight3/MapsThatBend01/Default.html" target="20090502" style="font-size:8px"&gt;[try it]&lt;/a&gt; &lt;a style="font-size:8px" href="http://conceptdevelopment.net/Silverlight3/MapsThatBend01/" target="20090502"&gt; [watch it]&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've noticed a little bit of weird behaviour on loading (sometimes the 'initial' map of New York doesn't load completely sync'd in all three panels), but after that it seems to work OK - it's just for fun after all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-2942952037518155323?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/2942952037518155323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/05/silverlight-maps-that-bend-upwards.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/2942952037518155323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/2942952037518155323'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/05/silverlight-maps-that-bend-upwards.html' title='Silverlight &quot;Maps That Bend Upwards&quot;'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Ba76y6K7kvs/SfwMHdJcMsI/AAAAAAAAA5E/ME9GHpAixFU/s72-c/London_1103x759.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-2519494099445058790</id><published>2009-04-26T17:38:00.009+10:00</published><updated>2009-05-02T21:07:24.314+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><title type='text'>ASP.NET Model View Controller (MVC)</title><content type='html'>Another 'link collection' (along the lines of my &lt;a href="http://conceptdev.blogspot.com/2009/02/silverlight-model-view-viewmodel-mvvm.html" target="20090426"&gt;MVVM list&lt;/a&gt;)... about ASP.NET MVC (Model View Controller)...&lt;br /&gt;&lt;table cellpadding="3" cellspacing="3" style="border-color:Gray; border-width:medium; border-style:solid;line-height:normal;line-height:normal;float:left;top:-500px;"&gt;&lt;tr&gt;&lt;td style='background:lightgrey;vertical-align:top;'&gt;Chris Tavares' &lt;a href="http://msdn.microsoft.com/en-au/magazine/cc337884.aspx" target="20090426"&gt;Building Web Apps without Web Forms&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Chris explains the MVC concepts and in the process builds a simple wiki-like tool - great because it is a more 'real life application' type example than you'll see elsewhere.&lt;br /&gt;&lt;img src="http://i.msdn.microsoft.com/cc337884.fig01(en-us).gif" width="200" height="251" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='background:lightgrey;vertical-align:top;'&gt;Rob Conory on why &lt;a href="http://blog.wekeroad.com/blog/i-spose-ill-just-say-it-you-should-learn-mvc/" target="20090426"&gt;You Should Learn MVC&lt;/a&gt;&lt;/td&gt;&lt;/td&gt;&lt;td&gt;Rob Conery's well-thought-out argument for giving ASP.NET MVC is a great read, with some classic quotes such as:&lt;blockquote&gt;WebForms is a lie. It’s abstraction wrapped in deception covered in lie sauce presented on a plate full of diversion and sleight of hand. Nothing you do with Webforms has anything to do with the web – you let it do the work for you.&lt;br /&gt;This, friends, is a big deal (at least to me): You’re working in a lie. The web is *not* stateful and works with this stuff called HTML sent across wires using another thing called HTTP – you need to know this, love this, and feel it at the bone level.&lt;/blockquote&gt;He provides seven excellent &lt;i&gt;reasons&lt;/i&gt; to back up his assertion (I'm paraphrasing the headings here, you should &lt;a href="http://blog.wekeroad.com/blog/i-spose-ill-just-say-it-you-should-learn-mvc/" target="20090426"&gt;read the original text&lt;/a&gt;):&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Testability - yes, automated testing can be conducted much closer to your 'ui surface' without needing &lt;i&gt;actual&lt;/i&gt; ui automation (ala &lt;a href="http://watin.sourceforge.net/" target="20090426"&gt;WatiN&lt;/a&gt; et al)&lt;/li&gt;&lt;li&gt;Control over Html - no 'funky' &lt;code&gt;id&lt;/code&gt; munging or VIEWSTATE!&lt;/li&gt;&lt;li&gt;Extensibility (my favourite so far - the &lt;a href="http://dev.dejardin.org/" target="20090426"&gt;Spark View Engine&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Makes you think - and that's a good thing :)&lt;/li&gt;&lt;li&gt;Javascript has 'come of age'&lt;/li&gt;&lt;li&gt;Learn new concepts - what are those &lt;a href="http://altdotnet.org/"&gt;ALT.NET&lt;/a&gt; guys on about, anyway?&lt;/li&gt;&lt;li&gt;It's fun!&lt;/li&gt;&lt;/ol&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='background:lightgrey;vertical-align:top;'&gt;Jeremy D. Miller's &lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2009/04/24/my-quick-oversimplified-asp-net-mvc-pros-and-cons.aspx" target="20090426"&gt;Oversimplified ASP.Net MVC Pros and Cons&lt;/a&gt;&lt;/td&gt;&lt;td&gt;To sum up:&lt;ul&gt;&lt;li&gt;CON: ASP.NET MVC is a 'version 1' product - so be warned&lt;/li&gt;&lt;li&gt;PRO: It's easy to customize and extend, to get around point #1&lt;/li&gt;&lt;/ul&gt;Simple eh?&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='background:lightgrey;vertical-align:top;'&gt;The Book&lt;br /&gt;&lt;a href="http://tinyurl.com/aspnetmvc" target="20090426"&gt;Professional ASP.NET MVC 1.0&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Written by the "fantastic four" (&lt;a href="http://blog.wekeroad.com/" target="20090426"&gt;Rob Conery&lt;/a&gt;, &lt;a href="http://www.hanselman.com/blog/" target="20090426"&gt;Scott Hanselman&lt;/a&gt;, &lt;a href="http://haacked.com/" target="20090426"&gt;Phil Haack&lt;/a&gt;, &lt;a href="http://weblogs.asp.net/scottgu/" target="20090426"&gt;Scott Guthrie&lt;/a&gt;), I can only imagine it's a good read since I haven't bought it (yet)...&lt;br /&gt;However, the &lt;a href="http://aspnetmvcbook.s3.amazonaws.com/aspnetmvc-nerdinner_v1.pdf"&gt;first chapter by Scottgu(180+ pages) is a free download!&lt;/a&gt;, and you can view the sample app - &lt;a href="http://www.nerddinner.com/"&gt;nerddinner.com&lt;/a&gt; and download the code.  &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='background:lightgrey;vertical-align:top;'&gt;&lt;a href="http://odetocode.com/blogs/scott" target="20090426"&gt;K. Scott Allen&lt;/a&gt;'s MSDN article &lt;a href="http://msdn.microsoft.com/en-us/magazine/dd695917.aspx" target="20090426"&gt;Life And Times of an ASP.NET MVC Controller&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Introduces Routing, Controllers, Action/ActionResult and Helpers. &lt;br /&gt;&lt;img src="http://i.msdn.microsoft.com/dd695917.fig02(en-us).gif" with="200" height="127" /&gt;&lt;br /&gt;AND &lt;a href="http://odetocode.com/Blogs/scott/archive/2009/04/27/12788.aspx"&gt;6 Tips for MVC Model Binding (and validation)&lt;/a&gt; - a hidden gem in the MVC framework!&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='background:lightgrey;vertical-align:top;'&gt;&lt;a href="http://rhysc.blogspot.com/2009/04/models-inc.html" target="20090426"&gt;Models inc&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Slightly OT for a pure MVC post - applies to &lt;a href="http://conceptdev.blogspot.com/2009/02/silverlight-model-view-viewmodel-mvvm.html" target="20090426"&gt;MVVM&lt;/a&gt; or any of the related patterns really - but I agree with the premise: Keep your system/tier/layer/whatever boundaries simple (DTOs) and &lt;blockquote&gt;if there is more application specific needs than a simple DTO can provide, then create an Application Model&lt;/blockquote&gt;I guess that kinda leads into this discussion on &lt;a href="http://stephenwalther.com/blog/archive/2009/04/13/asp.net-mvc-tip-50-ndash-create-view-models.aspx"&gt;creating View Models in MVC&lt;/a&gt; - I wondered about the "&lt;code&gt;IEnumerable&lt;/code&gt; as the &lt;code&gt;Model&lt;/code&gt; Type" in NerdDinner - Stephen discusses a 'proper' ViewModel approach too (see Listing 5 and 6 - although I'm not sure I'd put it in &lt;code&gt;*Controller.cs&lt;/code&gt; necessarily).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='background:lightgrey;vertical-align:top;'&gt;Los Techies' Jimmy Bogard's &lt;a href="http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/04/24/how-we-do-mvc.aspx" target="20090426"&gt;How we do MVC&lt;/a&gt;&lt;/td&gt;&lt;td&gt;The 'voice of experience' from 9 months of MVC, including advice like:&lt;ul&gt;&lt;li&gt;Thin (not FAT) Controllers&lt;/li&gt;&lt;li&gt;Strongly-typed views, and &lt;i&gt;discouraging the dictionary part of ViewData&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Distinct ViewModels (seperate from the domain)&lt;/li&gt;&lt;li&gt;No magic strings&lt;/li&gt;&lt;li&gt;receive the EditModel as an action parameter, not some collection object&lt;/li&gt;&lt;li&gt;and my favourite advice:&lt;ul&gt;&lt;li&gt;Use partials when you have common markup, and the data is in your top-level ViewModel object.&lt;/li&gt;&lt;li&gt;Use RenderAction when you have common markup, but the information is orthogonal to the main concern of your view.  Think like the "login widget" at the top of every screen.  A filter is too much indirection for that scenario, RenderAction is very explicit.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Also links to &lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2008/10/23/our-opinions-on-the-asp-net-mvc-introducing-the-thunderdome-principle.aspx" target="20090426"&gt;Jeremy D. Miller's "Opinions" on MVC&lt;/a&gt; which is full of more sage advice!&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='background:lightgrey;vertical-align:top;'&gt;&lt;a href="http://www.asp.net/mvc" target="20090426"&gt;ASP.NET MVC - the website&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Microsoft's 'official' MVC home page - &lt;a href="http://go.microsoft.com/fwlink/?LinkId=144444" target="20090426"&gt;download the bits&lt;/a&gt;, watch videos, download templates, download sample applications and link to many more useful blog posts than described above!&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='background:lightgrey;vertical-align:top;'&gt;Videos&lt;/td&gt;&lt;td&gt;From &lt;a href="http://weblogs.asp.net/scottgu/archive/2009/04/01/asp-net-mvc-1-0.aspx" target="20090426"&gt;Scottgu&lt;/a&gt;:&lt;ul&gt;&lt;li&gt;&lt;a href="http://videos.visitmix.com/MIX09/T49F" target="20090426"&gt;File|New &amp;rarr; Company: Creating NerdDinner.com with ASP.NET MVC&lt;/a&gt; - watch an MVC app built from scratch&lt;/li&gt;&lt;li&gt;&lt;a href="http://videos.visitmix.com/MIX09/T50F" target="20090426"&gt;ASP.NET MVC: Overview&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://videos.visitmix.com/MIX09/T44F" target="20090426"&gt;ASP.NET MVC: Ninja Black Belt Tips&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='background:lightgrey;vertical-align:top;'&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd394709.aspx" target="20090426"&gt;MSDN documentation&lt;/a&gt;&lt;/td&gt;&lt;td&gt;If you must...&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='background:lightgrey;vertical-align:top;'&gt;&lt;a href="http://blog.codeville.net/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/" target="20090426"&gt;Prevent Cross-Site Request Forgery (CSRF) using ASP.NET MVC’s AntiForgeryToken() helper&lt;/a&gt;&lt;/td&gt;&lt;td&gt;This is a 'specific feature' unlike many of the above links, but an important one IMO...&lt;blockquote&gt;Your application can be vulnerable to cross-site request forgery (CSRF) attacks not because you the developer did something wrong (as in, failing to encode outputs leads to XSS), but simply because of how the whole Web is designed to work.&lt;/blockquote&gt;ALL developers of internet-accessible websites should be making themselves familiar with XSS/CSRF: how they work and how to protect against them. If this feature makes that easier/simpler using MVC... then that's probably another reason to &lt;i&gt;use&lt;/i&gt; MVC!&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style='background:lightgrey;vertical-align:top;'&gt;Check out Stephen Walther's draft &lt;a href="http://stephenwalther.com/blog/category/11.aspx" target="20090426"&gt;ASP.NET MVC Framework Unleashed&lt;/a&gt; book&lt;/td&gt;&lt;td&gt;Read the great draft chapters &lt;a href="http://stephenwalther.com/blog/Default.aspx" target="20090426"&gt;Stephen&lt;/a&gt; has generously posted on his blog, provide feedback and then buy the book!&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;UPDATED:&lt;/b&gt; Added &lt;a href="http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/04/24/how-we-do-mvc.aspx" target="20090426"&gt;How we MVC&lt;/a&gt; and &lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2008/10/23/our-opinions-on-the-asp-net-mvc-introducing-the-thunderdome-principle.aspx" target="20090426"&gt;MVC Thunderdome Principle&lt;/a&gt;. Both provide &lt;i&gt;exactly&lt;/i&gt; the kind of real-world 'lessons learned' that I want to read before starting an MVC project - to know that others have experienced real-world problems, found real-world (and neat) solutions, and shared them. Now I'm free to go and make my own &lt;i&gt;new&lt;/i&gt; mistakes :)&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;UPDATED:&lt;/b&gt; &lt;a href="http://jeffreypalermo.com/blog/you-should-not-use-asp.net-mvc-if/" target="20090426"&gt;You should NOT use ASP.NET MVC if...&lt;/a&gt; lists some reasons why MVC may not be for you: "You rely on 3rd party vendor controls for lots of the UI" is a good one which may not be 'immediately obvious' to those looking at MVC for the first time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-2519494099445058790?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/2519494099445058790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/04/aspnet-model-view-controller-mvc.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/2519494099445058790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/2519494099445058790'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/04/aspnet-model-view-controller-mvc.html' title='ASP.NET Model View Controller (MVC)'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-1449394714844755933</id><published>2009-04-18T12:17:00.006+10:00</published><updated>2009-04-19T21:12:26.864+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='silverlight3'/><category scheme='http://www.blogger.com/atom/ns#' term='deepzoom'/><title type='text'>Silverlight 3.0 PlaneProjection (with DeepZoom)</title><content type='html'>I previously built a &lt;a href="http://conceptdev.blogspot.com/2009/03/silverlight-virtualearth-map-control-in.html" target="20090418"&gt;rather gratuitous PlaneProjection demo&lt;/a&gt; flipping around a &lt;a href="https://sharepoint.connect.microsoft.com/silverlightmapcontrolctp/iSDK/default.htm?wa=wsignin1.0"&gt;Silverlight Map Control&lt;/a&gt;. A slightly more useful (or at least interesting) use of Silverlight 3.0 &lt;code&gt;PlaneProjection&lt;/code&gt; is this &lt;a href="http://conceptdevelopment.net/Silverlight3/DeepZoom01/Default.html" target="20090418"&gt;Deep Zoom 'tile pyramid visualizer'&lt;/a&gt;...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://conceptdevelopment.net/Silverlight3/DeepZoom01/Default.html" target="20090418"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 351px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/Sek55GAhO-I/AAAAAAAAA4s/tvt7dT9VnCY/s400/deepzoomtilepyramid-blog.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5325851687370439650" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/Sek55GAhO-I/AAAAAAAAA4s/tvt7dT9VnCY/s1600-h/deepzoomtilepyramid-blog.png" style="font-size:8px" target="20090418"&gt;[fullsize image]&lt;/a&gt; &lt;a href="http://conceptdevelopment.net/Silverlight3/DeepZoom01/Default.html" target="20090418" style="font-size:8px"&gt;[try it out]&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Rather than just play around with the &lt;code&gt;RotationX&lt;/code&gt; and &lt;code&gt;RotationY&lt;/code&gt; properties, &lt;ul&gt;&lt;li&gt;&lt;code&gt;GlobalOffsetZ&lt;/code&gt; is used to 'push back' the larger images to sit 'behind' the smaller, foremost image&lt;/li&gt;&lt;li&gt;&lt;code&gt;CenterOfRotation&lt;/code&gt; is set to &lt;code&gt;GlobalOffsetZ * -1&lt;/code&gt; so that all the images rotate around the same point&lt;/li&gt;&lt;li&gt;&lt;code&gt;RotationY&lt;/code&gt; is then used to rotate them all together&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Here are some diagrams to explain what that all means:&lt;br /&gt;&lt;br /&gt;Firstly, each 'layer' in a Deep Zoom image is double the the size of the previous one (height/width) so when they three layers are rendered on top of each other, you can clearly see the size differences:&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/SelBQwAXe9I/AAAAAAAAA40/eiqP2IUhDlw/s1600-h/PlaneProjection-0.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 299px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/SelBQwAXe9I/AAAAAAAAA40/eiqP2IUhDlw/s400/PlaneProjection-0.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5325859790362475474" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;However when we apply the &lt;code&gt;PlaneProjection&lt;/code&gt; to move the larger images along the &lt;b&gt;Z axis&lt;/b&gt; (ie. in/out of the page) we can create the effect that all three images are the 'same size'. &lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/SelBRVMl0OI/AAAAAAAAA48/o58QhZeeYeo/s1600-h/PlaneProjection-1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 243px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/SelBRVMl0OI/AAAAAAAAA48/o58QhZeeYeo/s400/PlaneProjection-1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5325859800345858274" /&gt;&lt;/a&gt;&lt;br /&gt;Altering the &lt;code&gt;PlaneProjection&lt;/code&gt; attributes listed about let's us zoom and rotate the pyramid to get a totally useless but kinda cool looking view of a Deep Zoom tile pyramid...&lt;br /&gt;&lt;br /&gt;&lt;b style='color:darkred'&gt;UPDATE:&lt;/b&gt; For those without Silverlight 3.0 installed, I've recorded (my first!) &lt;a href="http://conceptdevelopment.net/Silverlight3/DeepZoom01/" target="20090419"&gt;screencast demo&lt;/a&gt; (sorry it's in Flash - something to figure out another time...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-1449394714844755933?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/1449394714844755933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/04/silverlight-30-planeprojection.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/1449394714844755933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/1449394714844755933'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/04/silverlight-30-planeprojection.html' title='Silverlight 3.0 PlaneProjection (with DeepZoom)'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Ba76y6K7kvs/Sek55GAhO-I/AAAAAAAAA4s/tvt7dT9VnCY/s72-c/deepzoomtilepyramid-blog.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-3467282454644156808</id><published>2009-04-16T19:07:00.004+10:00</published><updated>2009-04-16T19:57:13.550+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>Re-blog: C# 4.0 feature focus (recommended)</title><content type='html'>Of all the blogs I follow, the one I most often 'bookmark and re-read' is probably &lt;a href="http://community.bartdesmet.net/blogs/bart/default.aspx"&gt;Bart De Smet's&lt;/a&gt; (ok, &lt;a href="http://weblogs.asp.net/scottgu/" target="20090416"&gt;Scottgu&lt;/a&gt; too).&lt;br /&gt;&lt;br /&gt;I think I first started following Bart in 2006 when I was learning about &lt;a href="http://community.bartdesmet.net/blogs/bart/archive/2006/07/04/4115.aspx" target="20090416"&gt;LINQ - A custom implementation of the .NET Standard Query Operators&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;However it was this recent post on &lt;a href="http://community.bartdesmet.net/blogs/bart/archive/2009/04/13/c-4-0-feature-focus-part-4-generic-co-and-contra-variance-for-delegate-and-interface-types.aspx" target="20090416"&gt;C# 4.0: Co- and Contra-Variance for Generic Delegate and Interface Types&lt;/a&gt; that prompted this 'recommendation'. It's a perfect example of what I like about many of his posts - I learned a lot! Some of the '3.0 examples' he mentions are just the sort of thing I've noticed, wondered about and worked around before: but Bart provides the "language" and "reasoning" that explains &lt;i&gt;why&lt;/i&gt;... sure I've probably heard the terms co- and contra-variance before, and I can understand at some 'high level' why &lt;br /&gt;&lt;code&gt;IEnumerable&amp;lt;Person&amp;gt; people = from Student s in db.Students&lt;br /&gt;                             where s.Age &amp;lt;= 25&lt;br /&gt;                             select s;&lt;/code&gt;&lt;br /&gt;doesn't (currently) work, but Bart's discussion and examples feel just like the 'developer watercooler' type conversation that might take place amongst developers at work - and suddenly I understand the concepts a lot better.&lt;br /&gt;&lt;br /&gt;I enjoy reading (and re-reading, just to fully understand them!) Bart's posts, and &lt;a href="http://community.bartdesmet.net/blogs/bart/default.aspx"&gt;highly recommend them&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-3467282454644156808?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/3467282454644156808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/04/re-blog-c-40-feature-focus-recommended.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/3467282454644156808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/3467282454644156808'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/04/re-blog-c-40-feature-focus-recommended.html' title='Re-blog: C# 4.0 feature focus (recommended)'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-7826087317592677499</id><published>2009-04-14T20:39:00.007+10:00</published><updated>2009-04-14T21:27:24.901+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wtf'/><title type='text'>Worst ecommerce website ever MkII</title><content type='html'>I &lt;a href="http://conceptdev.blogspot.com/2008/05/img-big-company-worst-website-ever.html" target="20090414"&gt;blogged&lt;/a&gt; about how bad &lt;a href="http://www.imgecommerce.com/" target="20090414"&gt;IMG Ecommerce's&lt;/a&gt; &lt;a href="https://www.clubsonline.com.au/meetsregform/index.cfm?fuseaction=Display_Event_Registration_Step1&amp;amp;MeetID=382&amp;amp;OrgID=52&amp;amp;cfid=31487565&amp;amp;cftoken=80689058&amp;amp;dts=144200915840" target="20090414"&gt;Events Online&lt;/a&gt; ecommerce website was &lt;a href="http://conceptdev.blogspot.com/2008/05/img-big-company-worst-website-ever.html" target="20090414"&gt;last year&lt;/a&gt;. It was therefore with some dismay that I had reason to use the same website again, and to find it just as bad one year on.&lt;br /&gt;&lt;br /&gt;It starts off poorly with some truly poor UI design: a button group with no default and poor names:&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/SeRsF59JkRI/AAAAAAAAA38/QtO2pm8-LjQ/s1600-h/01.png"&gt;&lt;img style="WIDTH: 320px; HEIGHT: 153px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5324499508171215122" border="0" alt="" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/SeRsF59JkRI/AAAAAAAAA38/QtO2pm8-LjQ/s320/01.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;progressing to bad/incomplete user feedback&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/SeRsGESTxdI/AAAAAAAAA4E/wurzCACpvWQ/s1600-h/02.png"&gt;&lt;img style="WIDTH: 320px; HEIGHT: 240px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5324499510944318930" border="0" alt="" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/SeRsGESTxdI/AAAAAAAAA4E/wurzCACpvWQ/s320/02.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;awful button layout (and one-question-per-form dragging out the process)&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/SeRsGOFATMI/AAAAAAAAA4M/6_CZdyMFh5U/s1600-h/03.png"&gt;&lt;img style="WIDTH: 320px; HEIGHT: 310px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5324499513572871362" border="0" alt="" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/SeRsGOFATMI/AAAAAAAAA4M/6_CZdyMFh5U/s320/03.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;only the breadcrumb gives a hint of what to do here&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/SeRsGciD6ZI/AAAAAAAAA4U/Xc6Lpip9Jiw/s1600-h/04.png"&gt;&lt;img style="WIDTH: 320px; HEIGHT: 172px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5324499517452839314" border="0" alt="" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/SeRsGciD6ZI/AAAAAAAAA4U/Xc6Lpip9Jiw/s320/04.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and the piece-de-resistance: TWO buttons labelled &lt;b&gt;Payment&lt;/b&gt;!&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/SeRsGdvcfEI/AAAAAAAAA4c/HVLWVliwgFE/s1600-h/05.png"&gt;&lt;img style="WIDTH: 320px; HEIGHT: 242px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5324499517777411138" border="0" alt="" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/SeRsGdvcfEI/AAAAAAAAA4c/HVLWVliwgFE/s320/05.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What a joke of a website from &lt;a href="http://www.imgworld.com/about/default.sps" target="20090414"&gt;IMG&lt;/a&gt; "the world's premier and most diversified sports, entertainment and media company".&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Runner Up...&lt;/h3&gt;A close second in the abysmal ecommerce website stakes is the &lt;a href="https://www.rasnsw.com.au/eShop/eShopPlaceOrders.aspx?ps=RES%20Tickets&amp;pc=&amp;src=&amp;sk=12&amp;ph=YES" target="2090414"&gt;Easter Show online ticketing site&lt;/a&gt;.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/SeRv62MgjsI/AAAAAAAAA4k/JJCY-1i2JN8/s1600-h/10.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 351px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/SeRv62MgjsI/AAAAAAAAA4k/JJCY-1i2JN8/s400/10.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5324503716229844674" /&gt;&lt;/a&gt;&lt;br /&gt;Lowlights include:&lt;ul&gt;&lt;li&gt;you must type in a quantity AND PRESS &lt;b&gt;PURCHASE&lt;/b&gt; - but that just updates the quantity (it doesn't actually purchase)&lt;/li&gt;&lt;li&gt;you must press COMPLETE ORDER when you are done. But if you enter a number in any box and press COMPLETE ORDER it will not recognise that input (back to step 1).&lt;/li&gt;&lt;li&gt;note the instructions at the bottom, which might as well say "DO NOT USE YOUR WEB BROWSER THE WAY YOU ALWAYS HAVE FOR EVERY OTHER WEBSITE EVER, or it'll be your fault when your order is screwed up"!&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;How do these things make it through user testing?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-7826087317592677499?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/7826087317592677499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/04/worst-ecommerce-website-ever-mkii.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/7826087317592677499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/7826087317592677499'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/04/worst-ecommerce-website-ever-mkii.html' title='Worst ecommerce website ever MkII'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Ba76y6K7kvs/SeRsF59JkRI/AAAAAAAAA38/QtO2pm8-LjQ/s72-c/01.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-8448513502264219098</id><published>2009-04-07T20:43:00.005+10:00</published><updated>2009-04-07T21:40:24.682+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maps'/><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><title type='text'>Polyline.StrokeLineJoin and tight corners</title><content type='html'>Sharp corners in &lt;code&gt;Polyline&lt;/code&gt;s (particularly &lt;b&gt;thick&lt;/b&gt; ones) can create unintended artefacts - particularly apparent when converting a (somewhat shaky) GPS track into a line on the Silverlight VE Map Control.&lt;br /&gt;&lt;br /&gt;In this screenshot the circled 'line extension' (leading off into the water) is not actually part of the path, but an artefact of a very tight corner:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SdsxRCh7nvI/AAAAAAAAA3o/BZqEHWr_tMc/s1600-h/SharpCorners.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 270px; height: 320px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SdsxRCh7nvI/AAAAAAAAA3o/BZqEHWr_tMc/s320/SharpCorners.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5321901553475100402" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A few simple additions - &lt;b&gt;StrokeLineJoin&lt;/b&gt; being the most important - and the &lt;code&gt;Path&lt;/code&gt; looks "correct":&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;lt;m:MapPolyline &lt;br /&gt;Stroke="Blue" StrokeThickness="10" x:Name="Course"&lt;br /&gt;&lt;b&gt;StrokeLineJoin="Round"&lt;br /&gt;StrokeEndLineCap="Round"&lt;br /&gt;StrokeStartLineCap="Round"&lt;/b&gt;&lt;br /&gt;Locations="-33.84780366140732,151.21159315109253 &lt;nobr&gt;-33.84504135759562&lt;/nobr&gt;,151.2111210823059 &lt;nobr&gt;-33.84418591636912&lt;/nobr&gt;,151.2106704711914 &lt;nobr&gt;-33.84374037067171&lt;/nobr&gt;,151.21082067489624...&lt;br /&gt;/&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SdsxRhuZPNI/AAAAAAAAA3w/cB331YsoT9s/s1600-h/SmoothCorners.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 270px; height: 320px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SdsxRhuZPNI/AAAAAAAAA3w/cB331YsoT9s/s320/SmoothCorners.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5321901561848872146" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Just something to be aware of...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-8448513502264219098?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/8448513502264219098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/04/polylinestrokelinejoin-and-tight.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/8448513502264219098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/8448513502264219098'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/04/polylinestrokelinejoin-and-tight.html' title='Polyline.StrokeLineJoin and tight corners'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Ba76y6K7kvs/SdsxRCh7nvI/AAAAAAAAA3o/BZqEHWr_tMc/s72-c/SharpCorners.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-7603208352291536279</id><published>2009-04-06T20:31:00.003+10:00</published><updated>2009-04-06T20:56:52.401+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>*.MDF' cannot be opened because it is version 655. This server supports version 612 and earlier</title><content type='html'>When I'm not playing with Silverlight and Virtual Earth, I've been figuring out &lt;a href="http://asp.net/mvc" target="20090406"&gt;MVC&lt;/a&gt; (thanks to &lt;a href="http://www.hanselman.com/blog/"&gt;Scott&lt;/a&gt;, &lt;a href="http://weblogs.asp.net/scottgu/archive/2009/04/01/asp-net-mvc-1-0.aspx"&gt;Scott&lt;/a&gt; and &lt;a href="http://haacked.com/"&gt;Phil&lt;/a&gt;). However pretty early on I hit a weird error in Visual Studio 2008 when trying to 'open' a database via the &lt;b&gt;Server Explorer&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;The database 'C:\SOME\FOLDER\MYDATABASE.MDF' cannot be opened because it is version 655. This server supports version 612 and earlier. A downgrade path is not supported.&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Background&lt;/h3&gt;I had &lt;i&gt;created&lt;/i&gt; that database in Visual Studio 2008 (File &amp;rarr; Add New Item &amp;rarr; SQL Server Database) and now it wouldn't let me open it!&lt;br /&gt;&lt;br /&gt;What I &lt;i&gt;had&lt;/i&gt; done is opened, edited and closed the database file using SQL Server 2008 Management Studio. Shouldn't be a problem, right, since I'm also using Visual Studio 2008?&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The Problem&lt;/h3&gt;Well, although I currently have SQL Server 2008 installed, I &lt;i&gt;also&lt;/i&gt; have SQL Server 2005 (which was installed with Visual Studio 2008 originally). When I created the database originally I just &lt;i&gt;assumed&lt;/i&gt; it was a SQL Server 2008 database - but it wasn't (it was 2005)!&lt;br /&gt;&lt;br /&gt;Turns out that when you are create or open a &lt;i&gt;file-based (.MDF) database&lt;/i&gt; (as opposed to using a database instance or server connection) Visual Studio needs some 'help' knowing what tools to use.&lt;br /&gt;&lt;br /&gt;When I edited the *.MDF file in SQL Server 2008, it made some fundamental "changes" to the file (even though I didn't 'upgrade' it) which prevented SQL Server 2005 from opening it. Why was Visual Studio 2008 confused? It's a configuration setting!&lt;br /&gt;&lt;br /&gt;To fix the problem, go to &lt;b&gt;Tools &amp;rarr; Options...  &amp;rarr; Database Tools &amp;rarr; Data Connections&lt;/b&gt; and change the &lt;b&gt;SQL Server Instance Name&lt;/b&gt; from whatever it &lt;i&gt;was&lt;/i&gt; (probably a SQL Server 2005 instance) to your SQL Server 2008 instance, hit OK and you should be fine!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/Sdnen59pqUI/AAAAAAAAA3Y/9X2NfR3hCAY/s1600-h/01-toolsoptions.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 257px; height: 400px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/Sdnen59pqUI/AAAAAAAAA3Y/9X2NfR3hCAY/s400/01-toolsoptions.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5321529211870619970" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/Sdnen6cVI7I/AAAAAAAAA3g/X36aUkxXvuQ/s1600-h/Databaseoptions.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 231px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/Sdnen6cVI7I/AAAAAAAAA3g/X36aUkxXvuQ/s400/Databaseoptions.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5321529211999298482" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Thanks to &lt;a href="http://www.simple-talk.com/community/forums/thread/70009.aspx" target="20090406"&gt;simple-talk&lt;/a&gt;; and &lt;a href="http://forums.asp.net/p/1349092/2750485.aspx" target="20090406"&gt;SQL 2008 Express edition error&lt;/a&gt;/&lt;a href="http://forums.asp.net/t/1315279.aspx" target="20090406"&gt;Add new item&lt;/a&gt; on ASP.NET forms. A bit OT - HTH someone...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-7603208352291536279?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/7603208352291536279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/04/mdf-cannot-be-opened-because-it-is.html#comment-form' title='24 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/7603208352291536279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/7603208352291536279'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/04/mdf-cannot-be-opened-because-it-is.html' title='*.MDF&apos; cannot be opened because it is version 655. This server supports version 612 and earlier'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Ba76y6K7kvs/Sdnen59pqUI/AAAAAAAAA3Y/9X2NfR3hCAY/s72-c/01-toolsoptions.png' height='72' width='72'/><thr:total>24</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-4812154409809181043</id><published>2009-04-06T20:18:00.006+10:00</published><updated>2009-04-06T20:29:49.496+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maps'/><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualearth'/><category scheme='http://www.blogger.com/atom/ns#' term='youtube'/><category scheme='http://www.blogger.com/atom/ns#' term='running'/><title type='text'>Silverlight VirtualEarth Map Control - with video</title><content type='html'>Okay - I wasn't going to do any more Silverlight VE Map Control posts... this is definitely the last one! I found some videos on YouTube that I thought suited 'animating' a map so I gave it a try. These would work MUCH BETTER if I had Silverlight-encoded videos that I could sync to/control more easily: but you get the idea...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://conceptdevelopment.net/Silverlight/VEMap07/default.html" target="20090406"&gt;Sydney City2Surf&lt;/a&gt;&lt;br /&gt;&lt;!--a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/SdnX7eUKq_I/AAAAAAAAA3Q/sH3t6JUBZw0/s1600-h/City2SurfVideo.png"--&gt;&lt;a href="http://conceptdevelopment.net/Silverlight/VEMap07/default.html" target="20090406"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 207px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/SdnX7eUKq_I/AAAAAAAAA3Q/sH3t6JUBZw0/s320/City2SurfVideo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5321521851464854514" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://conceptdevelopment.net/Silverlight/VEMap06/default.html" target="20090406"&gt;Sydney Marathon&lt;/a&gt;&lt;br /&gt;&lt;!--a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/SdnX7WUgk7I/AAAAAAAAA3I/2LhfjCqLAfk/s1600-h/BlackmoresMarathonVideo.png"--&gt;&lt;a href="http://conceptdevelopment.net/Silverlight/VEMap06/default.html" target="20090406"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 208px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/SdnX7WUgk7I/AAAAAAAAA3I/2LhfjCqLAfk/s320/BlackmoresMarathonVideo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5321521849318806450" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;p.s. YES I know it's dodgy to have to 'sync' the start of each element manually - but without lots of hassle figuring out if the YouTube video is loaded and running it was the easiest way to proof-of-concept...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-4812154409809181043?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/4812154409809181043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/04/silverlight-virtualearth-map-control_06.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/4812154409809181043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/4812154409809181043'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/04/silverlight-virtualearth-map-control_06.html' title='Silverlight VirtualEarth Map Control - with video'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Ba76y6K7kvs/SdnX7eUKq_I/AAAAAAAAA3Q/sH3t6JUBZw0/s72-c/City2SurfVideo.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-2078406366667936806</id><published>2009-04-03T20:27:00.005+11:00</published><updated>2009-04-03T20:42:56.652+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Script diagrams using SQL Server 2008</title><content type='html'>Originally this script was &lt;a href="http://conceptdevelopment.net/Database/ScriptDiagram2008/" target="20090403"&gt;ScriptDiagram2005&lt;/a&gt; (on &lt;a href="http://www.codeproject.com/KB/database/ScriptDiagram2005.aspx"&gt;CodeProject&lt;/a&gt;), based on a SQL Server 2000 version by Clay Beatty.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ba76y6K7kvs/SdXYP9t_sfI/AAAAAAAAA3A/l4DAraexyGk/s1600-h/00_intro.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 166px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/SdXYP9t_sfI/AAAAAAAAA3A/l4DAraexyGk/s320/00_intro.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5320396303585227250" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I had already tested the '2005' version on "Katmai" betas of SQL Server 2008 and it worked fine, so I hadn't bothered to update the script until I read&lt;br /&gt;&lt;a href="http://www.sqlservercentral.com/Forums/Topic664234-1496-1.aspx" target="20090403" target="20090403"&gt;this thread (requires login)&lt;/a&gt; and learned of the built-in &lt;code&gt;sys.fn_varbintohexstr&lt;/code&gt; function.&lt;br /&gt;&lt;br /&gt;This made the previous custom function &lt;code&gt;Tool_VarbinaryToVarcharHex&lt;/code&gt; redundant, so I have updated the code to &lt;a href="http://conceptdevelopment.net/Database/ScriptDiagram2008/" target="20090403"&gt;ScriptDiagram2008&lt;/a&gt;. There isn't really any code to download - just &lt;a href="http://conceptdevelopment.net/Database/ScriptDiagram2008/ScriptDiagram2008.sql.html" target="20090403"&gt;view the script (copy/paste to an .SQL file to apply to your database)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Makes it easy to add your diagrams to source control - still figuring out how to fit it nicely into &lt;a href="http://blogs.msdn.com/gertd/archive/2008/11/25/visual-studio-team-system-2008-database-edition-gdr-rtm.aspx" target="20090403"&gt;Visual Studio Team System Database Edition GDR&lt;/a&gt;...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-2078406366667936806?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/2078406366667936806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/04/script-diagrams-using-sql-server-2008.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/2078406366667936806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/2078406366667936806'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/04/script-diagrams-using-sql-server-2008.html' title='Script diagrams using SQL Server 2008'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ba76y6K7kvs/SdXYP9t_sfI/AAAAAAAAA3A/l4DAraexyGk/s72-c/00_intro.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-1589185553728882781</id><published>2009-04-01T20:00:00.005+11:00</published><updated>2009-04-01T21:16:07.773+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maps'/><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualearth'/><title type='text'>Silverlight VirtualEarth Map Control - with animation MkII</title><content type='html'>In recent posts I was working to get the new &lt;a href="http://connect.microsoft.com/silverlightmapcontrolctp" target="20090401"&gt;Virtual Earth Silverlight Map Control (CTP)&lt;/a&gt; to:&lt;ol&gt;&lt;li&gt;display (pan/zoom) an &lt;code&gt;&amp;lt;Image&amp;gt;&lt;/code&gt; overlay&lt;/li&gt;&lt;br /&gt;&lt;li&gt;display (pan/zoom) a &lt;code&gt;&amp;lt;Path&amp;gt;&lt;/code&gt; line&lt;/li&gt;&lt;br /&gt;&lt;li&gt;animate a set of &lt;code&gt;&amp;lt;Ellipse&amp;gt;&lt;/code&gt;s that also (pan/zoom)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;animate the map center point to 'track' an &lt;code&gt;&amp;lt;Ellipse&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;div style='padding:5px;background-color:#eeeeee;'&gt;Turns out this was all possible - there are two examples: &lt;a href="http://conceptdevelopment.net/Silverlight/VEMap04/Default.html"&gt;New York Marathon&lt;/a&gt; and &lt;a href="http://conceptdevelopment.net/Silverlight/VEMap05/Default.html"&gt;Sydney Half Marathon&lt;/a&gt;&lt;br /&gt;&lt;!--a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/SdM5xWXEWuI/AAAAAAAAA24/FslF40g8q3c/s1600-h/smh01.png"--&gt;&lt;a href="http://conceptdevelopment.net/Silverlight/VEMap05/Default.html"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 226px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/SdM5xWXEWuI/AAAAAAAAA24/FslF40g8q3c/s320/smh01.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5319659104833395426" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Each problem was overcome as follows:&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;1. Use m:MapLayer.MapRectangle not Height/Width&lt;/h3&gt;Any "pixel-specific" measurements applied to the Image will intefere with your Map layout. &lt;b&gt;DO NOT&lt;/b&gt; specify Height, Width, Canvas.Left, Canvas.Top - just give the NW and SE corners (latitude,longitude) of the geographic region the image should cover, like this:&lt;br /&gt;&lt;code&gt;&amp;lt;Image Source="map.png" m:MapLayer.MapRectangle="40.8325608405556,-74.1015908473376,40.5722860972124,-73.843755459154"...&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;2. Use m:MapPolyline not Path&lt;/h3&gt;Although it was possible to keep the &lt;code&gt;Path&lt;/code&gt; inside a &lt;code&gt;Canvas&lt;/code&gt; element and place it with &lt;code&gt;MapRectangle&lt;/code&gt;, it did not scale well since the &lt;code&gt;Path Data&lt;/code&gt; is effectively tied to pixel coordinates. It is &lt;a href="http://conceptdevelopment.net/Silverlight/VEMap03/Page.xaml.cs.html" target="20090401"&gt;possible to write code to &lt;i&gt;manually scale&lt;/i&gt;&lt;/a&gt; the line, but it was much easier to re-express the line with points specified by Latitude,Longitude in a &lt;code&gt;m:MapPolyline&lt;/code&gt; like this:&lt;br /&gt;&lt;code&gt;&amp;lt;m:MapPolyline Stroke="Red" Locations="-33.863502543277534,151.20294570922852...&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;3. Use m:MapLayer.Position and a custom attached property&lt;/h3&gt;Positioning the &lt;code&gt;Ellipse&lt;/code&gt;s was easy using &lt;code&gt;m:MapLayer.MapPosition&lt;/code&gt;, however animating this property was a little tricky. &lt;code&gt;MapPosition&lt;/code&gt; is of Type &lt;code&gt;Location&lt;/code&gt; but the &lt;code&gt;Latitude&lt;/code&gt; and &lt;code&gt;Longitude&lt;/code&gt; properties are not easily accessible as the &lt;code&gt;TargetProperty&lt;/code&gt; of an animation, so I needed to &lt;a href="http://conceptdevelopment.net/Silverlight/VEMap04/" target="20090401"&gt;write custom attached properties and set them as the target in code&lt;/a&gt;.&lt;br /&gt;&lt;code&gt;&amp;lt;Ellipse Fill="#FFFF0000" Width="11" Height="11" m:MapLayer.MapPosition="-33.863502543277534,151.20294570922852" m:MapLayer.MapPositionMethod="Center"...&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;4. Use m:Map.Center and a custom (hacked) attached property&lt;/h3&gt;Making the Map 'viewport' itself animate proved slightly trickier again. I created another attached property (&lt;a href="http://conceptdevelopment.net/Silverlight/VEMap05/Attachments.cs.html"&gt;code for all properties here&lt;/a&gt;) for some reason only one 'axis' (Longitude) would animate. &lt;br /&gt;&lt;br /&gt;When I removed the Longitude property, &lt;i&gt;then&lt;/i&gt; the Latitude position would animate... but I could not get them both animating together. Figuring it was a timing issue, rather than try to "set" both properties when they Changed, Latitude gets stuffed into a &lt;code&gt;static field&lt;/code&gt; and then set in the LongitudeChanged handler - seems to work but not sure if it's a good idea (obviously it would break if you tried to animate two maps at the same time!)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://conceptdevelopment.net/Silverlight/VEMap05/"&gt;More info&lt;/a&gt; on the final example - no more Map Control posts for a while...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-1589185553728882781?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/1589185553728882781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/04/silverlight-virtualearth-map-control.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/1589185553728882781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/1589185553728882781'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/04/silverlight-virtualearth-map-control.html' title='Silverlight VirtualEarth Map Control - with animation MkII'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Ba76y6K7kvs/SdM5xWXEWuI/AAAAAAAAA24/FslF40g8q3c/s72-c/smh01.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-3307549863293418180</id><published>2009-03-27T21:46:00.004+11:00</published><updated>2009-03-29T14:13:26.223+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maps'/><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualearth'/><title type='text'>Silverlight VirtualEarth Map Control - with animation</title><content type='html'>&lt;div style='background-color:#dddddd;padding:5px;'&gt;&lt;b style='color:darkred'&gt;UPDATE:&lt;/b&gt; The Microsoft devs were right - it &lt;i&gt;is&lt;/i&gt; possible (and not a bug). The &lt;a href="http://conceptdevelopment.net/Silverlight/VEMap04/default.html"&gt;'complete' sample&lt;/a&gt; now keeps the image, course line and animated objects visible during all panning and zooming operations - try out &lt;br /&gt;&lt;b&gt;&lt;a href="http://conceptdevelopment.net/Silverlight/VEMap04/"&gt;animation with Silverlight Virtual Earth Map Control&lt;/a&gt;&lt;/b&gt;!&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;I've made some progress with &lt;a href="http://conceptdev.blogspot.com/2009/03/silverlight-virtualearth-map-control.html"&gt;my first Silverlight Virtual Earth Map Control project&lt;/a&gt;...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://conceptdevelopment.net/Silverlight/VEMap03/Default.html" target="20090327"&gt;&lt;b&gt;Try it out&lt;/b&gt; &lt;span style='color:darkred'&gt;(deprecated)&lt;/span&gt;&lt;/a&gt; &lt;a href="http://conceptdevelopment.net/Silverlight/VEMap04/"&gt;latest&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here are some screenshots of the zoom/animation in action:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/ScyvVdJ46xI/AAAAAAAAA2w/be0Pyu3K-nE/s1600-h/Zoom14.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 158px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/ScyvVdJ46xI/AAAAAAAAA2w/be0Pyu3K-nE/s200/Zoom14.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5317818043155933970" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/ScyvU9gszfI/AAAAAAAAA2o/Qcgl_ZhAo8A/s1600-h/Zoom12.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 158px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/ScyvU9gszfI/AAAAAAAAA2o/Qcgl_ZhAo8A/s200/Zoom12.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5317818034661674482" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/ScyvUENnXJI/AAAAAAAAA2g/dKYsbqhBpxU/s1600-h/Zoom10.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 158px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/ScyvUENnXJI/AAAAAAAAA2g/dKYsbqhBpxU/s200/Zoom10.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5317818019280805010" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://conceptdevelopment.net/Silverlight/VEMap03/Page.xaml.cs.html"&gt;code&lt;/a&gt; and &lt;a href="http://conceptdevelopment.net/Silverlight/VEMap03/Page.xaml.html"&gt;xaml&lt;/a&gt; also online - I needed to (well, I think I needed to) use the &lt;code&gt;ViewChangeEnd&lt;/code&gt; event to re-calculate various offsets and dimensions to keep the animation and overlay image sychronised with the Map Controls' zoom behaviour (even though panning worked without modification).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-3307549863293418180?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/3307549863293418180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/03/silverlight-virtualearth-map-control_27.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/3307549863293418180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/3307549863293418180'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/03/silverlight-virtualearth-map-control_27.html' title='Silverlight VirtualEarth Map Control - with animation'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Ba76y6K7kvs/ScyvVdJ46xI/AAAAAAAAA2w/be0Pyu3K-nE/s72-c/Zoom14.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-84072105035607812</id><published>2009-03-25T22:32:00.005+11:00</published><updated>2009-03-25T22:50:07.451+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='search'/><title type='text'>OpenSearch 'Visual Search'aroo (for IE8)</title><content type='html'>About 6 months ago I added &lt;a href="http://conceptdev.blogspot.com/2008/07/opensearch-in-your-browser.html" target="20090325"&gt;OpenSearch.xml&lt;/a&gt; to &lt;a href="http://www.searcharoo.net"&gt;searcharoo.net&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Now that &lt;a href="http://microsoft.com/ie" target="20090325"&gt;IE8&lt;/a&gt; has been released there is a new &lt;a href="http://blogs.msdn.com/ie/archive/2008/09/18/hello-world-getting-started-with-ie8-visual-search.aspx"&gt;"Visual Search"&lt;/a&gt; feature that can be enabled via &lt;code&gt;opensearch.xml&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;When you visit &lt;a href="http://www.searcharoo.net"&gt;searcharoo.net&lt;/a&gt;, OpenSearch-supporting browsers will provide a visual indicator (eg. this colored arrow) that you can add that site as a Search Provider.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/ScoXCKFBVeI/AAAAAAAAA14/fZwrLtgy2qk/s1600-h/01-how.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 67px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/ScoXCKFBVeI/AAAAAAAAA14/fZwrLtgy2qk/s400/01-how.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5317087635896882658" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Choose to add &lt;b&gt;Searcharoo.net&lt;/b&gt;...&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/ScoXCH33OxI/AAAAAAAAA2A/LeC-DlYBorA/s1600-h/02-add.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 373px; height: 294px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/ScoXCH33OxI/AAAAAAAAA2A/LeC-DlYBorA/s400/02-add.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5317087635304823570" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;...and tick the box that you want to use &lt;b&gt;search suggestions&lt;/b&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/ScoXCcrwSfI/AAAAAAAAA2I/GOHD6cVgX7c/s1600-h/03-permission.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 270px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/ScoXCcrwSfI/AAAAAAAAA2I/GOHD6cVgX7c/s400/03-permission.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5317087640891181554" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Once it is set-up, you will receive real-time feedback/results as you type your search!&lt;br /&gt;&lt;!--a href="http://1.bp.blogspot.com/_Ba76y6K7kvs/ScoXCWPzPsI/AAAAAAAAA2Q/iXZKZuLSAIo/s1600-h/04-livesearch.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 308px; height: 400px;" src="http://1.bp.blogspot.com/_Ba76y6K7kvs/ScoXCWPzPsI/AAAAAAAAA2Q/iXZKZuLSAIo/s400/04-livesearch.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5317087639163322050" /&gt;&lt;/a--&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/ScoZx5BAKGI/AAAAAAAAA2Y/GR9-LioYLaA/s1600-h/05-livesearch.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 239px; height: 400px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/ScoZx5BAKGI/AAAAAAAAA2Y/GR9-LioYLaA/s400/05-livesearch.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5317090654973601890" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I did have some problems implementing it, however. The &lt;a href="http://blogs.msdn.com/ie/archive/2008/09/18/hello-world-getting-started-with-ie8-visual-search.aspx"&gt;original post I saw&lt;/a&gt; was using a beta, and the latest documentation &lt;a href="http://msdn.microsoft.com/en-us/library/cc848862(VS.85).aspx"&gt;Search Provider Extensibility in Internet Explorer&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/cc848863.aspx"&gt;XML Search Suggestions Format Specification&lt;/a&gt; shows the XML required is slightly different.&lt;br /&gt;&lt;br /&gt;This was the &lt;b&gt;opensearch.xml&lt;/b&gt; file that actually worked for me:&lt;br /&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/" xmlns:ie="http://schemas.microsoft.com/Search/2008/"&amp;gt;&lt;br /&gt;  &amp;lt;ShortName&amp;gt;Searcharoo.net&amp;lt;/ShortName&amp;gt;&lt;br /&gt;  &amp;lt;Image height="16" width="16" type="image/icon"&amp;gt;http://www.searcharoo.net/favicon.ico&amp;lt;/Image&amp;gt;&lt;br /&gt;  &amp;lt;Url type="text/html" template="http://www.searcharoo.net/Search.aspx?searchfor={searchTerms}"/&amp;gt;&lt;br /&gt;  &amp;lt;Url type="application/x-suggestions+xml" template="http://www.searcharoo.net/SearchSuggest.aspx?searchfor={searchTerms}"/&amp;gt;&lt;br /&gt;  &amp;lt;ie:PreviewUrl type="text/html" template="http://www.searcharoo.net/SearchSuggest.aspx?searchfor={searchTerms}"/&amp;gt;&lt;br /&gt;&amp;lt;/OpenSearchDescription&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;with the following added to the &lt;code&gt;.master&lt;/code&gt; page&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;lt;link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="Searcharoo.net"&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I'm still working on improving the output of the search, but you can view it's response to the browser using this URL - &lt;a href="http://www.searcharoo.net/SearchSuggest.aspx?searchfor=manhattan"&gt;http://www.searcharoo.net/SearchSuggest.aspx?searchfor=manhattan&lt;/a&gt; (note the addition of &lt;code&gt;xmlns&lt;/code&gt;). The XML also supports image/previews, so Searcharoo will need another upgrade to support that too..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-84072105035607812?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/84072105035607812/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/03/opensearch-visual-searcharoo-for-ie8.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/84072105035607812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/84072105035607812'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/03/opensearch-visual-searcharoo-for-ie8.html' title='OpenSearch &apos;Visual Search&apos;aroo (for IE8)'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ba76y6K7kvs/ScoXCKFBVeI/AAAAAAAAA14/fZwrLtgy2qk/s72-c/01-how.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-6313663251272577153</id><published>2009-03-23T21:32:00.008+11:00</published><updated>2009-03-24T20:53:25.654+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='deepzoom'/><title type='text'>MIX 10k entry goes OutOfBrowser</title><content type='html'>I have updated my &lt;a href="http://conceptdev.blogspot.com/2008/12/mix-10k-challenge-entry-accepted.html"&gt;MIX 10k Challenge entry&lt;/a&gt; to Silverlight 3.0 so itcan run out-of-browser!&lt;br /&gt;&lt;br /&gt;&lt;div style='background-color:#eeeeee;padding:5;'&gt;You can visit the &lt;a href="http://conceptdevelopment.net/silverlight3/outofbrowser01/Default.html"&gt;Silverlight 3.0 version of exploDZ&lt;/a&gt;, and install it locally for yourself &lt;span style='color:darkred'&gt;WARNING: will prompt to install Silverlight 3.0 which is in BETA&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;1. Right-click and choose to Install&lt;/b&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/ScdmEuhICSI/AAAAAAAAA0w/ckRyTYHMxuc/s1600-h/OOB-1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 226px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/ScdmEuhICSI/AAAAAAAAA0w/ckRyTYHMxuc/s400/OOB-1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5316330116526639394" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. Select "where" to install&lt;/b&gt; (this is really only where the shortcuts go)&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/ScdmFbo8IUI/AAAAAAAAA04/liCZROIH8bA/s1600-h/OOB-2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 168px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/ScdmFbo8IUI/AAAAAAAAA04/liCZROIH8bA/s400/OOB-2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5316330128639009090" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. Silverlight 3.0 having an out-of-browser experience&lt;/b&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/ScdmFtuSPwI/AAAAAAAAA1A/HyhpXRRPSoo/s1600-h/OOB-3.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 169px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/ScdmFtuSPwI/AAAAAAAAA1A/HyhpXRRPSoo/s400/OOB-3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5316330133493268226" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is really only a test of Silverlight 3.0 - exploDZ was just a bit of fun, and there is already an ClickOnce/WPF version at &lt;a href="http://deepzoompublisher.com/viewer"&gt;DeepZoomPublisher.com/Viewer&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Code changes&lt;/h3&gt;Thanks to &lt;a href="http://blogs.msdn.com/chkoenig/archive/2009/03/19/silverlight-3-out-of-browser-support.aspx"&gt;Chris' Silverlight 3.0 out-of-browser instructions&lt;/a&gt; the ONLY change from the 2.0 to the 3.0 (out-of-browser) version was the following element added to the AppManifest.xml file:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;  &amp;lt;Deployment.ApplicationIdentity&amp;gt;&lt;br /&gt;    &amp;lt;ApplicationIdentity&lt;br /&gt;       ShortName="exploDZ"&lt;br /&gt;       Title="Out of browser DeepZoom Viewer"&amp;gt;&lt;br /&gt;      &amp;lt;ApplicationIdentity.Blurb&amp;gt;&lt;br /&gt;        exploDZ out-of-browser (Silverlight 3.0)&lt;br /&gt;      &amp;lt;/ApplicationIdentity.Blurb&amp;gt;&lt;br /&gt;    &amp;lt;/ApplicationIdentity&amp;gt;&lt;br /&gt;  &amp;lt;/Deployment.ApplicationIdentity&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;What it does&lt;/h3&gt;The &lt;i&gt;shortcut&lt;/i&gt; created by the 'installer' has a target like this:&lt;br /&gt;&lt;code&gt;"C:\Program Files\Microsoft Silverlight\3.0.40307.0\sllauncher.exe" conceptdevelopment.net.0&lt;/code&gt;&lt;br /&gt;I guess that parameter reflects the 'source site' and index of Silverlight OutOfBrowser apps -&lt;span style='text-decoration:line-through;'&gt;stored in a safe place somewhere :)&lt;/span&gt; stored in &lt;b&gt;Apps\LocalLow\Microsoft\Silverlight\Offline\&lt;/b&gt; (on Windows 7 at least).&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/ScikS3w-rhI/AAAAAAAAA1I/vEysgVpj8Kc/s1600-h/sl3-offline-location.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 301px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/ScikS3w-rhI/AAAAAAAAA1I/vEysgVpj8Kc/s400/sl3-offline-location.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5316680004224855570" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The &lt;b&gt;index.html&lt;/b&gt; ISN'T the hosting page from the internet - it's a custom Silverlight &lt;code&gt;object&lt;/code&gt; tag:&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_Ba76y6K7kvs/ScimwDuklTI/AAAAAAAAA1Q/gBiXDKaszgk/s1600-h/sl3-offline-index.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 166px;" src="http://3.bp.blogspot.com/_Ba76y6K7kvs/ScimwDuklTI/AAAAAAAAA1Q/gBiXDKaszgk/s400/sl3-offline-index.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5316682704675444018" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The &lt;b&gt;metadata&lt;/b&gt; file contains&lt;br /&gt;&lt;code&gt;LaunchPath=C:\Users\Craig\AppData\LocalLow\Microsoft\Silverlight\Offline\conceptdevelopment.net.0\index.html&lt;br /&gt;SourceDomain=conceptdevelopment.net&lt;br /&gt;OriginalUri=http://conceptdevelopment.net/silverlight3/outofbrowser01/exploDZ.zip&lt;br /&gt;AppID=conceptdevelopment.net.0&lt;br /&gt;Description=exploDZ out-of-browser (Silverlight 3.0)&lt;br /&gt;Title=Out of browser DeepZoom Viewer&lt;br /&gt;Name=exploDZ&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;How it works?&lt;/h3&gt;Who knows??? Tim's &lt;a href="http://timheuer.com/blog/archive/2009/03/18/silverlight-3-offline-update-framework.aspx" target="20090323"&gt;Silverlight 3 Out-of-browser Update Model overview&lt;/a&gt; is a worthwhile read.&lt;br /&gt;&lt;br /&gt;Adobe's &lt;a href="http://ajaxian.com/archives/the-pros-and-cons-of-adobe-air" target="20090323"&gt;AIR&lt;/a&gt; out-of-browser host for Html-Javascript and Flash/Flex sits atop &lt;a href="http://opensource.adobe.com/wiki/display/webkit/Webkit" target="20090323"&gt;WebKit&lt;/a&gt;, and from the &lt;code&gt;index.html&lt;/code&gt; above it seems likely that OutOfBrowser-Silverlight is also sitting in a little web browser of some description. It's only 500Kb, so it's not IE :) - and there also has to be a Mac version... it doesn't appear to be managed code (or I'd guess Cassini), maybe the Mac one is related to Chiron? Speaking of Mac - this is how it looks in Safari 4 beta...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/ScirCHUBcEI/AAAAAAAAA1Y/lE3UXBDH-Zw/s1600-h/Picture+23.png"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 106px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/ScirCHUBcEI/AAAAAAAAA1Y/lE3UXBDH-Zw/s200/Picture+23.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5316687412921987138" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/ScirC9Tkc7I/AAAAAAAAA1g/KaXB0Re-LJk/s1600-h/Picture+24.png"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 98px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/ScirC9Tkc7I/AAAAAAAAA1g/KaXB0Re-LJk/s200/Picture+24.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5316687427415602098" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/ScirDDKtYtI/AAAAAAAAA1o/rq1uNBcmzTE/s1600-h/Picture+25.png"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 103px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/ScirDDKtYtI/AAAAAAAAA1o/rq1uNBcmzTE/s200/Picture+25.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5316687428989051602" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_Ba76y6K7kvs/ScirDaO4yeI/AAAAAAAAA1w/0lbqQZ7DvPg/s1600-h/Picture+26.png"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 92px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/ScirDaO4yeI/AAAAAAAAA1w/0lbqQZ7DvPg/s200/Picture+26.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5316687435180591586" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-6313663251272577153?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/6313663251272577153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/03/mix-10k-entry-goes-outofbrowser.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/6313663251272577153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/6313663251272577153'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/03/mix-10k-entry-goes-outofbrowser.html' title='MIX 10k entry goes OutOfBrowser'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Ba76y6K7kvs/ScdmEuhICSI/AAAAAAAAA0w/ckRyTYHMxuc/s72-c/OOB-1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-9105733477235592471</id><published>2009-03-23T07:05:00.002+11:00</published><updated>2009-03-23T07:25:10.508+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maps'/><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='deepzoom'/><title type='text'>Silverlight VirtualEarth Map Control - with DeepZoom Images</title><content type='html'>&lt;a href="http://deepzoompublisher.com/TagUpdater/" target="20090323"&gt;"TagUpdater"&lt;/a&gt; parses through your Deep Zoom &lt;code&gt;metadata.xml&lt;/code&gt;, opens the images and reads EXIF title/description/tag data... so it was pretty simple to extend it to read latitude &amp;amp; longitude.&lt;br /&gt;&lt;br /&gt;The location of each Deep Zoom sub-image is then available to &lt;b&gt;&lt;a href="http://conceptdevelopment.net/Silverlight/DeepZoomPublisher04/Default.html" target="20090323"&gt;display on a map, in the Tag Browser sample&lt;/a&gt;&lt;/b&gt;:&lt;br /&gt;&lt;a href="http://conceptdevelopment.net/Silverlight/DeepZoomPublisher04/Default.html" target="20090323"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 302px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/ScaaWrh3C7I/AAAAAAAAA0o/szrLdArwuZs/s400/TagMapBrowser.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5316106124589992882" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. &lt;code&gt;Metadata.xml&lt;/code&gt; entries now look like this&lt;/b&gt;&lt;br /&gt;&lt;code&gt;  &amp;lt;Image&amp;gt;&lt;br /&gt;    &amp;lt;FileName&amp;gt;C:\Dev\Cities\bhutan_tigersnest.jpg&amp;lt;/FileName&amp;gt;&lt;br /&gt;    &amp;lt;x&amp;gt;0&amp;lt;/x&amp;gt;&lt;br /&gt;    &amp;lt;y&amp;gt;0.127264287334191&amp;lt;/y&amp;gt;&lt;br /&gt;    &amp;lt;Width&amp;gt;0.199250151375691&amp;lt;/Width&amp;gt;&lt;br /&gt;    &amp;lt;Height&amp;gt;0.203911475380207&amp;lt;/Height&amp;gt;&lt;br /&gt;    &amp;lt;ZOrder&amp;gt;11&amp;lt;/ZOrder&amp;gt;&lt;br /&gt;    &amp;lt;Tag&amp;gt;bhutan&amp;lt;/Tag&amp;gt;&lt;br /&gt;    &amp;lt;Description&amp;gt;Amazing monastery perched on a cliff in Bhutan near Paro&amp;lt;/Description&amp;gt;&lt;br /&gt;    &amp;lt;Rating&amp;gt;0&amp;lt;/Rating&amp;gt;&lt;br /&gt;    &amp;lt;Title&amp;gt;Tiger's Nest&amp;lt;/Title&amp;gt;&lt;br /&gt;    &amp;lt;LatLong&amp;gt;27.4266666666667,89.4033333333333&amp;lt;/LatLong&amp;gt;&lt;br /&gt;  &amp;lt;/Image&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. We add a Silverlight VirtualEarth Map Control&lt;/b&gt;&lt;br /&gt;&lt;code&gt;xmlns:m="clr-namespace:Microsoft.VirtualEarth.MapControl;assembly=Microsoft.VirtualEarth.MapControl"&lt;br /&gt;&amp;lt;m:Map x:Name="viewMap" Grid.Row="3" Height="220" Opacity="0.25" /&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. and in the code add a new MapLayer&lt;/b&gt;&lt;br /&gt;&lt;code&gt;MapLayer PinMapLayer = new MapLayer(); // Layer on map to 'add' stuff to [MAP]&lt;br /&gt;&lt;br /&gt;viewMap.AddChild(PinMapLayer);&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4. Then display the pins within the &lt;code&gt;xmlClient_DownloadStringCompleted&lt;/code&gt; method &lt;/b&gt;(originally from &lt;a href="http://blog.kirupa.com/?p=212" target="20090323"&gt;Kirupa's sample&lt;/a&gt;)&lt;br /&gt;&lt;code&gt;//Now add to map [MAP]&lt;br /&gt;if (latlongString != "")&lt;br /&gt;{&lt;br /&gt;var l = new Location(&lt;br /&gt;    Convert.ToDouble(latlongString.Split(',')[0])&lt;br /&gt;    , Convert.ToDouble(latlongString.Split(',')[1])&lt;br /&gt;    );&lt;br /&gt;Image pin = new Image();&lt;br /&gt;pin.Source = new BitmapImage(new Uri("blue_pushpin.png", UriKind.RelativeOrAbsolute));&lt;br /&gt;pin.Stretch = Stretch.None;&lt;br /&gt;var tooltipObject = new StackPanel();&lt;br /&gt;var title = new TextBlock();&lt;br /&gt;title.FontWeight = FontWeights.Bold;&lt;br /&gt;title.Text = titleString;&lt;br /&gt;&lt;br /&gt;tooltipObject.Children.Add(title);&lt;br /&gt;var description = new TextBlock();&lt;br /&gt;description.Text = descriptionString;&lt;br /&gt;tooltipObject.Children.Add(description);&lt;br /&gt;&lt;br /&gt;ToolTipService.SetToolTip(pin, tooltipObject);&lt;br /&gt;// Adds the pushpin to the map layer.&lt;br /&gt;PinMapLayer.AddChild(pin, l, PositionMethod.BottomCenter);&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5. and in &lt;code&gt;msi.MouseMove&lt;/code&gt;, move the map for the 'current' image&lt;/b&gt;&lt;br /&gt;&lt;code&gt;l = new Location(&lt;br /&gt;            Convert.ToDouble(imageMetadata[subImageIndex].LatLong.Split(',')[0])&lt;br /&gt;            , Convert.ToDouble(imageMetadata[subImageIndex].LatLong.Split(',')[1])&lt;br /&gt;            );&lt;br /&gt;viewMap.Opacity = 1;&lt;br /&gt;viewMap.SetView(l, 12);&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;If you &lt;a href="http://conceptdevelopment.net/Silverlight/DeepZoomPublisher04/Default.html" target="20090323"&gt;play with it&lt;/a&gt; it will be obvious there are some useability issues with changing the map 'on hover' over the images (it's difficult to get the mouse over to the map if you want to navigate around), but the &lt;a href="http://connect.microsoft.com/silverlightmapcontrolctp" target="20090323"&gt;Silverlight VirtualEarth Map Control&lt;/a&gt; definitely makes it easy to build!&lt;br /&gt;&lt;br /&gt;&lt;!--a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/ScaaWrh3C7I/AAAAAAAAA0o/szrLdArwuZs/s1600-h/TagMapBrowser.png"--&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-9105733477235592471?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/9105733477235592471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/03/silverlight-virtualearth-map-control_23.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/9105733477235592471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/9105733477235592471'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/03/silverlight-virtualearth-map-control_23.html' title='Silverlight VirtualEarth Map Control - with DeepZoom Images'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ba76y6K7kvs/ScaaWrh3C7I/AAAAAAAAA0o/szrLdArwuZs/s72-c/TagMapBrowser.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-6083885797751560524</id><published>2009-03-22T15:06:00.006+11:00</published><updated>2009-03-22T15:39:38.797+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maps'/><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='search'/><title type='text'>Silverlight VirtualEarth Map Control - Search Results</title><content type='html'>Try out a basic search results view using the &lt;a href="http://connect.microsoft.com/silverlightmapcontrolctp" target="20090322"&gt;Silverlight VirtualEarth Map Control&lt;/a&gt; at &lt;a href="http://searcharoo.net/SilverlightMap.html" target="20090322"&gt;searcharoo.net/SilverlightMap.html&lt;/a&gt;...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://searcharoo.net/SilverlightMap.html" target="20090322"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 226px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/ScW5ybcp7JI/AAAAAAAAA0Y/LoZwcpOU3e0/s400/01_SilverlightarooMap.png" border="0" alt="Searcharoo with Silverlight Map Control" id="BLOGGER_PHOTO_ID_5315859211193281682" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thanks to &lt;a href="http://pietschsoft.com/post/2009/03/Virtual-Earth-Silverlight-Basics-of-Adding-Polygons-and-Polylines-using-XAML-and-Code.aspx"&gt;Chris Pietschmann's Tooltip example&lt;/a&gt; each pin shows what search result it refers too (although I still haven't figured out to make the pins 'click-able' to open the result link directly...).&lt;br /&gt;&lt;br /&gt;The relevant code added to the search result &lt;a href="http://searcharoo.net/SearcharooV7/" target="20090322"&gt;JSON parsing&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. Create a MapLayer&lt;/b&gt;&lt;br /&gt;&lt;code&gt;MapLayer PinMapLayer = new MapLayer();&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. Add it to the Map control &lt;i&gt;first&lt;/i&gt; (ie. before adding Children)&lt;/b&gt;&lt;br /&gt;&lt;code&gt;ResultMap.AddChild(PinMapLayer);&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. Extract GPS location&lt;/b&gt;&lt;br /&gt;&lt;code&gt;var l = new Location(&lt;br /&gt;    Convert.ToDouble(result.gps.Split(',')[1])&lt;br /&gt;    , Convert.ToDouble(result.gps.Split(',')[0])&lt;br /&gt;    );&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4. Create the pin (Image), add tooltip and add to MapLayer&lt;/b&gt;&lt;br /&gt;&lt;code&gt;Image pin = new Image();&lt;br /&gt;pin.Source = new BitmapImage(new Uri("blue_pushpin.png", UriKind.RelativeOrAbsolute));&lt;br /&gt;pin.Stretch = Stretch.None;&lt;br /&gt;&lt;br /&gt;var tooltipObject = new StackPanel();&lt;br /&gt;var title = new TextBlock();&lt;br /&gt;title.FontWeight = FontWeights.Bold;&lt;br /&gt;title.Text = result.name;&lt;br /&gt;tooltipObject.Children.Add(title);&lt;br /&gt;var description = new TextBlock();&lt;br /&gt;description.Text = result.description;&lt;br /&gt;tooltipObject.Children.Add(description);&lt;br /&gt;ToolTipService.SetToolTip(pin, tooltipObject);&lt;br /&gt;&lt;br /&gt;// Adds the pushpin to the map layer.&lt;br /&gt;PinMapLayer.AddChild(pin, l, PositionMethod.BottomCenter);&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://searcharoo.net/SilverlightMap.html" target="20090322"&gt;search box&lt;/a&gt; is pre-populated with &lt;i&gt;manhattan&lt;/i&gt; which results in a set of photos. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/ScW-YMvGL6I/AAAAAAAAA0g/GQx27mEiMZg/s1600-h/02_SilverlightarooMap.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 226px;" src="http://2.bp.blogspot.com/_Ba76y6K7kvs/ScW-YMvGL6I/AAAAAAAAA0g/GQx27mEiMZg/s400/02_SilverlightarooMap.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5315864258125639586" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Perform that search, then search for &lt;i&gt;sydney&lt;/i&gt; to see how the VirtualEarth Silverlight Map Control animates between the two locations with nothing more than a simple call to &lt;code&gt;SetView&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;ResultMap.SetView(GetMinMaxCenter(min, max), 12);&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The complete code will be available on &lt;a href="http://searcharoo.codeplex.com" target="20090322"&gt;Searcharoo@Codeplex&lt;/a&gt; shortly.&lt;!--a href="http://2.bp.blogspot.com/_Ba76y6K7kvs/ScW5ybcp7JI/AAAAAAAAA0Y/LoZwcpOU3e0/s1600-h/01_SilverlightarooMap.png"--&gt;&lt;br /&gt;&lt;br /&gt;p.s. another search to try is - &lt;i&gt;pumpkin&lt;/i&gt; - geocoded photos are so cool!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-6083885797751560524?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/6083885797751560524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/03/silverlight-virtualearth-map-control_22.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/6083885797751560524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/6083885797751560524'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/03/silverlight-virtualearth-map-control_22.html' title='Silverlight VirtualEarth Map Control - Search Results'/><author><name>Craig Dunn</name><uri>http://www.blogger.com/profile/09377896535933926653</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ba76y6K7kvs/ScW5ybcp7JI/AAAAAAAAA0Y/LoZwcpOU3e0/s72-c/01_SilverlightarooMap.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6621561.post-7605392068956344930</id><published>2009-03-21T20:53:00.007+11:00</published><updated>2009-04-18T13:04:58.760+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maps'/><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='silverlight3'/><title type='text'>Silverlight VirtualEarth Map Control - in "3D"</title><content type='html'>Further to my &lt;a href="http://conceptdev.blogspot.com/2009/03/silverlight-virtualearth-map-control.html" target="20090321"&gt;previous post&lt;/a&gt; on the Silverlight VirtualEarth Map Control - here it is &lt;a href="http://conceptdevelopment.net/silverlight/vemap01/default30.html" target="20090321"&gt;in Silverlight 3.0&lt;/a&gt; &lt;span style='color:darkred'&gt;WARNING: will prompt to install Silverlight 3.0 - which is in BETA - do so at your own risk!&lt;/span&gt;&lt;br /&gt;&lt;a href="http://conceptdevelopment.net/silverlight/vemap01/default30.html" target="20090321"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 286px;" src="http://4.bp.blogspot.com/_Ba76y6K7kvs/ScS5RiKvGfI/AAAAAAAAA0Q/qEKStO4qJAQ/s400/07_SL3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5315577171084777970" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The animation and map styles (road|arial) work as you'd expect, but somehow it looks a lot cooler with this little bit of code added :-)&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;lt;Canvas.Projection&amp;gt;&lt;br /&gt;   &amp;lt;PlaneProjection RotationX="-60" /&amp;gt;&lt;br /&gt;&amp;lt;/Canvas.Projection&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;BTW, it seems to me like addition of 3D &lt;code&gt;Projection&lt;/code&gt; (rather than a complete 3D environment, ala &lt;a href="http://kit3d.codeplex.com"&gt;Kit3D&lt;/a&gt; and WPF) is the &lt;i&gt;minimum&lt;/i&gt; they needed to add to get Photosynth working "natively" in Silverlight (instead of the current &lt;a href="http://conceptdev.blogspot.com/2009/02/photosynth-in-moonsilverlight.html" target="20090321"&gt;Silverlight-Photosynth beta&lt;/a&gt; which &lt;i&gt;does&lt;/i&gt; use Kit3D)? ... hmmm ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6621561-7605392068956344930?l=conceptdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://conceptdev.blogspot.com/feeds/7605392068956344930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://conceptdev.blogspot.com/2009/03/silverlight-virtualearth-map-control-in.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/7605392068956344930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6621561/posts/default/7605392068956344930'/><link rel='alternate' type='text/html' href='http://conceptdev.blogspot.com/2009/03/sil
