<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DEEDR348fCp7ImA9WhVTF0g.&quot;"><id>tag:blogger.com,1999:blog-2678645086319511182</id><updated>2012-03-02T22:37:56.074-08:00</updated><category term="clickonce" /><category term="upgrade database" /><category term="msdn" /><category term="Easy" /><category term="Template" /><category term="globalize" /><category term="solution" /><category term="Performance" /><category term="SQL" /><category term="admin" /><category term="AddMemoryFont" /><category term="Binding" /><category term="Installer" /><category term="Isolated" /><category term="Image" /><category term="localization" /><category term="scintilla" /><category term="CodeProject" /><category term="add field" /><category term="Studio" /><category term="Wix" /><category term="GDI" /><category term="MSI" /><category term="Integration" /><category term="globalization" /><category term="Test" /><category term="Testing" /><category term="PrivateFontCollection" /><category term="free syntax highlighting control" /><category term="MSAF" /><category term="TDD" /><category term="Profiler" /><category term="OnClick" /><category term="Wrap installer" /><category term="multi-language" /><category term="Profile" /><category term="MakeMsi" /><category term="Debugging" /><category term="WriteableBitmap" /><category term=".net" /><category term="vim" /><category term="Storage" /><category term="WinForms" /><category term="Application" /><category term="Embedding" /><category term="NUnit" /><category term="Localize" /><category term="embedded" /><category term="SQL CE" /><category term="Test Driven Development" /><category term="Resource" /><category term="nano" /><category term="ALTER TABLE" /><category term="Thread" /><category term="Express" /><category term="programming" /><category term="schema" /><category term="example" /><category term="Visual" /><category term="graphics" /><category term="WP7" /><category term="ListBox" /><category term="syntax highlighting" /><category term="InnoSetup" /><category term="privileges" /><category term="change database" /><category term="font" /><category term="code highlighting" /><category term="Syntax Highlighting Control" /><category term="private" /><category term="ADO.NET" /><category term="C#" /><category term="enumerate" /><category term="GetManifestResourceNames" /><category term="Windows Phone 7" /><category term="custom" /><category term="EXE to MSI" /><category term="unix" /><category term="IsTapEvent" /><category term="Windows Installer" /><category term="ICSharpCode.TextEditor" /><category term="Convert to msi" /><category term="Debug" /><category term="GDI+" /><category term="Load" /><category term="WPF" /><category term="Analysis" /><category term="Silverlight" /><title>C# Blog - Tips and Tricks</title><subtitle type="html">All About .NET, C# Tips and Tricks, Articles, Sample Code.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.csharpblog.co.cc/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.csharpblog.co.cc/" /><author><name>Ernest Poletaev</name><uri>http://www.blogger.com/profile/10001240160904961461</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://2.bp.blogspot.com/_IdGwwinx0YU/TH4EeRXAihI/AAAAAAAAQUA/0XOdvuTLRYg/S220/a_7161c26f.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/C-C-sharpening" /><feedburner:info uri="c-c-sharpening" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;AkUFR3Y8eyp7ImA9WhdbGU8.&quot;"><id>tag:blogger.com,1999:blog-2678645086319511182.post-1606438173289846515</id><published>2011-10-17T10:21:00.000-07:00</published><updated>2011-10-18T01:56:56.873-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-18T01:56:56.873-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Storage" /><category scheme="http://www.blogger.com/atom/ns#" term="Isolated" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows Phone 7" /><category scheme="http://www.blogger.com/atom/ns#" term="Silverlight" /><category scheme="http://www.blogger.com/atom/ns#" term="Binding" /><category scheme="http://www.blogger.com/atom/ns#" term="Image" /><category scheme="http://www.blogger.com/atom/ns#" term="WP7" /><title>Binding to Image Path in Isolated Storage</title><content type="html">&lt;p&gt;Bind Image Source to web address is not problem, it will works well... until You don't care about performance. Problem will appear if You want to cache images. Isolated storage is only way to store downloaded files in Silverlight not matter Browser or Windows Phone. Not so difficult to download image file from Internet and save to Isolated Storage, but how to use it in Silverlight Page?&lt;/p&gt;

&lt;p&gt;Well, lets try to figure out. First define image converter:&lt;/p&gt;

&lt;div class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;div class="tools"&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;"&gt;view plain&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"&gt;copy to clipboard&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;"&gt;print&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('About',this);return false;"&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol start="1" class="dp-c"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt;&amp;nbsp;IsoImageConverter&amp;nbsp;:&amp;nbsp;IValueConverter&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="comment"&gt;//Convert&amp;nbsp;Data&amp;nbsp;to&amp;nbsp;Image&amp;nbsp;when&amp;nbsp;Loading&amp;nbsp;Data&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt;&amp;nbsp;Convert(&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt;&amp;nbsp;value,&amp;nbsp;Type&amp;nbsp;targetType,&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt;&amp;nbsp;parameter,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Globalization.CultureInfo&amp;nbsp;culture)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;bitmap&amp;nbsp;=&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;BitmapImage();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;try&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;path&amp;nbsp;=&amp;nbsp;(&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;)value;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(!String.IsNullOrEmpty(path))&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt;&amp;nbsp;(var&amp;nbsp;file&amp;nbsp;=&amp;nbsp;LoadFile(path))&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bitmap.SetSource(file);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;catch&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;bitmap;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;Stream&amp;nbsp;LoadFile(&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;file)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt;&amp;nbsp;(var&amp;nbsp;isoStore&amp;nbsp;=&amp;nbsp;IsolatedStorageFile.GetUserStoreForApplication())&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;isoStore.OpenFile(file,&amp;nbsp;FileMode.Open,&amp;nbsp;FileAccess.Read);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt;&amp;nbsp;ConvertBack(&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt;&amp;nbsp;value,&amp;nbsp;Type&amp;nbsp;targetType,&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt;&amp;nbsp;parameter,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Globalization.CultureInfo&amp;nbsp;culture)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;throw&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;NotImplementedException();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;textarea style="display:none;" class="originalCode"&gt;public class IsoImageConverter : IValueConverter  
{  
    //Convert Data to Image when Loading Data  
    public object Convert(object value, Type targetType, object parameter,  
        System.Globalization.CultureInfo culture)  
    {  
        var bitmap = new BitmapImage();  
        try  
        {  
            var path = (string)value;  
            if (!String.IsNullOrEmpty(path))
            {  
                using (var file = LoadFile(path))  
                {  
                    bitmap.SetSource(file);  
                }  
            }  
        }  
        catch  
        {  
        }  
        return bitmap;  
    }  
  
    private Stream LoadFile(string file)  
    {  
        using (var isoStore = IsolatedStorageFile.GetUserStoreForApplication())  
        {  
            return isoStore.OpenFile(file, FileMode.Open, FileAccess.Read);  
        }  
    }  
      
    public object ConvertBack(object value, Type targetType, object parameter,  
        System.Globalization.CultureInfo culture)  
    {  
        throw new NotImplementedException();  
    }  
}&lt;/textarea&gt;&lt;/div&gt;

&lt;p&gt;Next define link in App.xaml for use in XAML code&lt;p&gt;

&lt;div class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;div class="tools"&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;"&gt;view plain&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"&gt;copy to clipboard&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;"&gt;print&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('About',this);return false;"&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol start="1" class="dp-xml"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;local:IsoImageConverter&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;x:Key&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"IsoImageCoverter"&lt;/span&gt;&lt;span class="tag"&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;textarea style="display:none;" class="originalCode"&gt;&amp;lt;local:IsoImageConverter x:Key="IsoImageCoverter"/&amp;gt;&lt;/textarea&gt;&lt;/div&gt;

&lt;p&gt;And finally bind to string path to Isolated Storage image file&lt;/p&gt;

&lt;div class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;div class="tools"&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;"&gt;view plain&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"&gt;copy to clipboard&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;"&gt;print&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('About',this);return false;"&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol start="1" class="dp-xml"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;Image&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;Source&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"{Binding&amp;nbsp;ImagePath,&amp;nbsp;Converter={StaticResource&amp;nbsp;IsoImageCoverter}}"&lt;/span&gt;&lt;span class="tag"&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;textarea style="display:none;" class="originalCode"&gt;&amp;lt;Image Source="{Binding ImagePath, Converter={StaticResource IsoImageCoverter}}"/&amp;gt;
&lt;/textarea&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2678645086319511182-1606438173289846515?l=www.csharpblog.co.cc' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_qOSBv-9Oc-F2hdQzIUFaf43Aqw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_qOSBv-9Oc-F2hdQzIUFaf43Aqw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_qOSBv-9Oc-F2hdQzIUFaf43Aqw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_qOSBv-9Oc-F2hdQzIUFaf43Aqw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/C-C-sharpening/~4/xLcEDtC04Mk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.csharpblog.co.cc/feeds/1606438173289846515/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.csharpblog.co.cc/2011/10/binding-to-image-path-in-isolated.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/1606438173289846515?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/1606438173289846515?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/C-C-sharpening/~3/xLcEDtC04Mk/binding-to-image-path-in-isolated.html" title="Binding to Image Path in Isolated Storage" /><author><name>Ernest Poletaev</name><uri>http://www.blogger.com/profile/10001240160904961461</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://2.bp.blogspot.com/_IdGwwinx0YU/TH4EeRXAihI/AAAAAAAAQUA/0XOdvuTLRYg/S220/a_7161c26f.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://www.csharpblog.co.cc/2011/10/binding-to-image-path-in-isolated.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkAEQXo7fyp7ImA9WhdUEk8.&quot;"><id>tag:blogger.com,1999:blog-2678645086319511182.post-3239002472187116876</id><published>2011-09-28T09:32:00.000-07:00</published><updated>2011-09-28T09:51:40.407-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-28T09:51:40.407-07:00</app:edited><title>Localize ToggleSwitch in Silverlight Toolkit</title><content type="html">Read tons of blogs and questions and answers, but cannot get Localize ToggleSwitch in SilverLight Toolkit in my Windows Phone Application. So i decided to get my own way. 
My proposal based on DataTemplate for ToggleSwitch and ValueConverter. So let's go.
&lt;br /&gt;
&lt;br /&gt;

First add Localized Resource for our new On and Off string values:
&lt;br /&gt;
&lt;br /&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;img border="0" src="http://1.bp.blogspot.com/-Msjh2GUK2S0/ToNKpHvTVWI/AAAAAAAAQtU/-Gv7SQMg-yo/s1600/on_of_resources.png" /&gt;&lt;/div&gt;

&lt;br /&gt;

Next step create ValueConverter:

&lt;div class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;div class="tools"&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;"&gt;view plain&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"&gt;copy to clipboard&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;"&gt;print&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('About',this);return false;"&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol start="1" class="dp-c"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt;&amp;nbsp;BoolToSwitchConverter&amp;nbsp;:&amp;nbsp;IValueConverter&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;FalseValue&amp;nbsp;=&amp;nbsp;Resources.Off;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;TrueValue&amp;nbsp;&amp;nbsp;=&amp;nbsp;Resources.On;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt;&amp;nbsp;Convert(&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt;&amp;nbsp;value,&amp;nbsp;Type&amp;nbsp;targetType,&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt;&amp;nbsp;parameter,&amp;nbsp;System.Globalization.CultureInfo&amp;nbsp;culture)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(value&amp;nbsp;==&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span&gt;)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;FalseValue;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&lt;/span&gt;&lt;span class="string"&gt;"On"&lt;/span&gt;&lt;span&gt;.Equals(value))&amp;nbsp;?&amp;nbsp;TrueValue&amp;nbsp;:&amp;nbsp;FalseValue;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt;&amp;nbsp;ConvertBack(&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt;&amp;nbsp;value,&amp;nbsp;Type&amp;nbsp;targetType,&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt;&amp;nbsp;parameter,&amp;nbsp;System.Globalization.CultureInfo&amp;nbsp;culture)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;value&amp;nbsp;!=&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span&gt;&amp;nbsp;?&amp;nbsp;value.Equals(TrueValue)&amp;nbsp;:&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;false&lt;/span&gt;&lt;span&gt;;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;textarea style="display:none;" class="originalCode"&gt;public class BoolToSwitchConverter : IValueConverter
{
    private string FalseValue = Resources.Off;
    private string TrueValue  = Resources.On;

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null)
            return FalseValue;
        else
            return ("On".Equals(value)) ? TrueValue : FalseValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value != null ? value.Equals(TrueValue) : false;
    }
}&lt;/textarea&gt;&lt;/div&gt;

Make our converter visible from XAML, adding glue code to Application Resources in App.xaml

Add link to app namespace if you not do this before 

xmlns:local="clr-namespace:AppNamspace"

And add resource code

&lt;div class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;div class="tools"&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;"&gt;view plain&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"&gt;copy to clipboard&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;"&gt;print&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('About',this);return false;"&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol start="1" class="dp-xml"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;Application.Resources&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;local:BoolToSwitchConverter&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;x:Key&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"Switch"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="tag"&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;Application.Resources&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;textarea style="display:none;" class="originalCode"&gt;&amp;lt;Application.Resources&amp;gt;
    &amp;lt;local:BoolToSwitchConverter x:Key="Switch" /&amp;gt;
&amp;lt;/Application.Resources&amp;gt;&lt;/textarea&gt;&lt;/div&gt;

And finally override DataTemplate on our ToggleSwitch:

&lt;div class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;div class="tools"&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;"&gt;view plain&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"&gt;copy to clipboard&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;"&gt;print&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('About',this);return false;"&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol start="1" class="dp-xml"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;toolkit:ToggleSwitch&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;x:Name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"MySwitch"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;Header&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"Localized&amp;nbsp;Switch"&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;toolkit:ToggleSwitch.ContentTemplate&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;DataTemplate&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;ContentControl&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;HorizontalAlignment&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"Left"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="attribute"&gt;Content&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"{Binding&amp;nbsp;Converter={StaticResource&amp;nbsp;Switch}}"&lt;/span&gt;&lt;span class="tag"&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;DataTemplate&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;toolkit:ToggleSwitch.ContentTemplate&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;toolkit:ToggleSwitch&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;textarea style="display:none;" class="originalCode"&gt;&amp;lt;toolkit:ToggleSwitch x:Name="MySwitch" Header="Localized Switch"&amp;gt;
    &amp;lt;toolkit:ToggleSwitch.ContentTemplate&amp;gt;
        &amp;lt;DataTemplate&amp;gt;
            &amp;lt;ContentControl HorizontalAlignment="Left" 
                Content="{Binding Converter={StaticResource Switch}}"/&amp;gt;
        &amp;lt;/DataTemplate&amp;gt;
    &amp;lt;/toolkit:ToggleSwitch.ContentTemplate&amp;gt;
&amp;lt;/toolkit:ToggleSwitch&amp;gt;&lt;/textarea&gt;&lt;/div&gt;

Result:

&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;img border="0" src="http://2.bp.blogspot.com/-JHFZwuhj9oI/ToNN4u2WrVI/AAAAAAAAQtc/_gMrB1kIDBo/LocalizedSwitch.png" /&gt;&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2678645086319511182-3239002472187116876?l=www.csharpblog.co.cc' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/haYte--MG7QqNZHHZFAFMiA4DXc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/haYte--MG7QqNZHHZFAFMiA4DXc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/haYte--MG7QqNZHHZFAFMiA4DXc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/haYte--MG7QqNZHHZFAFMiA4DXc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/C-C-sharpening/~4/b99nZ3xuN-s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.csharpblog.co.cc/feeds/3239002472187116876/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.csharpblog.co.cc/2011/09/localize-toggleswitch-in-silverlight.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/3239002472187116876?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/3239002472187116876?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/C-C-sharpening/~3/b99nZ3xuN-s/localize-toggleswitch-in-silverlight.html" title="Localize ToggleSwitch in Silverlight Toolkit" /><author><name>Ernest Poletaev</name><uri>http://www.blogger.com/profile/10001240160904961461</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://2.bp.blogspot.com/_IdGwwinx0YU/TH4EeRXAihI/AAAAAAAAQUA/0XOdvuTLRYg/S220/a_7161c26f.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-Msjh2GUK2S0/ToNKpHvTVWI/AAAAAAAAQtU/-Gv7SQMg-yo/s72-c/on_of_resources.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.csharpblog.co.cc/2011/09/localize-toggleswitch-in-silverlight.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUFQ3w8fip7ImA9WhdUEE8.&quot;"><id>tag:blogger.com,1999:blog-2678645086319511182.post-1959784711590915503</id><published>2011-09-26T01:27:00.000-07:00</published><updated>2011-09-26T01:36:52.276-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-26T01:36:52.276-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Localize" /><category scheme="http://www.blogger.com/atom/ns#" term="globalize" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows Phone 7" /><category scheme="http://www.blogger.com/atom/ns#" term="localization" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="WP7" /><category scheme="http://www.blogger.com/atom/ns#" term="globalization" /><title>Localize Windows Phone 7 Styles</title><content type="html">In process of localize silverlight application, usually, localized text wider than original english. In most cases it not a problem if You use StackPanel or other wrapping conrols, but sometimes width cannot be easely changed. In silverlight application You can use satellite assembly and put localized styles, and connect to page using MergedDictionary and ResourceDictionary.&lt;br /&gt;
&lt;br /&gt;
Why cannot use same approach for Windows Phone application? There is many reasons:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Windows Phone don't support satellite assemblies.&lt;/li&gt;
&lt;li&gt;Windows Phone don't care about xml:lang&lt;/li&gt;
&lt;li&gt;MergedDictionary degrade preformance&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
So try to use another approach. Define control, Button for example and apply default style
&lt;/div&gt;
&lt;div class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;div class="tools"&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;"&gt;view plain&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"&gt;copy to clipboard&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;"&gt;print&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('About',this);return false;"&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol start="1" class="dp-xml"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;Button&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;x:Name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"MyStyledButton"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;Content&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"Button"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;Style&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"{StaticResource&amp;nbsp;MyButton}"&lt;/span&gt;&lt;span class="tag"&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;textarea style="display:none;" class="originalCode"&gt;&amp;lt;Button x:Name="MyStyledButton" Content="Button" Style="{StaticResource MyButton}"/&amp;gt;&lt;/textarea&gt;&lt;/div&gt;
&lt;div&gt;
Then put general style in App.xaml&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;div class="tools"&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;"&gt;view plain&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"&gt;copy to clipboard&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;"&gt;print&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('About',this);return false;"&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol start="1" class="dp-xml"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;Style&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;x:Key&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"MyButton"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;TargetType&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"Button"&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;Setter&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;Property&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"Background"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;Value&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"#303030"&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;Setter&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;Setter&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;Property&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"BorderThickness"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;Value&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"0"&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;Setter&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;Style&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;textarea style="display:none;" class="originalCode"&gt;&amp;lt;Style x:Key="MyButton" TargetType="Button"&amp;gt;
    &amp;lt;Setter Property="Background" Value="#303030"&amp;gt;&amp;lt;/Setter&amp;gt;
    &amp;lt;Setter Property="BorderThickness" Value="0"&amp;gt;&amp;lt;/Setter&amp;gt;
&amp;lt;/Style&amp;gt;
&lt;/textarea&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Another bug in Windows Phone 7 that attribute BasedOn not supported, so we have to copy whole style to derived. Next step change name, adding -[lang code] to x:Key of style. So 'MyButton' will be 'MyButton-de' for example.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;div class="tools"&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;"&gt;view plain&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"&gt;copy to clipboard&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;"&gt;print&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('About',this);return false;"&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol start="1" class="dp-xml"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;Style&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;x:Key&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"MyButton-ru"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;TargetType&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"Button"&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;Setter&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;Property&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"Background"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;Value&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"#FF8080"&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;Setter&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;Setter&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;Property&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"BorderThickness"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;Value&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"1"&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;Setter&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;Style&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;textarea style="display:none;" class="originalCode"&gt;&amp;lt;Style x:Key="MyButton-ru" TargetType="Button"&amp;gt;
    &amp;lt;Setter Property="Background" Value="#FF8080"&amp;gt;&amp;lt;/Setter&amp;gt;
    &amp;lt;Setter Property="BorderThickness" Value="1"&amp;gt;&amp;lt;/Setter&amp;gt;
&amp;lt;/Style&amp;gt;
&lt;/textarea&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Next we'll add runtime code for loading language dependent styles.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;div class="tools"&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;"&gt;view plain&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"&gt;copy to clipboard&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;"&gt;print&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('About',this);return false;"&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol start="1" class="dp-c"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;string&lt;/span&gt;&lt;span&gt;&amp;nbsp;lang&amp;nbsp;=&amp;nbsp;CultureInfo.CurrentUICulture.TwoLetterISOLanguageName;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&lt;span class="comment"&gt;//&amp;nbsp;load&amp;nbsp;localized&amp;nbsp;style&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;Style&amp;nbsp;style&amp;nbsp;=&amp;nbsp;(Style)App.Current.Resources[&lt;span class="string"&gt;"MyButton-"&lt;/span&gt;&lt;span&gt;&amp;nbsp;+&amp;nbsp;lang];&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(style&amp;nbsp;!=&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span&gt;)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MyButton.Style&amp;nbsp;=&amp;nbsp;style;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;textarea style="display:none;" class="originalCode"&gt;string lang = CultureInfo.CurrentUICulture.TwoLetterISOLanguageName;
// load localized style
Style style = (Style)App.Current.Resources["MyButton-" + lang];
if (style != null)
{
    MyButton.Style = style;
}
&lt;/textarea&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
In runtime we determine current UI language and try to load altered style. If found, apply new style, if not - hardcoded style will be used.&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2678645086319511182-1959784711590915503?l=www.csharpblog.co.cc' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Rdx0m8zXlCFDuL2qKP3rzUpIk9E/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Rdx0m8zXlCFDuL2qKP3rzUpIk9E/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Rdx0m8zXlCFDuL2qKP3rzUpIk9E/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Rdx0m8zXlCFDuL2qKP3rzUpIk9E/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/C-C-sharpening/~4/8qG8GBz8G_U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.csharpblog.co.cc/feeds/1959784711590915503/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.csharpblog.co.cc/2011/09/localize-windows-phone-7-styles.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/1959784711590915503?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/1959784711590915503?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/C-C-sharpening/~3/8qG8GBz8G_U/localize-windows-phone-7-styles.html" title="Localize Windows Phone 7 Styles" /><author><name>Ernest Poletaev</name><uri>http://www.blogger.com/profile/10001240160904961461</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://2.bp.blogspot.com/_IdGwwinx0YU/TH4EeRXAihI/AAAAAAAAQUA/0XOdvuTLRYg/S220/a_7161c26f.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.csharpblog.co.cc/2011/09/localize-windows-phone-7-styles.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cEQHw-fSp7ImA9WhdWE08.&quot;"><id>tag:blogger.com,1999:blog-2678645086319511182.post-3794838481927228014</id><published>2011-09-06T09:45:00.000-07:00</published><updated>2011-09-06T10:10:01.255-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-06T10:10:01.255-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Thread" /><category scheme="http://www.blogger.com/atom/ns#" term="Silverlight" /><category scheme="http://www.blogger.com/atom/ns#" term="Image" /><category scheme="http://www.blogger.com/atom/ns#" term="WriteableBitmap" /><category scheme="http://www.blogger.com/atom/ns#" term="WP7" /><category scheme="http://www.blogger.com/atom/ns#" term="Load" /><title>Load Image at Background Thread in Silverlight WP7</title><content type="html">Load image at background thread in Silverlight Windows Phone 7 application, is that possible?&lt;br /&gt;
&lt;br /&gt;
Usually when you try to use BitmapImage, Image, WriteableImage in other than UI thread, you'll get exception. This is because these classes are derived from&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/aa347331(vs.96)"&gt; System.Windows.Threading.DispatcherObject&lt;/a&gt;,&amp;nbsp;which is blocked access from other than UI thread. There exists an extension to WriteableBitmap, &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.extensions.loadjpeg(v=vs.92).aspx"&gt;LoadJpeg&lt;/a&gt;, which is works fine in thread, but you have to create WriteableBitmap object on main UI thread.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;div class="tools"&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;"&gt;view plain&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"&gt;copy to clipboard&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;"&gt;print&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('About',this);return false;"&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol start="1" class="dp-c"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt;&amp;nbsp;System.Windows;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class=""&gt;&lt;span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt;&amp;nbsp;System.Windows.Media.Imaging;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt;&amp;nbsp;System.IO;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class=""&gt;&lt;span&gt;&lt;span class="keyword"&gt;using&lt;/span&gt;&lt;span&gt;&amp;nbsp;System.Threading;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li class=""&gt;&lt;span&gt;&lt;span class="keyword"&gt;namespace&lt;/span&gt;&lt;span&gt;&amp;nbsp;ImageHelpers&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="alt"&gt;&lt;span&gt;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;delegate&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;ImageLoadedDelegate(WriteableBitmap&amp;nbsp;wb,&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt;&amp;nbsp;argument);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;class&lt;/span&gt;&lt;span&gt;&amp;nbsp;ImageThread&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;event&lt;/span&gt;&lt;span&gt;&amp;nbsp;ImageLoadedDelegate&amp;nbsp;ImageLoaded;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;ImageThread()&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;LoadThumbAsync(Stream&amp;nbsp;src,&amp;nbsp;WriteableBitmap&amp;nbsp;bmp,&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt;&amp;nbsp;argument)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ThreadPool.QueueUserWorkItem(callback&amp;nbsp;=&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bmp.LoadJpeg(src);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;src.Dispose();&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(ImageLoaded&amp;nbsp;!=&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;null&lt;/span&gt;&lt;span&gt;)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Deployment.Current.Dispatcher.BeginInvoke(()&amp;nbsp;=&amp;gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ImageLoaded(bmp,&amp;nbsp;argument);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li class=""&gt;&lt;span&gt;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;textarea style="display:none;" class="originalCode"&gt;using System.Windows;&lt;br /&gt;
using System.Windows.Media.Imaging;&lt;br /&gt;
using System.IO;&lt;br /&gt;
using System.Threading;&lt;br /&gt;
&lt;br /&gt;
namespace ImageHelpers&lt;br /&gt;
{&lt;br /&gt;
public delegate void ImageLoadedDelegate(WriteableBitmap wb, object argument);&lt;br /&gt;
&lt;br /&gt;
public class ImageThread&lt;br /&gt;
{&lt;br /&gt;
public event ImageLoadedDelegate ImageLoaded;&lt;br /&gt;
&lt;br /&gt;
public ImageThread()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public void LoadThumbAsync(Stream src, WriteableBitmap bmp, object argument)&lt;br /&gt;
{&lt;br /&gt;
ThreadPool.QueueUserWorkItem(callback =&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
bmp.LoadJpeg(src);&lt;br /&gt;
src.Dispose();&lt;br /&gt;
if (ImageLoaded != null)&lt;br /&gt;
{&lt;br /&gt;
Deployment.Current.Dispatcher.BeginInvoke(() =&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
ImageLoaded(bmp, argument);&lt;br /&gt;
});&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;/textarea&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Using scenario:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;div class="tools"&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;"&gt;view plain&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"&gt;copy to clipboard&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;"&gt;print&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('About',this);return false;"&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol start="1" class="dp-c"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span&gt;ImageThread&amp;nbsp;imageThread&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;ImageThread();&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;Init()&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imageThread.ImageLoaded&amp;nbsp;+=&amp;nbsp;LoadFinished;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;LoadFinished(WriteableBitmap&amp;nbsp;bmp,&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;object&lt;/span&gt;&lt;span&gt;&amp;nbsp;arg)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Imgage1.Source&amp;nbsp;=&amp;nbsp;bmp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;DeferImageLoading(&amp;nbsp;Stream&amp;nbsp;imgStream&amp;nbsp;)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="comment"&gt;//&amp;nbsp;we&amp;nbsp;have&amp;nbsp;to&amp;nbsp;give&amp;nbsp;size&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;bmp&amp;nbsp;=&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;WriteableBitmap(80,&amp;nbsp;80);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imageThread.LoadThumbAsync(imgStream,&amp;nbsp;bmp,&amp;nbsp;&lt;span class="keyword"&gt;this&lt;/span&gt;&lt;span&gt;);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;textarea style="display:none;" class="originalCode"&gt;ImageThread imageThread = new ImageThread();&lt;br /&gt;
&lt;br /&gt;
private void Init()&lt;br /&gt;
{&lt;br /&gt;
    imageThread.ImageLoaded += LoadFinished;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void LoadFinished(WriteableBitmap bmp, object arg)&lt;br /&gt;
{&lt;br /&gt;
    Imgage1.Source = bmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DeferImageLoading( Stream imgStream )&lt;br /&gt;
{&lt;br /&gt;
    // we have to give size&lt;br /&gt;
    var bmp = new WriteableBitmap(80, 80);&lt;br /&gt;
    imageThread.LoadThumbAsync(imgStream, bmp, this);&lt;br /&gt;
}&lt;br /&gt;
&lt;/textarea&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2678645086319511182-3794838481927228014?l=www.csharpblog.co.cc' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uZzgoKe3TAaPh2JuMO5pjyaU2qA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uZzgoKe3TAaPh2JuMO5pjyaU2qA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uZzgoKe3TAaPh2JuMO5pjyaU2qA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uZzgoKe3TAaPh2JuMO5pjyaU2qA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/C-C-sharpening/~4/UNnnE0TrcDQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.csharpblog.co.cc/feeds/3794838481927228014/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.csharpblog.co.cc/2011/09/load-image-at-background-thread-in.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/3794838481927228014?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/3794838481927228014?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/C-C-sharpening/~3/UNnnE0TrcDQ/load-image-at-background-thread-in.html" title="Load Image at Background Thread in Silverlight WP7" /><author><name>Ernest Poletaev</name><uri>http://www.blogger.com/profile/10001240160904961461</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://2.bp.blogspot.com/_IdGwwinx0YU/TH4EeRXAihI/AAAAAAAAQUA/0XOdvuTLRYg/S220/a_7161c26f.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.csharpblog.co.cc/2011/09/load-image-at-background-thread-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UHSHw5eyp7ImA9WhdXEko.&quot;"><id>tag:blogger.com,1999:blog-2678645086319511182.post-2302174445935823232</id><published>2011-08-25T05:06:00.000-07:00</published><updated>2011-08-25T05:27:19.223-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-25T05:27:19.223-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Analysis" /><category scheme="http://www.blogger.com/atom/ns#" term="Profile" /><category scheme="http://www.blogger.com/atom/ns#" term="Profiler" /><category scheme="http://www.blogger.com/atom/ns#" term="WP7" /><category scheme="http://www.blogger.com/atom/ns#" term="Performance" /><title>Using WP7 Profiler</title><content type="html">Windows Phone 7 SDK RC add exciting new feature to developers. After installed new developer tools I noticed &lt;strong&gt;Microsoft Windows Phone 7.1 Profiler&lt;/strong&gt; in About menu of Visual studio 2010 for Windows Phone. Quick Googling give no results, but everything more easy than can looks.&lt;br /&gt;
&lt;br /&gt;
Open Your WP7 project and look into Debug menu. You will see disabled (probably not) menu item &lt;strong&gt;Start Windows Phone Performance Analysis&lt;/strong&gt;&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/-EuARu2piJds/TlY3NNUEoHI/AAAAAAAAQms/Qt_fXPLGot0/s1600/disabled.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-EuARu2piJds/TlY3NNUEoHI/AAAAAAAAQms/Qt_fXPLGot0/s320/disabled.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;To enable this item You have to switch Your project target from Windows Phone 7.0 to 7.1 in Project -&amp;gt; Properties menu. So if Your application targeted current market, you have to make project clone prior profiling, cause You cannot switch back to 7.0.&lt;br /&gt;
&lt;br /&gt;
When application targeted Mango You can open profiler. Choose options and click hyperlink Launch Application.&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/-obYmMRKK7pg/TlY4pS9pxVI/AAAAAAAAQmw/Sp6JvN4K4NM/s1600/Profiler.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="261" src="http://4.bp.blogspot.com/-obYmMRKK7pg/TlY4pS9pxVI/AAAAAAAAQmw/Sp6JvN4K4NM/s320/Profiler.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
After working with application click Stop Profiling. After analysis You will see profiling results. Select timeline and it shows details.&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/-9ZeUk8eCedA/TlY6ZmcaFmI/AAAAAAAAQm0/vTMzQYBtKv8/s1600/ProfileResults.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="183" src="http://2.bp.blogspot.com/-9ZeUk8eCedA/TlY6ZmcaFmI/AAAAAAAAQm0/vTMzQYBtKv8/s320/ProfileResults.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Update: Finally found MSDN Page, describing&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/hh202934(v=VS.92).aspx"&gt;WP7 Profiler&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2678645086319511182-2302174445935823232?l=www.csharpblog.co.cc' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VxNFosg3FyTLnXI7JCzz1ZLAkQ4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VxNFosg3FyTLnXI7JCzz1ZLAkQ4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VxNFosg3FyTLnXI7JCzz1ZLAkQ4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VxNFosg3FyTLnXI7JCzz1ZLAkQ4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/C-C-sharpening/~4/mkrazWJeZbQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.csharpblog.co.cc/feeds/2302174445935823232/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.csharpblog.co.cc/2011/08/using-wp7-profiler.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/2302174445935823232?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/2302174445935823232?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/C-C-sharpening/~3/mkrazWJeZbQ/using-wp7-profiler.html" title="Using WP7 Profiler" /><author><name>Ernest Poletaev</name><uri>http://www.blogger.com/profile/10001240160904961461</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://2.bp.blogspot.com/_IdGwwinx0YU/TH4EeRXAihI/AAAAAAAAQUA/0XOdvuTLRYg/S220/a_7161c26f.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-EuARu2piJds/TlY3NNUEoHI/AAAAAAAAQms/Qt_fXPLGot0/s72-c/disabled.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.csharpblog.co.cc/2011/08/using-wp7-profiler.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08CSX46cSp7ImA9WhdXEkg.&quot;"><id>tag:blogger.com,1999:blog-2678645086319511182.post-8196377801304265459</id><published>2011-08-25T01:11:00.000-07:00</published><updated>2011-08-25T01:11:08.019-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-25T01:11:08.019-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MSAF" /><category scheme="http://www.blogger.com/atom/ns#" term="WP7" /><title>No more using of MSAF for WP7 Analytics</title><content type="html">While looking for analytics for my WP7 application, i've found &lt;a href="http://msaf.codeplex.com/"&gt;MSAF&lt;/a&gt; - Microsoft Silverlight Analytics Framework. &lt;br /&gt;
&lt;br /&gt;
Project looks great, but first i figured out is have many assemblies and dependencies.&lt;br /&gt;
&lt;br /&gt;
Making test application is almost impossible - lack of clear documentation. Samples also unclear and possible i never tried this framework, but fortunately i've found &lt;a href="http://kodierer.blogspot.com/2010/11/tracking-sales-statistics-with.html"&gt;kodirer blog&lt;/a&gt;. Thanks to Mr. Rene - he has clearly described neccessary steps to work it out.&lt;br /&gt;
&lt;br /&gt;
Sample app with simple static page works well, but when i add it to my panorama application i saw &lt;a href="http://msaf.codeplex.com/workitem/15653"&gt;Crippling Performance Issue&lt;/a&gt;. Issue ticket contains attached "fixed" assembly, which is make issue not so sharp, but still noticable performance decrease.&lt;br /&gt;
&lt;br /&gt;
I found years ago, that some &lt;s&gt;MS&lt;/s&gt; Frameworks, written on best pattern practices is buggy and performance killers. &lt;br /&gt;
&lt;br /&gt;
Only thing is needed is to call Google Analytics site once in application, so why it need to intrude in any kind of events in application. Even if will fixed for this particular issue i cannot be sure about all other cases.&lt;br /&gt;
&lt;br /&gt;
So, it's time to write my own analytics tracker...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2678645086319511182-8196377801304265459?l=www.csharpblog.co.cc' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/iz8rwAG-bVj-l5MVDpJWJX0Nrg8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iz8rwAG-bVj-l5MVDpJWJX0Nrg8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/iz8rwAG-bVj-l5MVDpJWJX0Nrg8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iz8rwAG-bVj-l5MVDpJWJX0Nrg8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/C-C-sharpening/~4/vNv8aRbwB68" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.csharpblog.co.cc/feeds/8196377801304265459/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.csharpblog.co.cc/2011/08/no-more-using-of-msaf-for-wp7-analytics.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/8196377801304265459?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/8196377801304265459?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/C-C-sharpening/~3/vNv8aRbwB68/no-more-using-of-msaf-for-wp7-analytics.html" title="No more using of MSAF for WP7 Analytics" /><author><name>Ernest Poletaev</name><uri>http://www.blogger.com/profile/10001240160904961461</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://2.bp.blogspot.com/_IdGwwinx0YU/TH4EeRXAihI/AAAAAAAAQUA/0XOdvuTLRYg/S220/a_7161c26f.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.csharpblog.co.cc/2011/08/no-more-using-of-msaf-for-wp7-analytics.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcGRXg7eCp7ImA9WhdWGE8.&quot;"><id>tag:blogger.com,1999:blog-2678645086319511182.post-7811775816466951370</id><published>2011-08-06T01:52:00.000-07:00</published><updated>2011-09-12T04:30:24.600-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-12T04:30:24.600-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ListBox" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows Phone 7" /><category scheme="http://www.blogger.com/atom/ns#" term="OnClick" /><category scheme="http://www.blogger.com/atom/ns#" term="Silverlight" /><category scheme="http://www.blogger.com/atom/ns#" term="WP7" /><category scheme="http://www.blogger.com/atom/ns#" term="IsTapEvent" /><title>Handle OnClick Event in ListBox on Silverlight for Windows Phone 7</title><content type="html">Generally on Windows Phone 7 using Silverlight You will use ListBox templates like this one&lt;br /&gt;
&lt;br /&gt;
&lt;div class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;div class="tools"&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;"&gt;view plain&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"&gt;copy to clipboard&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;"&gt;print&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('About',this);return false;"&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol start="1" class="dp-xml"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;ListBox&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;Margin&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"0,0,-12,0"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;ItemsSource&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"{Binding&amp;nbsp;Items}"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;ListBox.ItemTemplate&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;DataTemplate&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;StackPanel&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;Orientation&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"Horizontal"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;Margin&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"0,0,0,17"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="attribute"&gt;MouseLeftButtonDown&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"StackPanel_MouseLeftButtonDown"&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;Image&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;Height&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"150"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;Width&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"150"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;Source&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"{Binding&amp;nbsp;ImageSource}"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;Stretch&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"UniformToFill"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="tag"&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;StackPanel&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;Width&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"311"&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;TextBlock&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;Text&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"{Binding&amp;nbsp;LineOne}"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;TextWrapping&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"Wrap"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;Style&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"{StaticResource&amp;nbsp;PhoneTextExtraLargeStyle}"&lt;/span&gt;&lt;span class="tag"&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag-name"&gt;TextBlock&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;Text&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"{Binding&amp;nbsp;LineTwo}"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;TextWrapping&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"Wrap"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;Margin&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"12,-6,12,0"&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="attribute"&gt;Style&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class="attribute-value"&gt;"{StaticResource&amp;nbsp;PhoneTextSubtleStyle}"&lt;/span&gt;&lt;span class="tag"&gt;/&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;StackPanel&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;StackPanel&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;DataTemplate&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;ListBox.ItemTemplate&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li class=""&gt;&lt;span&gt;&lt;span class="tag"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag-name"&gt;ListBox&lt;/span&gt;&lt;span class="tag"&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;textarea style="display:none;" class="originalCode"&gt;&amp;lt;ListBox Margin="0,0,-12,0" ItemsSource="{Binding Items}" &amp;gt;&lt;br /&gt;
&amp;lt;ListBox.ItemTemplate&amp;gt;&lt;br /&gt;
&amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;StackPanel Orientation="Horizontal" Margin="0,0,0,17"&lt;br /&gt;
MouseLeftButtonDown="StackPanel_MouseLeftButtonDown"&amp;gt;&lt;br /&gt;
&amp;lt;Image Height="150" Width="150" Source="{Binding ImageSource}" Stretch="UniformToFill" /&amp;gt;&lt;br /&gt;
&amp;lt;StackPanel Width="311"&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text="{Binding LineOne}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/&amp;gt;&lt;br /&gt;
&amp;lt;TextBlock Text="{Binding LineTwo}" 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;/StackPanel&amp;gt;&lt;br /&gt;
&amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/ListBox.ItemTemplate&amp;gt;&lt;br /&gt;
&amp;lt;/ListBox&amp;gt;&lt;br /&gt;
&lt;/textarea&gt;&lt;/div&gt;&lt;br /&gt;
But on touch based platform such as Windows Phone 7, &lt;b&gt;MouseLeftButtonDown&lt;/b&gt; will trigger event, even if You try scroll ListBox content. Another aproach is to use  &lt;b&gt;ManipulationCompleted&lt;/b&gt; event. Event arguments have property named &lt;b&gt;IsTapEvent&lt;/b&gt;, but in latest Silverlight SDK this property is declared as &lt;b&gt;Protected&lt;/b&gt;. So You can see it in debugger at runtime, but cannot use in code.&lt;br /&gt;
&lt;br /&gt;
What You can do is subscribe to &lt;b&gt;ManipulationCompleted&lt;/b&gt; event, and check &lt;b&gt;e.TotalManipulation&lt;/b&gt; for &lt;b&gt;Scale&lt;/b&gt; and &lt;b&gt;Transform&lt;/b&gt; properties equals &lt;b&gt;zero&lt;/b&gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;div class="dp-highlighter"&gt;&lt;div class="bar"&gt;&lt;div class="tools"&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;"&gt;view plain&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;"&gt;copy to clipboard&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;"&gt;print&lt;/a&gt;&lt;a href="#" onclick="dp.sh.Toolbar.Command('About',this);return false;"&gt;?&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol start="1" class="dp-cpp"&gt;&lt;li class="alt"&gt;&lt;span&gt;&lt;span class="keyword"&gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="keyword"&gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;StackPanel_ManipulationCompleted(object&amp;nbsp;sender,&amp;nbsp;ManipulationCompletedEventArgs&amp;nbsp;e)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;zero&amp;nbsp;=&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;Point(0,0);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="keyword"&gt;if&lt;/span&gt;&lt;span&gt;(&amp;nbsp;e.TotalManipulation.Scale&amp;nbsp;==&amp;nbsp;zero&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;e.TotalManipulation.Translation&amp;nbsp;==&amp;nbsp;zero&amp;nbsp;)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="alt"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageBox.Show(&lt;span class="string"&gt;"gotcha!"&lt;/span&gt;&lt;span&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=""&gt;&lt;span&gt;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;textarea style="display:none;" class="originalCode"&gt;private void StackPanel_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e)  &lt;br /&gt;
{  &lt;br /&gt;
    var zero = new Point(0,0);  &lt;br /&gt;
    if( e.TotalManipulation.Scale == zero &amp;amp;&amp;amp; e.TotalManipulation.Translation == zero )  &lt;br /&gt;
        MessageBox.Show("gotcha!");  &lt;br /&gt;
}  &lt;/textarea&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2678645086319511182-7811775816466951370?l=www.csharpblog.co.cc' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CJ2RbEJCLrI_agGSP_K-2YPErLk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CJ2RbEJCLrI_agGSP_K-2YPErLk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CJ2RbEJCLrI_agGSP_K-2YPErLk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CJ2RbEJCLrI_agGSP_K-2YPErLk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/C-C-sharpening/~4/fb1b6nhBirA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.csharpblog.co.cc/feeds/7811775816466951370/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.csharpblog.co.cc/2011/08/listbox-item-onclick-silverlight.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/7811775816466951370?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/7811775816466951370?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/C-C-sharpening/~3/fb1b6nhBirA/listbox-item-onclick-silverlight.html" title="Handle OnClick Event in ListBox on Silverlight for Windows Phone 7" /><author><name>Ernest Poletaev</name><uri>http://www.blogger.com/profile/10001240160904961461</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://2.bp.blogspot.com/_IdGwwinx0YU/TH4EeRXAihI/AAAAAAAAQUA/0XOdvuTLRYg/S220/a_7161c26f.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://www.csharpblog.co.cc/2011/08/listbox-item-onclick-silverlight.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UDRnoyfip7ImA9WhdSEE0.&quot;"><id>tag:blogger.com,1999:blog-2678645086319511182.post-1427357076274922009</id><published>2011-07-08T05:49:00.000-07:00</published><updated>2011-07-18T08:01:17.496-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-18T08:01:17.496-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vim" /><category scheme="http://www.blogger.com/atom/ns#" term="nano" /><category scheme="http://www.blogger.com/atom/ns#" term="unix" /><title>Windows compatible keyboard layout for nano editor</title><content type="html">This post is not about C#, but sometimes fortune bring You to some places, where You never been before. For example, may be You need to install Your .NET Web Service on Unix platform. Have You ever have nightmare to edit files in &lt;b&gt;vim&lt;/b&gt;? But not all so bad.&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/-pw5bpjF2g3E/Thp6RoZ8API/AAAAAAAAQiQ/ZCH07eA14a8/s1600/2011-07-11_11-19_Ubuntu.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="241" src="http://3.bp.blogspot.com/-pw5bpjF2g3E/Thp6RoZ8API/AAAAAAAAQiQ/ZCH07eA14a8/s320/2011-07-11_11-19_Ubuntu.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Nano editor is one of convenient text editors in unix. If You ever have trouble with vim (I do) You could find &lt;b&gt;nano&lt;/b&gt; editor very friendly. But unix people make difficult anything that can be very easy. Keyboard layout is unbelievable inconvenient... what authors smoking? Fortunately it can be easy fixed by .nanorc file. Symply make new file &lt;i&gt;.nanorc&lt;/i&gt; in home directory with content followed below. It will make keyboard bindings almost same as on Windows.&lt;br /&gt;
&lt;br /&gt;
After restart nano editor will use standard shortcuts - Ctrl-S for save, Ctrl-O for open files, Ctrl-C for copy, Ctrl-V for paste, etc. Although there is some problem with undo/redo. Seems undo shortcut is hardcoded to Alt-U and Alt-Y for redo.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;~/.nanorc&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;set undo
set autoindent
set mouse

bind ^S writeout main
bind ^O insert main
bind ^G gotoline main
bind ^X cut main
bind ^V uncut main
bind ^C copytext main
bind ^H replace main
bind ^Q exit main
bind ^Z undo main
bind ^F whereis main
bind F3 searchagain main
bind F1 help main
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2678645086319511182-1427357076274922009?l=www.csharpblog.co.cc' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mwWonmEV2sNy2fjfeO1QmwGPIss/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mwWonmEV2sNy2fjfeO1QmwGPIss/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/mwWonmEV2sNy2fjfeO1QmwGPIss/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mwWonmEV2sNy2fjfeO1QmwGPIss/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/C-C-sharpening/~4/CKBOsQCh5Gw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.csharpblog.co.cc/feeds/1427357076274922009/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.csharpblog.co.cc/2011/07/windows-compatible-keyboard-layout-nano.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/1427357076274922009?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/1427357076274922009?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/C-C-sharpening/~3/CKBOsQCh5Gw/windows-compatible-keyboard-layout-nano.html" title="Windows compatible keyboard layout for nano editor" /><author><name>Ernest Poletaev</name><uri>http://www.blogger.com/profile/10001240160904961461</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://2.bp.blogspot.com/_IdGwwinx0YU/TH4EeRXAihI/AAAAAAAAQUA/0XOdvuTLRYg/S220/a_7161c26f.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-pw5bpjF2g3E/Thp6RoZ8API/AAAAAAAAQiQ/ZCH07eA14a8/s72-c/2011-07-11_11-19_Ubuntu.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.csharpblog.co.cc/2011/07/windows-compatible-keyboard-layout-nano.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4BQHY6eip7ImA9WhZWEEk.&quot;"><id>tag:blogger.com,1999:blog-2678645086319511182.post-2789307468416561534</id><published>2011-05-10T04:13:00.000-07:00</published><updated>2011-05-10T08:55:51.812-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-10T08:55:51.812-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Test Driven Development" /><category scheme="http://www.blogger.com/atom/ns#" term="Testing" /><category scheme="http://www.blogger.com/atom/ns#" term="Test" /><category scheme="http://www.blogger.com/atom/ns#" term="Debug" /><category scheme="http://www.blogger.com/atom/ns#" term="Studio" /><category scheme="http://www.blogger.com/atom/ns#" term="Express" /><category scheme="http://www.blogger.com/atom/ns#" term="Visual" /><category scheme="http://www.blogger.com/atom/ns#" term="Integration" /><category scheme="http://www.blogger.com/atom/ns#" term="Debugging" /><category scheme="http://www.blogger.com/atom/ns#" term="NUnit" /><category scheme="http://www.blogger.com/atom/ns#" term="TDD" /><title>Integrate NUnit with Visual Studio Express</title><content type="html">&lt;h3&gt;NUnit Test Application&lt;/h3&gt;C#&amp;nbsp;Project Template&lt;br /&gt;
&lt;br /&gt;
Integrated tests with Visual Studio, including Visual C# Express version&lt;br /&gt;
Self contained NUnit&amp;nbsp;console runner. Allow to write test fixtures and test, running from Visual Studio simply by pressing F5 (support test debugging), or Ctrl-F5 free run with results in console window. In case of test failure indicate by beep sound.&lt;br /&gt;
&lt;br /&gt;
Contains essential NUnit modules to start test project. No external dependencies. Simply create new project, using&amp;nbsp;NUnit Test Application template.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Download&lt;/h2&gt;&lt;a href="http://visualstudiogallery.msdn.microsoft.com/b8a7a8fa-9f5a-4b9b-8e8b-8839a4364f26"&gt;download template&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Links&lt;/h2&gt;&lt;br /&gt;
&lt;a href="http://www.nunit.org/"&gt;http://www.nunit.org&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2678645086319511182-2789307468416561534?l=www.csharpblog.co.cc' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/gB08t08d7rgOIiSqjLpFgNQ-F7k/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gB08t08d7rgOIiSqjLpFgNQ-F7k/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/gB08t08d7rgOIiSqjLpFgNQ-F7k/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gB08t08d7rgOIiSqjLpFgNQ-F7k/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/C-C-sharpening/~4/75sgBdsJBpE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.csharpblog.co.cc/feeds/2789307468416561534/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.csharpblog.co.cc/2011/05/integrate-nunit-with-visual-studio.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/2789307468416561534?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/2789307468416561534?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/C-C-sharpening/~3/75sgBdsJBpE/integrate-nunit-with-visual-studio.html" title="Integrate NUnit with Visual Studio Express" /><author><name>Ernest Poletaev</name><uri>http://www.blogger.com/profile/10001240160904961461</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://2.bp.blogspot.com/_IdGwwinx0YU/TH4EeRXAihI/AAAAAAAAQUA/0XOdvuTLRYg/S220/a_7161c26f.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.csharpblog.co.cc/2011/05/integrate-nunit-with-visual-studio.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YERH0_eSp7ImA9WhZUEUo.&quot;"><id>tag:blogger.com,1999:blog-2678645086319511182.post-7612007639741785896</id><published>2011-04-30T01:10:00.000-07:00</published><updated>2011-06-04T00:05:05.341-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-04T00:05:05.341-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Application" /><category scheme="http://www.blogger.com/atom/ns#" term="WPF" /><category scheme="http://www.blogger.com/atom/ns#" term="Template" /><category scheme="http://www.blogger.com/atom/ns#" term="Easy" /><category scheme="http://www.blogger.com/atom/ns#" term="globalize" /><category scheme="http://www.blogger.com/atom/ns#" term="Visual" /><category scheme="http://www.blogger.com/atom/ns#" term="localization" /><category scheme="http://www.blogger.com/atom/ns#" term="globalization" /><category scheme="http://www.blogger.com/atom/ns#" term="Localize" /><category scheme="http://www.blogger.com/atom/ns#" term="CodeProject" /><category scheme="http://www.blogger.com/atom/ns#" term="Studio" /><category scheme="http://www.blogger.com/atom/ns#" term="solution" /><category scheme="http://www.blogger.com/atom/ns#" term="multi-language" /><title>Easy Localize WPF Application via Visual Studio Template</title><content type="html">&lt;h2&gt;Background&lt;/h2&gt;Localizing a WPF application is not an easy task. Almost any article on the localization of WPF is replete with details and manual steps toimplementation a localized application.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Existing solutions&lt;/h2&gt;Localization using the utility LocBaml are described in the localization of Microsoft has lots of advantages, but difficult to maintain. André van heerwaarde in his article proposed to simplify this decision by the configured build step. He wrote an utility to merge the translated text fragments. However, in his article, still many manual steps.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Visual Studio Project Template&lt;/h2&gt;I propose to use a Localized WPF Application template, I've created to start working on a multilingual WPF application. Project created using this template already contains all the necessary tools for localization, as well as the maximum automates the localization process.&lt;br /&gt;During application development, you add a new XAML file without having to worry about localization. Upon completion of the changes simply build project.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Custom build step will call msbuild / t: updateuid [Project Name].csproj. This step will automatically add x:Uid at every element containing the text elements.&lt;/li&gt;&lt;li&gt;Then in the build process will start automatically LocBaml, which finds all text elements in the XAML file and generates a CSV file containing the text elements.&lt;/li&gt;&lt;li&gt;The next step will run the utility from MergeLocBamlCsv André van heerwaarde. As a result, earlier translated segments will be merged with the new. &lt;/li&gt;&lt;li&gt;Utility StripLocBamlCsv Cut unused items from the CSV file.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The only thing you have to do manually is to add new languages ​​and the actual translation itself.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Adding a new language&lt;/h2&gt;To add a new language in the draft you will have:&lt;br /&gt;copy the location of the neutral language in the new CSV file&lt;br /&gt;&lt;pre class="brush: plain"&gt;copy Translation\Translate.csv Translation\Translate.ru-RU.csv&lt;/pre&gt;&lt;br /&gt;open the project file in a text editor and after lines:&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;LocBamlCsv Include="Translation\Translate.de-DE.csv"&amp;gt;&lt;br /&gt;  &amp;lt;Culture&amp;gt;de-DE&amp;lt;/Culture&amp;gt;&lt;br /&gt;&amp;lt;/LocBamlCsv&amp;gt;&lt;/pre&gt;&lt;br /&gt;add a new language, for example:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;LocBamlCsv Include="Translation\Translate.ru-RU.csv"&amp;gt;&lt;br /&gt;  &amp;lt;Culture&amp;gt;ru-RU&amp;lt;/Culture&amp;gt;&lt;br /&gt;&amp;lt;/LocBamlCsv&amp;gt;&lt;/pre&gt;&lt;br /&gt;Then you need to reopen the project in Visual Studio, if the project was already open, the IDE will ask whether you wish to reopen the project to reflect the changes, answer 'Yes'.&lt;br /&gt;If you did not make mistakes, then the newly open project folder Translation will be a new file Translate.ru-RU.csv&lt;br /&gt;&lt;br /&gt;Start the assembly to update the translation files, then you can open a new file and start translating.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Localize text in code behind&lt;/h2&gt;StringResources.xaml is a Resource Dictionary example for translated strings:&lt;br /&gt;&lt;pre class="brush: xml"&gt;&amp;lt;ResourceDictionary&lt;br /&gt;   x:Uid="ResourceDictionary_1" &lt;br /&gt;   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"   &lt;br /&gt;   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&lt;br /&gt;   xmlns:system="clr-namespace:System;assembly=mscorlib"&amp;gt;&lt;br /&gt;    &amp;lt;!-- String resource that can be localized --&amp;gt;&lt;br /&gt;    &amp;lt;system:String x:Uid="system:String_1"&lt;br /&gt;      x:Key="TestString1"&amp;gt;Test&amp;lt;/system:String&amp;gt;&lt;br /&gt;    &amp;lt;system:String x:Uid="system:String_2"&lt;br /&gt;      x:Key="MainWindow"&amp;gt;Main Window&amp;lt;/system:String&amp;gt;&lt;br /&gt;&amp;lt;/ResourceDictionary&amp;gt;&lt;/pre&gt;Usage as easy as:&lt;br /&gt;&lt;pre class="brush: csharp"&gt;this.Title = (string)FindResource("MainWindow");&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;Links and credits&lt;/h2&gt;&lt;br /&gt;&lt;a href="http://wpflocalization.codeplex.com/"&gt;WPF Localization Guidance&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms788718.aspx"&gt;WPF Globalization and Localization Overview&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.codeproject.com/KB/WPF/LocBamlClickOnce.aspx"&gt;LocBaml + MsBuild + ClickOnce Deployment&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Downloads&lt;/h2&gt;&lt;br /&gt;&lt;a href="http://visualstudiogallery.msdn.microsoft.com/7b8a8c13-0a7b-481f-b1f9-08e085448bdc"&gt;Localizable WPF Project&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeproject.com/script/Membership/View.aspx?mid=714984" style="display:none" rel="tag"&gt;CodeProject&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2678645086319511182-7612007639741785896?l=www.csharpblog.co.cc' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rA4EEq5QvQDL9UVW1gWPrSMmuNQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rA4EEq5QvQDL9UVW1gWPrSMmuNQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/rA4EEq5QvQDL9UVW1gWPrSMmuNQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rA4EEq5QvQDL9UVW1gWPrSMmuNQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/C-C-sharpening/~4/ldGWHCU54Kc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.csharpblog.co.cc/feeds/7612007639741785896/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.csharpblog.co.cc/2011/04/easy-localize-wpf-application.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/7612007639741785896?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/7612007639741785896?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/C-C-sharpening/~3/ldGWHCU54Kc/easy-localize-wpf-application.html" title="Easy Localize WPF Application via Visual Studio Template" /><author><name>Ernest Poletaev</name><uri>http://www.blogger.com/profile/10001240160904961461</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://2.bp.blogspot.com/_IdGwwinx0YU/TH4EeRXAihI/AAAAAAAAQUA/0XOdvuTLRYg/S220/a_7161c26f.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://www.csharpblog.co.cc/2011/04/easy-localize-wpf-application.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMAQHo8cCp7ImA9WhZUEUs.&quot;"><id>tag:blogger.com,1999:blog-2678645086319511182.post-6910550430626118529</id><published>2010-11-06T02:24:00.001-07:00</published><updated>2011-06-03T22:14:01.478-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-03T22:14:01.478-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MSI" /><category scheme="http://www.blogger.com/atom/ns#" term="Wrap installer" /><category scheme="http://www.blogger.com/atom/ns#" term="Wix" /><category scheme="http://www.blogger.com/atom/ns#" term="Convert to msi" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows Installer" /><title>MSI wrapper for any installer using Wix</title><content type="html">Last time we make windows installer package using MakeMsi compiler. Now we will make same using Wix. Wix is XML based setup compiler for Windows Installer format.&lt;br /&gt;
We will make simpliest as possible setup package wrapping existing installer, InnoSetup for example.&lt;br /&gt;
First we need make directory tree, required element is TARGETDIR Directory&lt;br /&gt;
&lt;pre class="xml brush: xml"&gt;&amp;lt;Directory Id='TARGETDIR' Name='SourceDir'&amp;gt;&lt;/pre&gt;Inside we will describe temporary folder for wrapped package&lt;br /&gt;
&lt;pre name="code" class="xml brush: xml"&gt;&amp;lt;!-- temp folder --&amp;gt;
&amp;lt;Directory Id='TempFolder'&amp;gt;
   &amp;lt;Component Id='my_setup' 
        Guid='{YOUR-GUID-HERE-8148-2F82D9E7B4AE}'&amp;gt;
        &amp;lt;File Id="mysetup_exe" Source="mysetup.exe" /&amp;gt; 
   &amp;lt;/Component&amp;gt;
&amp;lt;/Directory&amp;gt;&lt;/pre&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Component is required element to describe File entry, and it should be referred in Feature.&lt;br /&gt;
&lt;pre class="xml brush: xml" name="code"&gt;&amp;lt;Feature Id="MainApplication" Title="Main Application" Level="1"&amp;gt;
    &amp;lt;ComponentRef Id="my_setup" /&amp;gt;
&amp;lt;/Feature&amp;gt;&lt;/pre&gt;For choose destination folder for wrapped package we will describe Directory inside Program Files folder&lt;br /&gt;
&lt;pre class="xml brush: xml" name="code"&gt;&amp;lt;!-- PF folder --&amp;gt;
    &amp;lt;Directory Id="ProgramFilesFolder"&amp;gt;
        &amp;lt;Directory Id="INSTALLLOCATION" Name="MyApp" /&amp;gt;
    &amp;lt;/Directory&amp;gt;&lt;/pre&gt;To assign this directory from Windows Installer dialogs we will describe Property&lt;br /&gt;
&lt;pre class="xml brush: xml" name="code"&gt;&amp;lt;Property Id="WIXUI_INSTALLDIR" Value="INSTALLLOCATION" &amp;gt;&amp;lt;/Property&amp;gt;&lt;/pre&gt;For show dialog we need to use special feature of Wix. It will use simple dialogs sequence including destination folder path.&lt;br /&gt;
&lt;pre class="xml brush: xml" name="code"&gt;&amp;lt;UIRef Id="WixUI_InstallDir" /&amp;gt;&lt;/pre&gt;We will need to describe base properties of our setup package, it should be root of xml tree&lt;br /&gt;
&lt;pre class="xml brush: xml" name="code"&gt;&amp;lt;?xml version='1.0'?&amp;gt;
&amp;lt;Wix xmlns='&lt;a href="http://schemas.microsoft.com/wix/2006/wi'"&gt;http://schemas.microsoft.com/wix/2006/wi'&lt;/a&gt;&amp;gt;

&amp;lt;Product Id='{YOUR-GUID-HERE-A1BC-F3AB137A3E8A}' 
    Name='My Application' Language='1033' 
    Version='2.0.0.0' Manufacturer='My Company' UpgradeCode='{YOUR-GUID-HERE-A1BC-F3AB137A3E8A}' &amp;gt;

    &amp;lt;Package InstallerVersion="300" Compressed="yes"/&amp;gt;
    &amp;lt;Media Id="1" Cabinet="myprog.cab" EmbedCab="yes" /&amp;gt;
&lt;/pre&gt;Well, anything is looks good, but by default resulting setup package will show License agreement with Common Public License by default. If your package no need to show license agreement, you have to use some trick, adding folowing code:&lt;br /&gt;
&lt;pre class="xml brush: xml" name="code"&gt;&amp;lt;UI&amp;gt;
  &amp;lt;UIRef Id="WixUI_InstallDir" /&amp;gt;
  &amp;lt;!-- skip licence dialog --&amp;gt;
  &amp;lt;Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg" Order="2"&amp;gt;1&amp;lt;/Publish&amp;gt;
  &amp;lt;Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2"&amp;gt;1&amp;lt;/Publish&amp;gt;
&amp;lt;/UI&amp;gt;
&lt;/pre&gt;And finally we will run wrapped package, describing custom action:  &lt;br /&gt;
&lt;pre class="xml brush: xml" name="code"&gt;&amp;lt;CustomAction Id="run_setup" 
          FileKey="mysetup_exe"
          ExeCommand="/SP- /SILENT /SUPPRESSMSGBOXES /LANG=English /NOCANCEL /DIR=&amp;amp;quot;[INSTALLLOCATION]&amp;amp;quot;" 
          Execute="deferred"
          Impersonate="no"
          Return="check" /&amp;gt;&lt;/pre&gt;Also need to add this custom action to setup sequence, run only if not installed:&lt;br /&gt;
&lt;pre class="xml brush: xml" name="code"&gt;&amp;lt;InstallExecuteSequence&amp;gt;
   &amp;lt;Custom Action="run_setup" Sequence='5401'&amp;gt;NOT Installed&amp;lt;/Custom&amp;gt;
&amp;lt;/InstallExecuteSequence&amp;gt;&lt;/pre&gt;&lt;h2&gt;Download&lt;/h2&gt;Download full sample:&lt;br /&gt;
&lt;a href="http://ernest.my3space.ru/downloads/wrapper.wix.txt"&gt;wrapper.wix&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2678645086319511182-6910550430626118529?l=www.csharpblog.co.cc' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hWTByfKfBTKqfu8JhNF4FkIfalQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hWTByfKfBTKqfu8JhNF4FkIfalQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hWTByfKfBTKqfu8JhNF4FkIfalQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hWTByfKfBTKqfu8JhNF4FkIfalQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/C-C-sharpening/~4/IYq-_8U5fZo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.csharpblog.co.cc/feeds/6910550430626118529/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.csharpblog.co.cc/2010/11/msi-wrapper-for-any-installer-using-wix.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/6910550430626118529?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/6910550430626118529?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/C-C-sharpening/~3/IYq-_8U5fZo/msi-wrapper-for-any-installer-using-wix.html" title="MSI wrapper for any installer using Wix" /><author><name>Ernest Poletaev</name><uri>http://www.blogger.com/profile/10001240160904961461</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://2.bp.blogspot.com/_IdGwwinx0YU/TH4EeRXAihI/AAAAAAAAQUA/0XOdvuTLRYg/S220/a_7161c26f.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.csharpblog.co.cc/2010/11/msi-wrapper-for-any-installer-using-wix.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IERHw9eip7ImA9WhZWFk0.&quot;"><id>tag:blogger.com,1999:blog-2678645086319511182.post-869416472093004283</id><published>2010-11-05T00:54:00.001-07:00</published><updated>2011-05-16T20:05:05.262-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-16T20:05:05.262-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MSI" /><category scheme="http://www.blogger.com/atom/ns#" term="Convert to msi" /><category scheme="http://www.blogger.com/atom/ns#" term="MakeMsi" /><category scheme="http://www.blogger.com/atom/ns#" term="EXE to MSI" /><category scheme="http://www.blogger.com/atom/ns#" term="Installer" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows Installer" /><category scheme="http://www.blogger.com/atom/ns#" term="InnoSetup" /><title>Make MSI from InnoSetup installer</title><content type="html">Last time my company customers ask for installer in Windows Installer MSI format. Company product is complex system, containing thousands of files and plenty of tasks. It cannot be quickly ported to other installer system. But result need to be ASAP.&lt;br /&gt;
&lt;br /&gt;
Windows installer is complex product too, and even Microsoft itself make open source XML based project Wix to simplify tasks. Other good project is &lt;a href="http://dennisbareis.com/makemsi.htm"&gt;MakeMsi&lt;/a&gt;, used simply text files to describe tasks.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I found MakeMsi reach featured and easy to use. First what you will need is to &lt;a href="http://dennisbareis.com/zips_fw/makemsi.zip"&gt;download&lt;/a&gt; and install MakeMsi. Second thing is to look samples. Copying TryMe sample is good point to start. Files TryMe.mm and Try.ver is enough for beginning. Right click on TryME.mm in explorer and choose Build MSI. It will generate sample MSI installer file.&lt;br /&gt;
&lt;br /&gt;
What we need next is to change some properties in source files to change labels on result installer. If you see something not in your source files, you can search MakeMsi folder and copy any files to your source directory and change them. When anything is looks great, we can go to run your old InnoSetup installer.&lt;br /&gt;
&lt;br /&gt;
First, what I try to use Binary Table to store old installer, it works well for generic executable, but seems have issues with InnoSetup. I have to choose copying old installer to temporary folder and execute from msi installer.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: xml"&gt;&amp;lt;$DirectoryTree Key="INSTALLDIR" Dir="c:\program files\YourProduct" CHANGE="\" PrimaryFolder="Y"&amp;gt;
&amp;lt;$Directory Key="TMP" PARENT="TempFolder" Dir="inst" &amp;gt;
&amp;lt;$Files "YourProduct.exe" DestDir="TMP"&amp;gt;
#(
   &amp;lt;$ExeCa
;;      Binary="YourProduct.exe"
  EXE="[TMP]YourProduct.exe"
  Args=^/SP- /SILENT /SUPPRESSMSGBOXES /LANG=English /NOCANCEL /DIR="[INSTALLDIR]"^
  Description="Performing installation"
   CONDITION=^&amp;lt;$VBSCA_CONDITION_INSTALL_ONLY&amp;gt;^
  Type="Deferred System Sync"
  Rc0="N"
  Seq="InstallODBC-"
   &amp;gt;
#)&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2678645086319511182-869416472093004283?l=www.csharpblog.co.cc' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/W4Xr2gDf4Q-k9e3kQ6N4XeMjTsc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/W4Xr2gDf4Q-k9e3kQ6N4XeMjTsc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/W4Xr2gDf4Q-k9e3kQ6N4XeMjTsc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/W4Xr2gDf4Q-k9e3kQ6N4XeMjTsc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/C-C-sharpening/~4/dvP5FGI8ObE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.csharpblog.co.cc/feeds/869416472093004283/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.csharpblog.co.cc/2010/11/make-msi-from-innosetup-installer.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/869416472093004283?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/869416472093004283?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/C-C-sharpening/~3/dvP5FGI8ObE/make-msi-from-innosetup-installer.html" title="Make MSI from InnoSetup installer" /><author><name>Ernest Poletaev</name><uri>http://www.blogger.com/profile/10001240160904961461</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://2.bp.blogspot.com/_IdGwwinx0YU/TH4EeRXAihI/AAAAAAAAQUA/0XOdvuTLRYg/S220/a_7161c26f.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.csharpblog.co.cc/2010/11/make-msi-from-innosetup-installer.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0ENR3s9fip7ImA9WhZWFk0.&quot;"><id>tag:blogger.com,1999:blog-2678645086319511182.post-6576533624960345972</id><published>2010-09-22T12:31:00.000-07:00</published><updated>2011-05-16T20:08:16.566-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-16T20:08:16.566-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="code highlighting" /><category scheme="http://www.blogger.com/atom/ns#" term="Syntax Highlighting Control" /><category scheme="http://www.blogger.com/atom/ns#" term="syntax highlighting" /><category scheme="http://www.blogger.com/atom/ns#" term="scintilla" /><category scheme="http://www.blogger.com/atom/ns#" term="ICSharpCode.TextEditor" /><category scheme="http://www.blogger.com/atom/ns#" term="free syntax highlighting control" /><title>Add Syntax Highlighting Control</title><content type="html">&lt;h2&gt;Background&lt;/h2&gt;How to choose free, easy to use, extendable and good quality syntax highlighting control for .NET program?&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Scintilla&lt;/h2&gt;First, what i have try to use, was ScintillaNet, but i have no luck to get it worked in test program. It need to setup before use, require unmanaged companion library, what make difficult to multiplatform use. After all i see my Visual Studio C# 2010 Express very unstable, after adding ScintillaNet control to Toolbox. After many experiments i get it worked, but result seems unstable and unrepeatable. Personally i not recommend to use Scintilla in .NET application, but possible it good choice for C++ project.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;ICSharpCode.TextEditor&lt;/h2&gt;After searching i found editor control from a well known open source IDE SharpDevelop. Syntax Highlighting Text Editor Control looks very good and light after Scintilla. It requires less time to load and seems much more stable. &lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Get It Worked&lt;/h2&gt;First what need to do is add assembly reference to a project. Next you choose assembly and controls for Visual Studio Toolbox. After that you can put control to the Form. Surprising you will not see Property to choose syntax highlight schema. Instead of this you have to use method &lt;i&gt;SetHighlighting&lt;/i&gt;. String parameter sets highlighting schema from available schemas list. These schemas embedded into control. &lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;License Issues&lt;/h2&gt;ICSharpCode.TextEditor available under LGPL license, which means you can use this software component for free in open source or commercial application if you not made own modification to licensed component.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Adding new highlight schema&lt;/h2&gt;What if list of embedded schemas is not enough for your application? You can add own, using files, as well described in &lt;a href="http://wiki.sharpdevelop.net/Syntax%20highlighting.ashx"&gt;article&lt;/a&gt; on SharpDevelop Wiki. But what if not like to waste disk space with multiple files or cannot use external files in your application? If you add new schema to control's assembly, according with rules of LGPL, you have to provide source of modified control. It can make problem for distributing in propiertary software.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Embedding highlight schema&lt;/h2&gt;What we need to embed schema into application? You have to realize own schema provider. It is really easy, if you look for original resource schema provider source code. We use it as example. Add new class to application:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;public class AppSyntaxModeProvider : ISyntaxModeFileProvider
{
 List&lt; syntaxmode &gt; syntaxModes = null;
 
 public ICollection&lt; syntaxmode &gt; SyntaxModes {
  get {
   return syntaxModes;
  }
 }

 public AppSyntaxModeProvider()
 {
  Assembly assembly = Assembly.GetExecutingAssembly();

  //enumerate resource names if need
  //foreach (string resourceName in assembly.GetManifestResourceNames()){}

  //load modes list
  Stream syntaxModeStream = assembly.GetManifestResourceStream("WindowsFormsApplication1.Resources.SyntaxModes.xml");
  if (syntaxModeStream != null) {
   syntaxModes = SyntaxMode.GetSyntaxModes(syntaxModeStream);
  } else {
   syntaxModes = new List&lt; syntaxmode &gt;();
  }
 }
 
 public XmlTextReader GetSyntaxModeFile(SyntaxMode syntaxMode)
 {
  Assembly assembly = Assembly.GetExecutingAssembly();

  // load syntax schema
  Stream stream = assembly.GetManifestResourceStream("WindowsFormsApplication1.Resources." + syntaxMode.FileName);
  return new XmlTextReader(stream);
 }
 
 public void UpdateSyntaxModeList()
 {
  // resources don't change during runtime
 }
}
&lt;/pre&gt;&lt;br /&gt;
&lt;h2&gt;Add schema files to embedded resources&lt;/h2&gt;When we finish with provider we can embed schema files to application. We will need at least two files: SyntaxModes.xml and schema file, SQL-Mode.xshd for example, if we provide SQL syntax mode. I add to project new folder, named Resources, add files and choose in Properties Build Action - Embedded Resource. &lt;br /&gt;
&lt;br /&gt;
SyntaxModes.xml file should contain all added schema description, in our example only one:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: xml"&gt;&lt;syntaxmodes version="1.0"&gt;
 &lt;mode extensions=".sql" file="SQL-Mode.xshd" name="SQL"&gt;
&lt;/mode&gt;&lt;/syntaxmodes&gt;
&lt;/pre&gt;&lt;br /&gt;
File, containing SQL schema i took from Paul Kohler's MiniSqlQuery, released under the terms of the Microsoft Public License (http://pksoftware.net/MiniSqlQuery/).&lt;br /&gt;
&lt;br /&gt;
Be carefull to provide right names of embedded resource for embedded files. Generally it [assembly.namespace].[folder].[file.name]&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Attach schema provider to control&lt;/h2&gt;&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;// Attach to the text editor.
HighlightingManager.Manager.AddSyntaxModeFileProvider(
  new AppSyntaxModeProvider());
&lt;/pre&gt;&lt;br /&gt;
&lt;h2&gt;Select syntax schema&lt;/h2&gt;&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;editorControl.SetHighlighting("SQL");
&lt;/pre&gt;&lt;br /&gt;
&lt;h2&gt;Putting all together&lt;/h2&gt;Example for this article contains good base to experiments. I add Property Editor to play with properties of editor control. Sample application can be used to study features of ICSharpCode.TextEditor&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/_IdGwwinx0YU/TJpWJQWkFHI/AAAAAAAAQVc/Ay1SmgB1FCI/s1600/2010-09-23_02-16.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_IdGwwinx0YU/TJpWJQWkFHI/AAAAAAAAQVc/Ay1SmgB1FCI/s1600/2010-09-23_02-16.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
When you set highlighting schema, keep in mind, that name is case sensitive and should exactly match name described in schema files.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Links and credits&lt;/h2&gt;&lt;br /&gt;
&lt;a href="http://icsharpcode.net/OpenSource/SD/Default.aspx"&gt;SharpDevelop Web Site&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://wiki.sharpdevelop.net/Syntax%20highlighting.ashx"&gt;SharpDevelop Wiki&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.pksoftware.net/MiniSqlQuery/"&gt;Paul Kohler's MiniSqlQuery&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.amazon.com/gp/product/1861008171?ie=UTF8&amp;tag=ccsh-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1861008171"&gt;Dissecting a C# Application: Inside SharpDevelop&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=ccsh-20&amp;l=as2&amp;o=1&amp;a=1861008171" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Downloads&lt;/h2&gt;&lt;br /&gt;
&lt;a href="http://sites.google.com/site/blat4444/downloads/code_highlight.zip?attredirects=0&amp;d=1"&gt;Download sample code&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2678645086319511182-6576533624960345972?l=www.csharpblog.co.cc' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/IQLF6EaeztJ4FZFnW563UEZiqUk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IQLF6EaeztJ4FZFnW563UEZiqUk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/IQLF6EaeztJ4FZFnW563UEZiqUk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IQLF6EaeztJ4FZFnW563UEZiqUk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/C-C-sharpening/~4/eFzuDxzgwBo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.csharpblog.co.cc/feeds/6576533624960345972/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.csharpblog.co.cc/2010/09/syntax-highlighting-control.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/6576533624960345972?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/6576533624960345972?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/C-C-sharpening/~3/eFzuDxzgwBo/syntax-highlighting-control.html" title="Add Syntax Highlighting Control" /><author><name>Ernest Poletaev</name><uri>http://www.blogger.com/profile/10001240160904961461</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://2.bp.blogspot.com/_IdGwwinx0YU/TH4EeRXAihI/AAAAAAAAQUA/0XOdvuTLRYg/S220/a_7161c26f.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_IdGwwinx0YU/TJpWJQWkFHI/AAAAAAAAQVc/Ay1SmgB1FCI/s72-c/2010-09-23_02-16.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.csharpblog.co.cc/2010/09/syntax-highlighting-control.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UNQ3ozfip7ImA9WhZWFk0.&quot;"><id>tag:blogger.com,1999:blog-2678645086319511182.post-6330051615595689542</id><published>2010-09-04T10:11:00.000-07:00</published><updated>2011-05-16T20:01:32.486-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-16T20:01:32.486-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SQL CE" /><category scheme="http://www.blogger.com/atom/ns#" term="example" /><category scheme="http://www.blogger.com/atom/ns#" term="ADO.NET" /><category scheme="http://www.blogger.com/atom/ns#" term="schema" /><category scheme="http://www.blogger.com/atom/ns#" term="ALTER TABLE" /><category scheme="http://www.blogger.com/atom/ns#" term="change database" /><category scheme="http://www.blogger.com/atom/ns#" term="upgrade database" /><category scheme="http://www.blogger.com/atom/ns#" term="add field" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL" /><title>Check And Upgrade Existing Database</title><content type="html">How to change database schema, adding or deleting field or table, to be sure of new version of application will work correctly and existing users not lose their data?&lt;br /&gt;
&lt;br /&gt;
You working on application and have customers. One wonderful day customer ask you for new functionality. But you see it need to change database scheme. You made local changes, but many customers have old database. How to upgrade existing database, not harming to customers data. Make migration script and copy data from old database to new one? Not so good way.&lt;br /&gt;
&lt;br /&gt;
What about programmatically change database schema on fly? For example you have table 'customers' and need to add field 'mob_phone'; You can use SQL statement to add field, only need to care if database schema already up to date.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;class DatabaseChecker
{
 private static void ExecuteCommand(string queryString,
  SqlCeConnection connection)
 {
  SqlCeCommand command = new SqlCeCommand(queryString, connection);
  command.ExecuteNonQuery();
 }

 static bool SuccessQuery(string queryString,
  SqlCeConnection connection)
 {
  try
  {
   ExecuteCommand(queryString, connection);
  }
  catch (Exception e)
  {
   return false;
  }
  return true;
 }

 private static bool UpgradeDatabase( string connection_string )
 {
  using (SqlCeConnection connection = new SqlCeConnection(connection_string))
  {
   connection.Open();

   // Check if we already have this field
   if (!SuccessQuery("SELECT COUNT(*) FROM customers WHERE mob_phone=''", connection))
   {
    // Add field to table
    ExecuteCommand("ALTER TABLE customers ADD mob_phone nvarchar(20)", connection);
   }

   connection.Close();
  }
  return true;
 }
}
&lt;/pre&gt;&lt;br /&gt;
More about databases in .NET: &lt;a href="http://www.amazon.com/gp/product/1590595122?ie=UTF8&amp;tag=ccsh-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1590595122"&gt;Pro ADO.NET 2.0 (Expert's Voice)&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=ccsh-20&amp;l=as2&amp;o=1&amp;a=1590595122" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2678645086319511182-6330051615595689542?l=www.csharpblog.co.cc' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jYpWg7qPMhXBTR-9IxitiyPaNoM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jYpWg7qPMhXBTR-9IxitiyPaNoM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/jYpWg7qPMhXBTR-9IxitiyPaNoM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jYpWg7qPMhXBTR-9IxitiyPaNoM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/C-C-sharpening/~4/h87d2QB8B6Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.csharpblog.co.cc/feeds/6330051615595689542/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.csharpblog.co.cc/2010/09/check-and-upgrade-existing-database.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/6330051615595689542?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/6330051615595689542?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/C-C-sharpening/~3/h87d2QB8B6Y/check-and-upgrade-existing-database.html" title="Check And Upgrade Existing Database" /><author><name>Ernest Poletaev</name><uri>http://www.blogger.com/profile/10001240160904961461</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://2.bp.blogspot.com/_IdGwwinx0YU/TH4EeRXAihI/AAAAAAAAQUA/0XOdvuTLRYg/S220/a_7161c26f.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.csharpblog.co.cc/2010/09/check-and-upgrade-existing-database.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0ANQXY-eip7ImA9WhZWFk0.&quot;"><id>tag:blogger.com,1999:blog-2678645086319511182.post-4019668837224144788</id><published>2010-09-02T01:07:00.000-07:00</published><updated>2011-05-16T20:09:50.852-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-16T20:09:50.852-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GDI+" /><category scheme="http://www.blogger.com/atom/ns#" term="enumerate" /><category scheme="http://www.blogger.com/atom/ns#" term="embedded" /><category scheme="http://www.blogger.com/atom/ns#" term=".net" /><category scheme="http://www.blogger.com/atom/ns#" term="WinForms" /><category scheme="http://www.blogger.com/atom/ns#" term="GDI" /><category scheme="http://www.blogger.com/atom/ns#" term="GetManifestResourceNames" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="Resource" /><title>Enumerate Embedded Resource Names</title><content type="html">How to know and enumerate names of all resources, embedded into assembly?&lt;br /&gt;
&lt;br /&gt;
Well, we know how to load embedded font to memory from resources, but...&amp;nbsp;stream, returned from&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/xc4235zt.aspx"&gt;GetManifestResourceStream&lt;/a&gt;&amp;nbsp;is always null??&lt;br /&gt;
&lt;br /&gt;
Ok, you have to be sure about resource name. In general resource name consists from {assembly namespace}.{folder}.{file name}. If your resource not in folder at solution space than it simply&amp;nbsp;{assembly namespace}.{file name}. And at last property of file should be "Embedded Resource".&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
If you not sure about resource names in your application, you can enumerate available resources.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;Assembly executingAssembly = Assembly.GetExecutingAssembly();

foreach ( string resourceName in executingAssembly.GetManifestResourceNames() )
{
  listBox1.Items.Add( resourceName );
}
&lt;/pre&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_IdGwwinx0YU/TH-6ZGpyKOI/AAAAAAAAQUo/PnzplnBBOcc/s1600/2010-09-02_14-43.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_IdGwwinx0YU/TH-6ZGpyKOI/AAAAAAAAQUo/PnzplnBBOcc/s320/2010-09-02_14-43.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a href="https://sites.google.com/site/blat4444/downloads/enumerate_resources.zip?attredirects=0&amp;amp;d=1"&gt;Download&lt;/a&gt; code sample&lt;br /&gt;
&lt;br /&gt;
Read &lt;a href="http://www.amazon.com/gp/product/1932394656?ie=UTF8&amp;amp;tag=ccsh-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1932394656"&gt;Windows Forms in Action: Second Edition of Windows Forms Programming with C#&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=ccsh-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1932394656" style="border: none !important; margin: 0px !important;" width="1" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2678645086319511182-4019668837224144788?l=www.csharpblog.co.cc' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/GzxlQZcoZucUSamcXVo1UNlGESg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GzxlQZcoZucUSamcXVo1UNlGESg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/GzxlQZcoZucUSamcXVo1UNlGESg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GzxlQZcoZucUSamcXVo1UNlGESg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/C-C-sharpening/~4/RIHIWLFgQgI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.csharpblog.co.cc/feeds/4019668837224144788/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.csharpblog.co.cc/2010/09/enumerate-resources.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/4019668837224144788?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/4019668837224144788?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/C-C-sharpening/~3/RIHIWLFgQgI/enumerate-resources.html" title="Enumerate Embedded Resource Names" /><author><name>Ernest Poletaev</name><uri>http://www.blogger.com/profile/10001240160904961461</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://2.bp.blogspot.com/_IdGwwinx0YU/TH4EeRXAihI/AAAAAAAAQUA/0XOdvuTLRYg/S220/a_7161c26f.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_IdGwwinx0YU/TH-6ZGpyKOI/AAAAAAAAQUo/PnzplnBBOcc/s72-c/2010-09-02_14-43.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.csharpblog.co.cc/2010/09/enumerate-resources.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEEERnk5fCp7ImA9WhZWFk0.&quot;"><id>tag:blogger.com,1999:blog-2678645086319511182.post-7373719616159146486</id><published>2010-09-01T21:19:00.000-07:00</published><updated>2011-05-16T20:23:27.724-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-16T20:23:27.724-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GDI+" /><category scheme="http://www.blogger.com/atom/ns#" term=".net" /><category scheme="http://www.blogger.com/atom/ns#" term="AddMemoryFont" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="Embedding" /><category scheme="http://www.blogger.com/atom/ns#" term="GDI" /><category scheme="http://www.blogger.com/atom/ns#" term="WinForms" /><category scheme="http://www.blogger.com/atom/ns#" term="CodeProject" /><category scheme="http://www.blogger.com/atom/ns#" term="font" /><category scheme="http://www.blogger.com/atom/ns#" term="graphics" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="PrivateFontCollection" /><category scheme="http://www.blogger.com/atom/ns#" term="Resource" /><title>Embedding Font To Resources</title><content type="html">How to load and use custom font, embedded in assembly resources.&lt;br /&gt;
&lt;br /&gt;
We leared how to load font not installed in system. But what about embedding font into assembly resources? We will use&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/system.drawing.text.privatefontcollection.aspx"&gt;PrivateFontCollection&lt;/a&gt; as in previous example &lt;a href="http://c-sharpening.blogspot.com/2010/08/use-font-without-installing.html"&gt;private font loading&lt;/a&gt;. But we'll need little bit more action.&lt;br /&gt;
&lt;br /&gt;
First we add font file into project. Place it in root folder of project. Go to property and choose action Embedded Resource for font file.&lt;br /&gt;
&lt;br /&gt;
Next add code to read font from resource.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre name="code" class="brush: csharp"&gt;// specify embedded resource name
string resource = "embedded_font.PAGAP___.TTF";

// receive resource stream
Stream fontStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource);

// create an unsafe memory block for the font data
System.IntPtr data = Marshal.AllocCoTaskMem((int)fontStream.Length);

// create a buffer to read in to
byte[] fontdata = new byte[fontStream.Length];

// read the font data from the resource
fontStream.Read(fontdata, 0, (int)fontStream.Length);

// copy the bytes to the unsafe memory block
Marshal.Copy(fontdata, 0, data, (int)fontStream.Length);

// pass the font to the font collection
private_fonts.AddMemoryFont(data, (int)fontStream.Length);

// close the resource stream
fontStream.Close();

// free up the unsafe memory
Marshal.FreeCoTaskMem(data);
&lt;/pre&gt;&lt;br /&gt;
After that we can create font and assign font to label&lt;br /&gt;
&lt;br /&gt;
&lt;pre name="code" class="brush: csharp"&gt;label1.Font = new Font(private_fonts.Families[0], 22);
&lt;/pre&gt;&lt;br /&gt;
Unfortunately it will not work instead loaded font from file. Reason is specific of memory loaded fonts, described in remarks to &lt;a href="http://msdn.microsoft.com/en-us/library/system.drawing.text.privatefontcollection.addmemoryfont.aspx"&gt;AddMemoryFont&lt;/a&gt; method.&lt;br /&gt;
&lt;blockquote&gt;To use the memory font, text on a control must be rendered with GDI+. Use the &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.application.setcompatibletextrenderingdefault.aspx"&gt;SetCompatibleTextRenderingDefault&lt;/a&gt; method, passing true, to set GDI+ rendering on the application, or on individual controls by setting the control's &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.groupbox.usecompatibletextrendering.aspx"&gt;UseCompatibleTextRendering&lt;/a&gt; property to true.&lt;/blockquote&gt;You can specify in Program class folowing:&lt;br /&gt;
&lt;br /&gt;
&lt;pre name="code" class="brush: csharp"&gt;Application.SetCompatibleTextRenderingDefault(true);
&lt;/pre&gt;&lt;br /&gt;
But it can affect other controls in programm. As example some controls fonts can look ugly. So better specify GDI+ rendering only for choosen controls.&lt;br /&gt;
&lt;br /&gt;
&lt;pre name="code" class="brush: csharp"&gt;label1.UseCompatibleTextRendering = true;
&lt;/pre&gt;&lt;br /&gt;
Result:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_IdGwwinx0YU/TH8nouumEoI/AAAAAAAAQUg/zqXsiSlmWSY/s1600/Pictures2010-09-02_11-26.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_IdGwwinx0YU/TH8nouumEoI/AAAAAAAAQUg/zqXsiSlmWSY/s320/Pictures2010-09-02_11-26.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a href="https://sites.google.com/site/blat4444/downloads/embedded_font.zip?attredirects=0&amp;amp;d=1"&gt;Download&lt;/a&gt; sample project.&lt;br /&gt;
&lt;br /&gt;
Today's reading: &lt;a href="http://www.amazon.com/gp/product/1590594452?ie=UTF8&amp;amp;tag=ccsh-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1590594452"&gt;Pro .NET 2.0 Graphics Programming (Expert's Voice in .NET)&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=ccsh-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1590594452" style="border: none !important; margin: 0px !important;" width="1" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2678645086319511182-7373719616159146486?l=www.csharpblog.co.cc' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rOYf-yyKBY5J1fnvjjuzpRBY1mI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rOYf-yyKBY5J1fnvjjuzpRBY1mI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/rOYf-yyKBY5J1fnvjjuzpRBY1mI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rOYf-yyKBY5J1fnvjjuzpRBY1mI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/C-C-sharpening/~4/roTWNvIN8a4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.csharpblog.co.cc/feeds/7373719616159146486/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.csharpblog.co.cc/2010/09/embedding-font-to-resources.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/7373719616159146486?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/7373719616159146486?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/C-C-sharpening/~3/roTWNvIN8a4/embedding-font-to-resources.html" title="Embedding Font To Resources" /><author><name>Ernest Poletaev</name><uri>http://www.blogger.com/profile/10001240160904961461</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://2.bp.blogspot.com/_IdGwwinx0YU/TH4EeRXAihI/AAAAAAAAQUA/0XOdvuTLRYg/S220/a_7161c26f.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_IdGwwinx0YU/TH8nouumEoI/AAAAAAAAQUg/zqXsiSlmWSY/s72-c/Pictures2010-09-02_11-26.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.csharpblog.co.cc/2010/09/embedding-font-to-resources.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUIDQXY-fip7ImA9WhZWFkw.&quot;"><id>tag:blogger.com,1999:blog-2678645086319511182.post-1302297595245135987</id><published>2010-08-31T22:45:00.000-07:00</published><updated>2011-05-17T00:32:50.856-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-17T00:32:50.856-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="custom" /><category scheme="http://www.blogger.com/atom/ns#" term="GDI+" /><category scheme="http://www.blogger.com/atom/ns#" term="admin" /><category scheme="http://www.blogger.com/atom/ns#" term="msdn" /><category scheme="http://www.blogger.com/atom/ns#" term=".net" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="clickonce" /><category scheme="http://www.blogger.com/atom/ns#" term="private" /><category scheme="http://www.blogger.com/atom/ns#" term="WinForms" /><category scheme="http://www.blogger.com/atom/ns#" term="GDI" /><category scheme="http://www.blogger.com/atom/ns#" term="font" /><category scheme="http://www.blogger.com/atom/ns#" term="graphics" /><category scheme="http://www.blogger.com/atom/ns#" term="privileges" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Load And Use Custom Font Without Installing</title><content type="html">How to load and use font, not installed in the system? Not always your application have enough rights to install custom font into system. For example in ClickOnce application.&lt;br /&gt;
&lt;br /&gt;
RTFM? Bull Shit! When you need some functionality and look documentation anything looks so fine... before you start coding.&lt;br /&gt;
&lt;br /&gt;
I wrote application for ClickOnce install. My application require custom font. How to use custom font whithout administrator privileges? I look MSDN documentation, find class &lt;a href="http://msdn.microsoft.com/en-us/library/ms533820(VS.85).aspx"&gt;PrivateFontCollection&amp;nbsp;&lt;/a&gt;and see beautiful example. Three seconds and i have few lines code in my app. But nothing happens. Custom font doesn't appears!&lt;br /&gt;
&lt;br /&gt;
Ok, i write test programm, and use complete example from MSDN. Same result! Looking example i see used font names - Arial, Courier New, Times New Roman... Why i not surprised this example works? Cause these fonts are preinstalled in system. Only complete idiot will delete these fonts!&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I search internet and see something about &lt;i&gt;SetCompatibleTextRenderingDefault &lt;/i&gt;method of &lt;i&gt;Application&lt;/i&gt;. Visual Studio by default sets this method to false but for rumors should be true. I tried, but still get nothing.&lt;br /&gt;
&lt;br /&gt;
More googling and i saw similar examples, only difference is new Font created using FontFamily, but no by face name, as in MSDN sample.&lt;br /&gt;
&lt;br /&gt;
I tried to use &lt;a href="http://msdn.microsoft.com/en-us/library/ms534439(VS.85).aspx"&gt;FontFamily&lt;/a&gt;&amp;nbsp;received&amp;nbsp;from&amp;nbsp;&lt;i&gt;PrivateFontCollection &lt;/i&gt;and gotcha! Result is fine! If i not forget, i will send feedback to MSDN. (Update: already sent)&lt;br /&gt;
&lt;br /&gt;
Sample:&lt;br /&gt;
Create empty Windows Forms project, add label on form. Add Form.OnLoad handler, add folowing lines:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: csharp"&gt;PrivateFontCollection pfc = new PrivateFontCollection();
pfc.AddFontFile("C:\\Path To\\PALETX3.ttf");
label1.Font = new Font(pfc.Families[0], 16, FontStyle.Regular);&lt;/pre&gt;&lt;br /&gt;
Result:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_IdGwwinx0YU/TH1dIRT5MzI/AAAAAAAAQS0/SXB8zky4nOg/s1600/20100831-h7m8-13kb.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_IdGwwinx0YU/TH1dIRT5MzI/AAAAAAAAQS0/SXB8zky4nOg/s320/20100831-h7m8-13kb.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Voila!&lt;br /&gt;
&lt;br /&gt;
More Questions? Recommended Book: &lt;a href="http://www.amazon.com/gp/product/B001I1FFRI?ie=UTF8&amp;amp;tag=ccsh-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B001I1FFRI"&gt;C# Graphics Programming (Wrox Briefs)&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=ccsh-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=B001I1FFRI" style="border: none !important; margin: 0px !important;" width="1" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2678645086319511182-1302297595245135987?l=www.csharpblog.co.cc' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/IMzOBt5_-YYu4znrwckP7bRBTA4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IMzOBt5_-YYu4znrwckP7bRBTA4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/IMzOBt5_-YYu4znrwckP7bRBTA4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IMzOBt5_-YYu4znrwckP7bRBTA4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/C-C-sharpening/~4/Y401IUGPELU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.csharpblog.co.cc/feeds/1302297595245135987/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.csharpblog.co.cc/2010/08/use-font-without-installing.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/1302297595245135987?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2678645086319511182/posts/default/1302297595245135987?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/C-C-sharpening/~3/Y401IUGPELU/use-font-without-installing.html" title="Load And Use Custom Font Without Installing" /><author><name>Ernest Poletaev</name><uri>http://www.blogger.com/profile/10001240160904961461</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="27" height="32" src="http://2.bp.blogspot.com/_IdGwwinx0YU/TH4EeRXAihI/AAAAAAAAQUA/0XOdvuTLRYg/S220/a_7161c26f.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_IdGwwinx0YU/TH1dIRT5MzI/AAAAAAAAQS0/SXB8zky4nOg/s72-c/20100831-h7m8-13kb.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.csharpblog.co.cc/2010/08/use-font-without-installing.html</feedburner:origLink></entry></feed>

