<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Cool Client Stuff : Whidbey</title><link>http://blogs.msdn.com/rprabhu/archive/tags/Whidbey/default.aspx</link><description>Tags: Whidbey</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Visual Studio Express will be free permanently!</title><link>http://blogs.msdn.com/rprabhu/archive/2006/04/21/580446.aspx</link><pubDate>Fri, 21 Apr 2006 10:53:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:580446</guid><dc:creator>rprabhu</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/rprabhu/comments/580446.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rprabhu/commentrss.aspx?PostID=580446</wfw:commentRss><description>&lt;P&gt;Great news - it was &lt;A href="http://www.microsoft.com/presspass/press/2006/apr06/04-19VSExpressFreePR.mspx"&gt;annouced&lt;/A&gt;&amp;nbsp;a couple of days back&amp;nbsp;that Visual Studio &lt;A href="http://msdn.microsoft.com/vstudio/express/"&gt;Express&lt;/A&gt;, originally offered free for one year, will now be free permanently!&lt;/P&gt;
&lt;P&gt;Haven't heard of Express products before?&amp;nbsp;Read this &lt;A href="http://msdn.microsoft.com/vstudio/express/support/faq/"&gt;FAQ&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Not only are the Express products free, they are pretty lightweight and quick to install as well.&amp;nbsp;They are awesome especially for hobbyist and student programmers who want to learn how to code or develop something quickly.&lt;/P&gt;
&lt;P&gt;Per the FAQ, SQL Server 2005 Express will continue to be a free download as well.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=580446" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rprabhu/archive/tags/Whidbey/default.aspx">Whidbey</category><category domain="http://blogs.msdn.com/rprabhu/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item><item><title>Saving out a Form's Size and Location using the Application Settings feature</title><link>http://blogs.msdn.com/rprabhu/archive/2005/11/28/497792.aspx</link><pubDate>Tue, 29 Nov 2005 10:30:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:497792</guid><dc:creator>rprabhu</dc:creator><slash:comments>10</slash:comments><comments>http://blogs.msdn.com/rprabhu/comments/497792.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rprabhu/commentrss.aspx?PostID=497792</wfw:commentRss><description>&lt;P&gt;A very common requirement for Windows Forms applications is the ability to 'remember' the&amp;nbsp;location and size of forms when they are closed, so that the next time they are shown, they can be restored to the&amp;nbsp;former position. The &lt;A href="http://msdn2.microsoft.com/library/0zszyc6e(en-us,VS.80).aspx"&gt;Application Settings&lt;/A&gt; feature is .NET 2.0 makes it simple to do this, but unfortunately, it is a little hard to get it 'just right'. This question is asked frequently on internal and external Microsoft forums, so I thought it warranted a blog post.&lt;/P&gt;
&lt;P&gt;Now, the Windows Forms designer in Visual Studio 2005 provides a simple UI to data bind properties on controls to application settings. So the first thing that might occur to you is to simply bind the Form's Location and Size properties to settings, add a line of code to save the settings class, and that's it! Unfortunately, this is not the best option for a few reasons:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;First of all, you may notice that the Form.Size property is not offered up in the settings binding UI. This is because this property is marked &lt;A href="http://msdn2.microsoft.com/en-us/library/system.componentmodel.designerserializationvisibility.aspx"&gt;DesignerSerializationVisibility.Hidden,&lt;/A&gt; so the designer doesn't know how to serialize it, let alone generate a data binding for it. Instead, for Form, the ClientSize property is the one that gets serialized. 
&lt;LI&gt;So okay, maybe you can bind Location and ClientSize then? Well, yes, but this has another problem. Try setting it up and then attempt to resize the form from the left or top edge. You will see weird behavior. Why is this? It is beyond the scope of this post to give the full explanation, but it suffices to say that it has to do with how two way data binding works&amp;nbsp;in the context of property sets that mutually affect each other (in the case of Location and ClientSize, both eventually call into a common method, &lt;A href="http://msdn2.microsoft.com/library/system.windows.forms.control.setboundscore.aspx"&gt;SetBoundsCore()&lt;/A&gt;). 
&lt;LI&gt;This solution does not do the 'right' thing in the situation when the user maximized the form before closing it. In this case, you probably want to remember that the form was maximized, but also keep track of the last location/size &lt;EM&gt;before&lt;/EM&gt; it was maximized, so you can restore it the next time the user hits the Restore button. You may want to handle the minimize case in a similar way too. The simple data binding solution does not do this right. 
&lt;LI&gt;Data binding to properties like Location and Size is just not efficient. Each time the user moves the form or resizes it, Windows sends hundreds of messages to the form, causing the&amp;nbsp; data binding logic to do a lot of processing, when all you want is just to store the &lt;EM&gt;last&lt;/EM&gt; position and size before the form is closed.&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;The good news is that this is very easy to do with a few lines of code:&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P dir=ltr style="MARGIN-RIGHT: 0px"&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;private &lt;FONT color=#0000ff&gt;void&lt;/FONT&gt; Form1_FormClosing(&lt;FONT color=#0000ff&gt;object&lt;/FONT&gt; sender, &lt;FONT color=#008080&gt;FormClosingEventArgs&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt; e)&lt;BR&gt;{&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Properties.&lt;FONT color=#008080&gt;Settings&lt;/FONT&gt;.Default.MyState = &lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;.WindowState;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;if&lt;/FONT&gt; (&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;.WindowState == &lt;FONT color=#008080&gt;FormWindowState&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;.Normal)&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;{&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Properties.&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008080&gt;Settings&lt;/FONT&gt;.Default.MySize = &lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;.Size;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Properties.&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008080&gt;Settings&lt;/FONT&gt;.Default.MyLoc = &lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;.Location;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;&lt;FONT face="Courier New" size=2&gt;else&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;{&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Properties.&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008080&gt;Settings&lt;/FONT&gt;.Default.MySize = &lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;.RestoreBounds.Size;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Properties.&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#008080&gt;Settings&lt;/FONT&gt;.Default.MyLoc = &lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;.RestoreBounds.Location;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;Properties.&lt;/FONT&gt;&lt;FONT face="Courier New" color=#008080&gt;Settings&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;.Default.Save();&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;private&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;void&lt;/FONT&gt; Form1_Load(&lt;FONT color=#0000ff&gt;object&lt;/FONT&gt; sender, &lt;FONT color=#008080&gt;EventArgs&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; e)&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;{&lt;/FONT&gt;&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;.Size = Properties.&lt;FONT color=#008080&gt;Settings&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;.Default.MySize;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;.Location = Properties.&lt;FONT color=#008080&gt;Settings&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;.Default.MyLoc;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff&gt;this&lt;/FONT&gt;.WindowState = Properties.&lt;FONT color=#008080&gt;Settings&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;.Default.MyState;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;} &lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P dir=ltr&gt;By the way, speaking of Windows Forms 2.0, there is a lot of great &lt;A href="http://www.windowsforms.net/Default.aspx?tabindex=5&amp;amp;tabid=60"&gt;new content&lt;/A&gt; on the WindowsForms.net site. Jessica has been &lt;a href="http://blogs.msdn.com/jfoscoding/"&gt;actively blogging&lt;/A&gt; on interesting Windows Forms topics too.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=497792" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rprabhu/archive/tags/Whidbey/default.aspx">Whidbey</category><category domain="http://blogs.msdn.com/rprabhu/archive/tags/Configuration_2F00_Settings/default.aspx">Configuration/Settings</category></item><item><title>I have heard of the BSoD - what's a WSoD?</title><link>http://blogs.msdn.com/rprabhu/archive/2005/08/11/450332.aspx</link><pubDate>Thu, 11 Aug 2005 11:59:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:450332</guid><dc:creator>rprabhu</dc:creator><slash:comments>10</slash:comments><comments>http://blogs.msdn.com/rprabhu/comments/450332.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rprabhu/commentrss.aspx?PostID=450332</wfw:commentRss><description>&lt;P&gt;If you have used the Windows Forms designer in Visual Studio 2005 enough,&amp;nbsp;chances are you may have occasionally seen a white error screen instead of the design time form. This screen, fondly referred to as WSoD in our team, shows up when&amp;nbsp;error(s) are encountered in the process of loading the designer. &amp;nbsp;Now, if you have used Visual Studio 2002/2003, you may recollect that in the face of errors,&amp;nbsp;the designer would usually continue the load and quietly display the errors in the tasklist. That was much less intrusive and did not require the developer to drop whatever they were doing and&amp;nbsp;fix the errors. Why then did we take this seemingly retrograde step back into the Windows 95 era?&lt;/P&gt;
&lt;P&gt;There is a very good reason for that. If an error is encountered while loading the designer and you ignore it and make modifications to the design time form, there is inevitably one result - &lt;STRONG&gt;data loss&lt;/STRONG&gt;. This is because the next time the designer flushes, it will wipe InitializeComponent() clean and&amp;nbsp;serialize out code for the current state of components in the designer (this is how the designer always works). If there were lines of code in there that it failed to parse during the load, at this point they will be lost. This could mean property sets or even whole components 'disappear' from the designer.&lt;/P&gt;
&lt;P&gt;It is to prevent this inadvertant data loss that we introduced the WSoD in VS 2005. The WSoD makes it very obvious to the user that there were errors, and does not allow modifications to be made to the designer till they are resolved. Now, unlike its blue counterpart, the WSoD actually contains information useful to the user. It shows a list of errors that were encountered along with stack traces and very often, the line of code in InitializeComponent() that&amp;nbsp;is responsible for each error. Equipped with this information, the developer should be able to open the code behind file (which is now thankfully in a separate partial class, distinct from&amp;nbsp;user code) and fix up the lines that caused the problem.&lt;/P&gt;
&lt;P&gt;Now, clearly, not everyone is a huge fan of this&amp;nbsp;idea. Developers don't like being blocked from making progress this way. For example, let's say you have a DataGridView and some other controls on your form referencing a DataSet in the project. If you delete the DataSet when you have the form designer window open, you will likely see a WSoD. This can be frustrating - why wasn't VS clever enough to auto-correct the problem for me? &lt;/P&gt;
&lt;P&gt;Well, the problem is: what &lt;EM&gt;is&lt;/EM&gt; the right solution? &lt;/P&gt;
&lt;P&gt;Should it delete all the controls referencing the dataset automatically? What if the developer wanted them to remain there so they could set them up with a new dataset? &lt;/P&gt;
&lt;P&gt;Should it keep the controls, but ignore the error and continue to load? Well, if the developer misses the warnings in the task list, all of a sudden, they might end up with controls in a bad state and lose some data.&lt;/P&gt;
&lt;P&gt;So you see, there is no good 'automagic' solution. We thought it best to leave the developer in control of the situation and decide the best way to fix the issue. Essentially, we weighed user-friendlyness with data loss and ruled in favor of preventing data loss as much as possible. I don't know about you, but I would prefer to spend a few minutes fixing stuff up rather than inadvertantly losing hours of hard work with the next flush.&lt;/P&gt;
&lt;P&gt;P.S.&amp;gt; If you have never heard of the BSoD (I am sure there are plenty of you that haven't :-)), &lt;A href="http://en.wikipedia.org/wiki/Blue_screen_of_death"&gt;here&lt;/A&gt; is a good description.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=450332" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rprabhu/archive/tags/Whidbey/default.aspx">Whidbey</category><category domain="http://blogs.msdn.com/rprabhu/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item><item><title>WinRes: Improvements in Whidbey</title><link>http://blogs.msdn.com/rprabhu/archive/2005/02/18/375975.aspx</link><pubDate>Fri, 18 Feb 2005 09:41:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:375975</guid><dc:creator>rprabhu</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.msdn.com/rprabhu/comments/375975.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rprabhu/commentrss.aspx?PostID=375975</wfw:commentRss><description>&lt;p&gt;One of the first posts I made, after starting this blog, was about &lt;A href="http://blogs.msdn.com/rprabhu/archive/2003/08/21/56536.aspx"&gt;WinRes&lt;/a&gt;, a UI localization tool that ships with the .NET Framework SDK. The reason I wrote that post was that I had been increasing noticing how many people had the same set of issues with WinRes, and were having trouble resolving them, given that there isn't much documentation on MSDN about it. The information in that post gives a general understanding of how WinRes works and helps&amp;nbsp;you debug the most common problems you may run into. &lt;/p&gt; &lt;p&gt;Ofcourse, simply documenting the issues is not enough, so we have attempted to improve the tool in Whidbey (.NET 2.0). Here are some of the improvements we have made:&lt;/p&gt; &lt;p&gt;1)&amp;nbsp;&lt;strong&gt;Better error reporting&lt;/strong&gt; - The single biggest problem users had with WinRes was not the errors, but the fact that it was very difficult to diagnose them. Many a time, WinRes simply failed to load a resource file and displayed an extremely informative message like 'Unknown item'&amp;nbsp;or ' Item not found'. Not surprisingly, the user was left with no clue with what to do next. What's worse is that the typical user of WinRes is a localization/language expert, not a developer who can be expected to debug his/her way through the problem. I am happy to say that the error reporting is much improved in Whidbey. In typical cases, WinRes should be able to give a clear and specific indication of what the problem is, like the particular element in the resx that is invalid or which component it was not able to parent correctly and so on. It still may not be totally obvious how to resolve the problem, but you should atleast&amp;nbsp;have something specific to go on. There will still be cases when WinRes will not be able to clearly pinpoint the problem, but it should, as a last resort, atleast show you what exception occured.&lt;/p&gt; &lt;p&gt;2) &lt;strong&gt;Robustness&lt;/strong&gt; - A related&amp;nbsp;issue with WinRes' loading mechanism was its sensitivity to problems. For example, it used to often fail to load an entire dialog just because it couldn't find one component's assembly or found one property it could not interpret. In Whidbey, WinRes is much more resilient to issues like these. In most cases, it will load the dialog inspite of such errors and report to you what errors occured in a textbox below the designer (much like the tasklist in Visual Studio). For example, if a component's type is not found, it will load the dialog and use a place holder control for that dialog, so that you can continue localizing (although I strongly recommend you ensure all the assemblies that are referenced in the resource file are&amp;nbsp;placed either in the GAC or in the same directory as WinRes.exe, so it can locate and load them). &lt;/p&gt; &lt;p&gt;3) &lt;strong&gt;Support for VS localized resx files &lt;/strong&gt;- One limitation of WinRes in v1.0/1.1 was that it required localized resx files (like Form1.ar.resx) to be self contained, in the sense that they had to have&amp;nbsp;all the localizable properties defined in them. However, if you used Visual Studio for localization, the resx files it produced only contained diffs from the parent culture, which is more efficient and fits into the runtime resource loading behavior. These VS localized resx files could not be opened in WinRes, since it did not support the use of multiple resx files to load the dialog. In Whidbey, WinRes has the ability to do this and if you place the parent culture resx files in the same directory as the file you are trying to open, it should be able to pick them up and load the dialog.&lt;/p&gt; &lt;p&gt;4) &lt;strong&gt;Some support for public inherited controls&lt;/strong&gt; - In v1.0/1.1, WinRes had trouble loading dialogs that had public inherited controls. We have fixed this issue in Whidbey and it should now be possible, in&amp;nbsp;typical cases,&amp;nbsp;to open these dialogs without problems. Note though that there will always be limitations in this area. There are many complex inheritance cases that we will still not be able to support (not only in WinRes, but even in the VS designer). Visual inheritance, though a tempting design choice, is fraught with many problems - but let me save that rather controversial topic for a separate post :-)&lt;/p&gt; &lt;p&gt;These are the major issues - besides these, we have fixed several small (yet irritating) bugs and improved the UI a bit. WinRes also supports the new designer improvements like snap lines for layout, since its designer has been rewritten to use the Whidbey &lt;A href="http://blogs.msdn.com/rprabhu/archive/2004/06/15/155864.aspx"&gt;designer hosting API&lt;/a&gt;. See also &lt;A href="http://blogs.msdn.com/rprabhu/archive/2004/08/04/207771.aspx"&gt;this post&lt;/a&gt; for improvements to localization in general in Whidbey.&lt;/p&gt; &lt;p&gt;If you have&amp;nbsp;a chance to try out WinRes in Whidbey builds and find any issues you would like resolved, do let us know through &lt;a href="http://lab.msdn.microsoft.com/productfeedback/"&gt;MSDN Product Feedback&lt;/a&gt;. Note that some of the improvements mentioned above may not have made it into Beta 1 or the recent&amp;nbsp;CTP builds, but should be available in the Beta 2 release.&lt;/p&gt; &lt;p&gt;In summary, WinRes is a useful, free tool that handles the most common and basic UI localization scenarios.&amp;nbsp;For more advanced cases, users may prefer to use one of the third party localization tools available.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=375975" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rprabhu/archive/tags/WinRes/default.aspx">WinRes</category><category domain="http://blogs.msdn.com/rprabhu/archive/tags/Whidbey/default.aspx">Whidbey</category></item><item><title>Smart Client in focus again</title><link>http://blogs.msdn.com/rprabhu/archive/2005/02/09/369712.aspx</link><pubDate>Wed, 09 Feb 2005 10:42:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:369712</guid><dc:creator>rprabhu</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/rprabhu/comments/369712.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rprabhu/commentrss.aspx?PostID=369712</wfw:commentRss><description>&lt;p&gt;Good to see that Soma's keynote at &lt;a href="http://www.ftponline.com/conferences/vslive/2005/sf/"&gt;VSLive! San Francisco&lt;/a&gt;&amp;nbsp;brings the concept of 'smart client' back in focus. This is something I am personally passionate about and it is also the&amp;nbsp;theme of this blog. &lt;A href="http://blogs.msdn.com/somasegar/archive/2005/02/06/368264.aspx"&gt;Here&lt;/a&gt; is Soma's blog post on the topic and you can view the keynote video &lt;a href="http://www.ftponline.com/reports/vslivesf/2005/multimedia/soma.asx"&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Still not sure what a smart client is as opposed to a simple client application or a 'rich client'? I don't blame you - there are too many of these terms floating around. Believe it or not, 'smart client' isn't just a fancy new term for the same old thing - it is indeed a new kind of application model that attempts to combine the best of the client and web worlds.&amp;nbsp;Check out the &lt;a href="http://msdn.microsoft.com/smartclient/"&gt;Smart Client Developer Center&lt;/a&gt; on MSDN to understand exactly what smart client means.&lt;/p&gt; &lt;p&gt;With features like ClickOnce and Client Settings,&amp;nbsp;not to mention the very significant advances in Windows Forms, .NET Framework 2.0 is going to be a great platform for smart client application development!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=369712" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rprabhu/archive/tags/.NET+-+Random+Tips/default.aspx">.NET - Random Tips</category><category domain="http://blogs.msdn.com/rprabhu/archive/tags/Whidbey/default.aspx">Whidbey</category></item><item><title>Windows Forms Bug Reporting Challenge</title><link>http://blogs.msdn.com/rprabhu/archive/2004/11/22/268314.aspx</link><pubDate>Tue, 23 Nov 2004 04:56:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:268314</guid><dc:creator>rprabhu</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/rprabhu/comments/268314.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rprabhu/commentrss.aspx?PostID=268314</wfw:commentRss><description>&lt;p&gt;Feels good to return to blogging after a long break! We in the developer division have been pretty busy last few weeks working towards a stable Whidbey Beta 2. ScottGu's blog &lt;a href="http://weblogs.asp.net/scottgu/archive/2004/10/23/246709.aspx"&gt;post&lt;/a&gt; has a good description of where we are in the Whidbey product cycle.&lt;/p&gt; &lt;p&gt;If you are beta testing Windows Forms 2.0 or Clickonce, you might be interested in the &lt;a href="http://msdn.microsoft.com/smartclient/challenge/default.aspx"&gt;bug reporting contest&lt;/a&gt;. As I mentioned in a previous &lt;A href="http://blogs.msdn.com/rprabhu/archive/2004/10/06/239107.aspx"&gt;post&lt;/a&gt;, the&amp;nbsp;feedback we have received through the MSDN Product Feedback Center has been simply awesome. This has given us a chance to know what changes&amp;nbsp;&lt;em&gt;you&lt;/em&gt; would like to see in the product before we ship. Do keep the bug reports and suggestions coming!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=268314" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rprabhu/archive/tags/Whidbey/default.aspx">Whidbey</category></item><item><title>Impact of the MSDN Product Feedback Center</title><link>http://blogs.msdn.com/rprabhu/archive/2004/10/06/239107.aspx</link><pubDate>Thu, 07 Oct 2004 06:39:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:239107</guid><dc:creator>rprabhu</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/rprabhu/comments/239107.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rprabhu/commentrss.aspx?PostID=239107</wfw:commentRss><description>&lt;p&gt;Its been quite a long time since my last blog post. We have been pretty busy over the last couple of months (and will be for a few more weeks) driving towards a high quality Beta 2 of &lt;a href="http://lab.msdn.microsoft.com/vs2005/"&gt;Visual Studio 2005&lt;/a&gt; (Whidbey). This next release should be far more stable, secure&amp;nbsp;and complete than Beta 1. We have been resolving all kinds of bugs and design issues over the past few weeks and looking back, I am greatly impressed at the impact the recently launched &lt;a href="http://lab.msdn.microsoft.com/productfeedback/"&gt;MSDN Product Feedback Center&lt;/a&gt; has had on VS 2005.&lt;/p&gt; &lt;p&gt;As a sample, &lt;a href="http://lab.msdn.microsoft.com/productfeedback/SearchResults.aspx?text=raghavendra&amp;amp;stype=1&amp;amp;fields=1&amp;amp;type=0&amp;amp;witId=0&amp;amp;pId=0&amp;amp;category=0&amp;amp;os=0&amp;amp;oslang=0&amp;amp;status=0&amp;amp;msstatus=0&amp;amp;resolution=0&amp;amp;chgdays=&amp;amp;validation=0&amp;amp;votes=&amp;amp;voterating=0&amp;amp;workarounds=False&amp;amp;attachments=False"&gt;here&lt;/a&gt; are some of the issues/suggestions I&amp;nbsp;personally have had a chance to look at. I think the most useful product feedback falls into the following categories:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Obscure scenario - a scenario we missed in our own tests. For example, trying to import a resource in Visual Studio with an unusual filename, like '0'. While such scenarios are quite rare, they are a source of irritation if&amp;nbsp;when you do run into them, Visual Studio behaves unpredictably. &lt;li&gt;Great suggestion - we get quite a few suggestions for improving a particular feature or behavior, and some of them are real gems. I have personally seen a couple related to the &lt;a href="http://blogs.msdn.com/rprabhu/category/6591.aspx"&gt;Client Settings&lt;/a&gt; feature that fall into this category. &lt;li&gt;Feedback from third party component developers - this set of customers give us very valuable feedback about things like our component model, localization and designer infrastructure. This helps us tune these classes to allow better customization and extensibility of our feature set.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;While there are (and have been) other sources of feedback like newsgroups, direct emails and dev labs, I think the product feedback center has some distinct advantages. First of all, the reach - pretty much anyone can give feedback. Second, there is a clear process for tracking every bug/suggestion we get. Nearly every single bug is looked at by the product teams. Third, due to the voting feature, we get a good idea of how many customers ran into a particular issue and&amp;nbsp;consider important. &lt;/p&gt; &lt;p&gt;Finally, and I think this is the most important, the person who entered the bug, and also the whole community, has a chance to find out what the product team decided to do with the bug. So this is not like one of those surveys you fill out and never hear about again - you can track the bug at every stage of the process.&lt;/p&gt; &lt;p&gt;So once again, a big THANK YOU to everyone who&amp;nbsp;gave their feedback and continue to do so! For me personally, it is very nice&amp;nbsp;to see the features I implemented being put to use and a great source of satisfaction being able to address the issues real customers are seeing with the product. I am sure everyone else in the product teams feels the same!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=239107" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rprabhu/archive/tags/General/default.aspx">General</category><category domain="http://blogs.msdn.com/rprabhu/archive/tags/Whidbey/default.aspx">Whidbey</category></item><item><title>Localization in Whidbey</title><link>http://blogs.msdn.com/rprabhu/archive/2004/08/04/207771.aspx</link><pubDate>Wed, 04 Aug 2004 11:10:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:207771</guid><dc:creator>rprabhu</dc:creator><slash:comments>16</slash:comments><comments>http://blogs.msdn.com/rprabhu/comments/207771.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rprabhu/commentrss.aspx?PostID=207771</wfw:commentRss><description>&lt;P&gt;Before I describe how&amp;nbsp;Windows Forms&amp;nbsp;localization works in Whidbey, let us first take a look at how it works in VS 2002/2003. Consider a Form with a Button control on it. When you mark it Localizable = True in the property grid, the designer generates code for the Button&amp;nbsp;that looks like this:&lt;/P&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;this&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;.button1.AccessibleDescription = resources.GetString("button1.AccessibleDescription");&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;.button1.AccessibleName = resources.GetString("button1.AccessibleName");&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;.button1.Anchor = ((System.Windows.Forms.AnchorStyles)(resources.GetObject("button1.Anchor")));&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;.button1.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("button1.BackgroundImage")));&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;.button1.Dock = ((System.Windows.Forms.DockStyle)(resources.GetObject("button1.Dock")));&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;FONT size=2&gt;.button1.Enabled = ((&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;bool&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;)(resources.GetObject("button1.Enabled")));&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;.button1.FlatStyle = ((System.Windows.Forms.FlatStyle)(resources.GetObject("button1.FlatStyle")));&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;.button1.Font = ((System.Drawing.Font)(resources.GetObject("button1.Font")));&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;.button1.Image = ((System.Drawing.Image)(resources.GetObject("button1.Image")));&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;FONT size=2&gt;.button1.ImageAlign = ((System.Drawing.ContentAlignment)(resources.GetObject("button1.ImageAlign")));&lt;/FONT&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New" size=2&gt;...&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P dir=ltr&gt;where 'resources' is an instance of the &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemresourcesresourcemanagerclasstopic.asp"&gt;ResourceManager &lt;/A&gt;class. Basically, the serializer pushes the values of all properties on Button that are marked with &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemcomponentmodellocalizableattributeclassyestopic.asp"&gt;LocalizableAttribute.Yes&lt;/A&gt; to the resource file and generates code to pull these values when the form is constructed. This allows the localizer to set different values for these properties based on the culture. Depending on the culture the application gets run under, the&amp;nbsp;property values will be pulled back from the appropriate resource (with fallback to neutral and default culture resources when values are not found in a specific culture resource file). &lt;/P&gt;
&lt;P dir=ltr&gt;So if you are developing a component, all you need to do is mark the set of properties on it that you think can vary based on culture with LocalizableAttribute.Yes and you are all set. If you are an app developer, things are even simpler -&amp;nbsp;just set Localizable = True on your Form.&lt;/P&gt;
&lt;P dir=ltr&gt;You will notice, though, that there is some room for improvement in this model. Here are some drawbacks:&lt;/P&gt;
&lt;P dir=ltr&gt;1)&amp;nbsp;&lt;STRONG&gt;Does not scale very well &lt;/STRONG&gt;- Components typically have a large number of localizable properties - for example, the Button control has about 20 of them. This means that each time the form is constructed, 20 property values are retrieved from the resource file and set on the Button. For a large form with 100 controls, that adds up to 2000 properties on average.&amp;nbsp;The interesting thing here is that these properties are only &lt;EM&gt;potentially&lt;/EM&gt; localizable - it is possible and even likely that only a small number of them &lt;EM&gt;have actually been localized&lt;/EM&gt; in different cultures. For example, if the button does not have a background image in the default culture, it&amp;nbsp;most likely&amp;nbsp;doesn't in other cultures as well. Yet, the code will retrieve the value (null) from the resource file on form construction.&lt;/P&gt;
&lt;P dir=ltr&gt;2) &lt;STRONG&gt;Code bloat in InitializeComponent&lt;/STRONG&gt; - In a non-localized form, the serializer will typically only generate code for properties that have been set to non-default values. However, when you turn localization on, it will generate code for &lt;EM&gt;all localizable properties&lt;/EM&gt;, as shown above. This usually means a lot more lines of code in InitializeComponent.&lt;/P&gt;
&lt;P dir=ltr&gt;3) &lt;STRONG&gt;Clutter in the resource file&lt;/STRONG&gt; - Each of the localizable properties also get their values pushed into the resource files, even properties that have default values and for which the developer probably has no intention of setting non-default values.&lt;/P&gt;
&lt;P dir=ltr&gt;So in Whidbey, we spent some time thinking about how we could&amp;nbsp;improve this model and address these drawbacks. Obviously, we had to remain backward compatible, so we couldn't simply start over and invent a new model. I will now describe what we did come up with.&lt;/P&gt;
&lt;P dir=ltr&gt;In Whidbey, we support two &lt;A href="http://msdn2.microsoft.com/en-us/library/System.ComponentModel.Design.Serialization.CodeDomLocalizationModel"&gt;localization models&lt;/A&gt;&amp;nbsp;- PropertyAssignment and PropertyReflection. PropertyAssignment is similar to the model described above. PropertyReflection indicates that the designer will&amp;nbsp;use the &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemcomponentmodelcomponentresourcemanagerclasstopic.asp"&gt;ComponentResourceManager&lt;/A&gt; class to &lt;EM&gt;reflect on properties by name&lt;/EM&gt; to fill&amp;nbsp;them at runtime.&amp;nbsp; This uses reflection at runtime so it can be slow, but it scales better for&amp;nbsp;large numbers of properties with default values. The designer loader can specify how localization should work through a &lt;A href="http://msdn2.microsoft.com/en-us/library/System.ComponentModel.Design.Serialization.CodeDomLocalizationProvider"&gt;CodeDomLocalizationProvider&lt;/A&gt;, but let's not discuss those details now - what's important is that&amp;nbsp;the Visual Studio designer in Whidbey uses the PropertyReflection model by default.&lt;/P&gt;
&lt;P dir=ltr&gt;This means that the code in InitializeComponent will look simply&amp;nbsp;like:&lt;/P&gt;&lt;FONT size=2&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;resources.ApplyResources(&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;FONT size=2&gt;.button1, &lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"button1"&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P dir=ltr&gt;As mentioned above, this call will use reflection to pull values from the appropriate resource file. The designer will only push &lt;EM&gt;non-default&lt;STRONG&gt; &lt;/STRONG&gt;&lt;/EM&gt;property values into the resources, so typically these will be far fewer than in the VS 2002/2003. So essentially, we are now optimizing for&amp;nbsp;the common case - where a large number of properties have default values.&amp;nbsp;The code in InitializeComponent is very concise and we only push non-default values into resources, so (2) and (3) are addressed too.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=207771" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rprabhu/archive/tags/Whidbey/default.aspx">Whidbey</category><category domain="http://blogs.msdn.com/rprabhu/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item><item><title>Visual Studio 2005 Beta!</title><link>http://blogs.msdn.com/rprabhu/archive/2004/06/29/168823.aspx</link><pubDate>Tue, 29 Jun 2004 15:29:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:168823</guid><dc:creator>rprabhu</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/rprabhu/comments/168823.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rprabhu/commentrss.aspx?PostID=168823</wfw:commentRss><description>&lt;P&gt;It's finally out - Visual Studio 2005 and .NET Framework 2.0 Beta 1! Here are the relevant links:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://lab.msdn.microsoft.com/vs2005/"&gt;VS 2005 Beta Developer Center&lt;/A&gt; - portal for all VS 2005 Beta related information, including links to download. 
&lt;LI&gt;&lt;A href="http://lab.msdn.microsoft.com/express/"&gt;VS 2005 Express&amp;nbsp;Products&lt;/A&gt;&amp;nbsp;- described as &amp;#8220;lightweight, easy to use, easy to learn tools for hobbyists, enthusiasts, and students to learn and evaluate programming for Windows.&amp;#8220; 
&lt;LI&gt;&lt;A href="http://lab.msdn.microsoft.com/library/default.asp"&gt;VS 2005 Beta Online Documentation&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://lab.msdn.microsoft.com/productfeedback/"&gt;MSDN Product Feedback Center&lt;/A&gt; - a great place&amp;nbsp;to report bugs and&amp;nbsp;make suggestions.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Releasing a product (even a Beta) after months of hard work is such a great feeling! I am particularly excited about the Express products, since they offer beginners a super-easy&amp;nbsp;way to get a feel for programming on the Windows platform. See how simple it is to write your own &lt;A href="http://lab.msdn.microsoft.com/express/vbasic/starterkit/"&gt;application to keep track of your movie collection&lt;/A&gt;&amp;nbsp;or a &lt;A href="http://lab.msdn.microsoft.com/express/vcsharp/default.aspx"&gt;screen saver that displays RSS feeds&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;Don't miss the &lt;A href="http://channel9.msdn.com/express/"&gt;Summer of Express Contest&lt;/A&gt; on Channel 9! And here is Scoble's nice&amp;nbsp;&lt;A href="http://radio.weblogs.com/0001011/2004/06/29.html#a7898"&gt;summary post&lt;/A&gt; on the new annoucements.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=168823" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rprabhu/archive/tags/Whidbey/default.aspx">Whidbey</category><category domain="http://blogs.msdn.com/rprabhu/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item><item><title>Client Settings - Part 3</title><link>http://blogs.msdn.com/rprabhu/archive/2004/06/18/159404.aspx</link><pubDate>Fri, 18 Jun 2004 17:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:159404</guid><dc:creator>rprabhu</dc:creator><slash:comments>11</slash:comments><comments>http://blogs.msdn.com/rprabhu/comments/159404.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rprabhu/commentrss.aspx?PostID=159404</wfw:commentRss><description>&lt;P&gt;RichB has some interesting questions in his &lt;A href="http://blogs.msdn.com/rprabhu/archive/2004/04/03/106996.aspx"&gt;comments&lt;/A&gt; about my earlier post on the client settings feature. I thought it might be worth a separate post to answer them.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;I don't have the CTP available, but from the documentation it appears that ApplicationSettingsBase can read and write to a collection of providers. I can understand the writing to multiple providers (saving the same values into multiple locations) but how does it read the same values from multiple locations. &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Yes, a settings class can&amp;nbsp;talk to&amp;nbsp;multiple providers, but each setting (or property) in it is associated with a single provider. This just means that you can have different providers for different settings in a settings class.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;I also hope you have a good "story" for plug-in based applications. For example, Lutz Roeder's Reflector and Nikhil's Web Matrix are both heavily pluggable. Is there a prescribed way for each plug-in/component to obtain and save configuration information to the same store? &lt;/EM&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;Yes, we have a story for this scenario. There is an interface called IPersistComponentSettings that any component can implement to save its own settings when hosted in an application. For example, the ToolStrip control implements this. Someone using the ToolStrip in their app can just set a property called SaveSettings to true and the ToolStrip will save/restore settings automatically without the user having to set anything up.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;I'm also a bit hazy on Setting Groups. I've noticed the SettingsGroupNameAttribute - but am not entirely clear on how it's meant to be used. &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Usually, the settings class name is used to identify&amp;nbsp;your settings in the store. If you want them stored with a different name or share settings with some other class, you can use the SettingsGroupNameAttribute to rename/redirect your settings.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Finally, do you have generic methods for loading from the store to prevent boxing?&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;No, but that's a good suggestion. We will consider doing this.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=159404" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rprabhu/archive/tags/Whidbey/default.aspx">Whidbey</category><category domain="http://blogs.msdn.com/rprabhu/archive/tags/Configuration_2F00_Settings/default.aspx">Configuration/Settings</category></item><item><title>Designer Hosting in Whidbey</title><link>http://blogs.msdn.com/rprabhu/archive/2004/06/15/155864.aspx</link><pubDate>Tue, 15 Jun 2004 09:07:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:155864</guid><dc:creator>rprabhu</dc:creator><slash:comments>26</slash:comments><comments>http://blogs.msdn.com/rprabhu/comments/155864.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rprabhu/commentrss.aspx?PostID=155864</wfw:commentRss><description>&lt;P&gt;If you&amp;nbsp;have had a chance to play with Visual Studio Whidbey, you&amp;nbsp;may have noticed some of the cool new &lt;A href="http://www.windowsforms.net/articles/WindowsFormsOverview.aspx?tabindex=5"&gt;features&lt;/A&gt; in the Forms designer - snap lines, smart tags and so on. Now what if you desire to expose some of this design time UI in your own application? Guess what, Whidbey makes this super easy to do! As I will show below, with less than 10 lines of code, you can display a form that hosts the Windows Forms designer.&lt;/P&gt;
&lt;P&gt;The designer classes you will need are located in the various System.*.Design namespaces, particularly System.ComponentModel.Design. These are part of System.Design.dll, so you will first need to add a reference to this assembly (that ships as part of the .NET Framework SDK).&lt;/P&gt;
&lt;P&gt;The first thing you need to do is create a &lt;A href="http://longhorn.msdn.microsoft.com/?//longhorn.msdn.microsoft.com/lhsdk/ref/ns/system.componentmodel.design/c/designsurface/designsurface.aspx"&gt;DesignSurface&lt;/A&gt;. This is the class that represents the user interface that you would think of as the &amp;#8220;designer&amp;#8221;.&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;&lt;FONT face="Courier New" size=2&gt;
&lt;P&gt;DesignSurface surface = new DesignSurface();&lt;/P&gt;&lt;/FONT&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;There, now we have a DesignSurface. Next, we need to indicate what the type of the root component is, and ask the DesignSurface to load it. We want a Form designer, so:&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;&lt;FONT face="Courier New" size=2&gt;
&lt;P&gt;surface.BeginLoad(typeof(Form));&lt;/P&gt;&lt;/FONT&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;BeginLoad begins the process of loading the designer, and will continue asynchronously. However, the &amp;#8220;view&amp;#8221; that represents the root component at design time is immediately available after this call.&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;&lt;FONT face="Courier New" size=2&gt;
&lt;P&gt;Control view = (Control) surface.View;&lt;/P&gt;&lt;/FONT&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Cool, now we have a Control that represents the View. We can manipulate this Control just like any other Windows Forms Control. In this case, lets dock fill it and add it to a Form.&lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;&lt;FONT face="Courier New" size=2&gt;
&lt;P&gt;view.Dock = DockStyle.Fill;&lt;BR&gt;Form myDesigner = new Form();&lt;BR&gt;myDesigner.Controls.Add(view);&lt;BR&gt;myDesigner.Show();&lt;/P&gt;&lt;/FONT&gt;&lt;/BLOCKQUOTE&gt;
&lt;P dir=ltr&gt;That's it! You now have a form hosting the Windows Forms designer, complete with support for snap lines, smart tags etc! Ofcourse, to create a little more functional designer, you need to provide a way to add components to the Form, set properties etc. You may also need to implement a couple of designer services along the way. But the 7 lines of code above are all you need to get started!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=155864" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rprabhu/archive/tags/Whidbey/default.aspx">Whidbey</category><category domain="http://blogs.msdn.com/rprabhu/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item><item><title>Strongly typed resource model in Whidbey</title><link>http://blogs.msdn.com/rprabhu/archive/2004/05/25/140980.aspx</link><pubDate>Tue, 25 May 2004 07:49:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:140980</guid><dc:creator>rprabhu</dc:creator><slash:comments>8</slash:comments><comments>http://blogs.msdn.com/rprabhu/comments/140980.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rprabhu/commentrss.aspx?PostID=140980</wfw:commentRss><description>&lt;P&gt;In Visual Studio 2003 and earlier, managing resources like images and icons in your project&amp;nbsp;is somewhat difficult. For example, when you try to assign an image to a PictureBox through the property grid, you get the FileOpenDialog. When you pick an image file, the image is dumped into the form's resx file as a binary blob. If you want to use the same image in a different form (lets say all your forms have the same background image), you would need to pick the same image over and over again, thereby duplicating the binary blobs in each form's resx file. Now, what if you needed to edit the image, say, to insert a company logo? Not very easy. What if you decided to pick a new image? You need to do so all over again for all your forms. Also, the code to access the resources is weakly typed, i.e., something like:&lt;/P&gt;
&lt;P&gt;this.BackgroundImage = (System.Drawing.Image) resources.GetObject(&amp;#8221;MyImage.jpg&amp;#8221;);&lt;/P&gt;
&lt;P&gt;where 'resources' is of type ResourceManager.&lt;/P&gt;
&lt;P&gt;One other thing: the default editor for resx files is a table of resource names. It isn't very easy to add new resources or edit existing ones.&lt;/P&gt;
&lt;P&gt;Ofcourse, you can work around these limitations through code, but this is the default design time experience.&lt;/P&gt;
&lt;P&gt;In Whidbey, we spent quite sometime thinking about how we could improve this experience. The result was that we designed a new model to store and access resources in Visual Studio projects. Here are some of&amp;nbsp;the highlights of the new model:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;When you try to assign an image to a control in the Whidbey designer, you will see a 'Select Resouce' dialog. This dialog will help you &amp;#8220;import&amp;#8220; resources into project resource files. The imported resources, by default, will not get embedded into the resx files, but instead copied to a Resources folder in the project and referenced in the resx files&amp;nbsp;by means of &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemresourcesresxfilerefclasstopic.asp"&gt;ResxFileRef&lt;/A&gt;. &lt;/LI&gt;
&lt;LI&gt;For each resx file, you can enable strongly typed access (whch typically will be&amp;nbsp;automatically enabled for the default project resx file and any file you import resources into using the Select Resource dialog). This means that we will generate a class that allows you to access resources through strongly typed properties. For instance, the code in InitializeComponent will look something like:&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.BackgroundImage = My.Resources.MyImage&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;in VB, and something similar in C# and J#.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Since the entries in the resx files are file references rather than binary blobs, you can edit the images and the changes will automatically be picked up wherever those images are referenced. Since these resx files are project&amp;nbsp;level rather than form level, you can access the resources across forms in your project.&lt;/LI&gt;
&lt;LI&gt;There is a&amp;nbsp;new Managed Resource Editor in Whidbey that allows you to easily edit resx files - update entries, add entries, import resources, delete entries etc.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;This should help improve the overall experience around managing project resources. Do let us know how you find this new model when you get a chance to play with it!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=140980" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rprabhu/archive/tags/Whidbey/default.aspx">Whidbey</category><category domain="http://blogs.msdn.com/rprabhu/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item><item><title>Whidbey content on WindowsForms.net</title><link>http://blogs.msdn.com/rprabhu/archive/2004/05/24/140963.aspx</link><pubDate>Tue, 25 May 2004 06:57:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:140963</guid><dc:creator>rprabhu</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/rprabhu/comments/140963.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rprabhu/commentrss.aspx?PostID=140963</wfw:commentRss><description>If you haven't looked at it already, you may want to check out the new &lt;A href="http://windowsforms.net/Default.aspx?tabindex=4&amp;amp;tabid=60"&gt;Whidbey section&lt;/A&gt; on &lt;A href="http://windowsforms.net/"&gt;WindowsForms.net&lt;/A&gt;. It includes overviews and screenshots of the new Whidbey features for client application development. There is also a link to forums where you can give feedback.&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=140963" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rprabhu/archive/tags/Whidbey/default.aspx">Whidbey</category></item><item><title>What's this new GenerateMember property?</title><link>http://blogs.msdn.com/rprabhu/archive/2004/05/06/127035.aspx</link><pubDate>Thu, 06 May 2004 09:04:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:127035</guid><dc:creator>rprabhu</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/rprabhu/comments/127035.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rprabhu/commentrss.aspx?PostID=127035</wfw:commentRss><description>&lt;P&gt;If you have played with Whidbey builds of Visual Studio, you may have noticed this new property called GenerateMember that shows up in the property grid for all controls and components you add to a Windows Form. Wondering what it is about? It is actually a design time extender property that allows you to control whether a component added to the form is referenced by a member variable in the class or a local variable in InitializeComponent. By default, it is set to true, but if you have any components that you are not really referencing&amp;nbsp;outside of InitializeComponent, you can set it to false. That way you can limit the member variables in your class to only the components you really need member variables for - just something to prevent clutter.&lt;/P&gt;
&lt;P&gt;This is just one of those little features that many will probably not notice, but those that do might find very convenient!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=127035" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rprabhu/archive/tags/Whidbey/default.aspx">Whidbey</category><category domain="http://blogs.msdn.com/rprabhu/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item><item><title>New articles on Whidbey Windows Forms and ClickOnce</title><link>http://blogs.msdn.com/rprabhu/archive/2004/04/25/119739.aspx</link><pubDate>Sun, 25 Apr 2004 09:23:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:119739</guid><dc:creator>rprabhu</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/rprabhu/comments/119739.aspx</comments><wfw:commentRss>http://blogs.msdn.com/rprabhu/commentrss.aspx?PostID=119739</wfw:commentRss><description>Nice overview of some of the new features in&amp;nbsp;&lt;A href="http://msdn.microsoft.com/msdnmag/issues/04/05/NETFramework20/default.aspx"&gt;Windows Forms&lt;/A&gt; and &lt;A href="http://msdn.microsoft.com/msdnmag/issues/04/05/ClickOnce/default.aspx"&gt;ClickOnce&lt;/A&gt;&amp;nbsp;(via &lt;A href="http://www.sellsbrothers.com/"&gt;Chris Sells' blog&lt;/A&gt;).&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=119739" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/rprabhu/archive/tags/Whidbey/default.aspx">Whidbey</category></item></channel></rss>