Welcome to MSDN Blogs Sign in | Join | Help

The team I used to work on (and my last contributions there) just launched today.  It is Microsoft's social bookmarking application. 

Check it out: http://social.msdn.microsoft.com/bookmarks/

Well, I've moved teams to the Windows Embedded team, so the content of my blog will most likely change.  Stay tuned!

If you would like to override a method in javascript that uses the Microsoft Ajax Library (such as the control toolkit), you can do the following (with the control toolkit as the base which we are overriding):

Type.registerNamespace('AjaxControlToolkit');

AjaxControlToolkit.YourClassName= function(element)
{
   AjaxControlToolkit.YourClassname.initializeBase(this,[element]);
  //initialize any variables here
}
AjaxControlToolkit.YourClassName.prototype =
{
_setText: function(item) //this is the function we're overriding
{
this._callMyNewFunction('hello there');  // we're sending an alert instead of the normal behavior
},
_callMyNewFunction: function(alertMessage) // my new method
{
alert(alertMessage);
}

AjaxControlToolkit.YourClassName.inheritsFrom(AjaxControlToolkit.AutoCompleteBehavior);

AjaxControlToolkit.YourClassName.registerClass('AjaxControlToolkit.YourClassName', AjaxControlToolkit.AutoCompleteBehavior);  // second parameter is the class you're "inheriting" from

This type of behavior can be applied to any class that uses the Microsoft Ajax Library and is very useful when you need some base behavior for a control and also specific behavior for a particular implemenation.

The team I'm working on just released our latest version of MSDN/TechNet Search, Profile and Forums.

For Search this is the latest release and includes the following new features (http://search.msdn.microsoft.com/):

  • Auto-complete hit highlighting.  Now if you search for "writeline" you'll see all words that contain that phrase.  The terms are also now ordered by the number of times we see a certain term requested.
  • Stackable refinements: after you search and we identify which topic and/or source contain your search term you can now click on multiple topic and/or source refinements and stack them to narrow your search further.
  • We have increased the number of correct results for a search term with new algorithms, so hopefully you'll find your information even faster!

Profile (http://profile.msdn.microsoft.com/en-us):

  • This is a new application that will drive your profile for things like search, forums and other apps to come.  So, if you have a live ID go ahead and sign up here to reserve a display name and upload an avatar!

Forums (http://forums.msdn.microsoft.com/en-us/forums):

 

Recently I was working on a problem, and after testing the solution I thought it would make a good blog post.  Here is what I was trying to solve: 

  1. Fill the cache with a large set of data (approx. 1M items).
  2. Have the original request to the website fill the cache and not block the browers responsiveness.
  3. Any new requests to the website should also not wait for the cache to get filled, and also not make the request to fill the cache also.

The other thing that you should be aware of is that you should have your control be able to work without data being available that you are trying to cache.  So, lets take a look at a solution - I put the call inside of a webmethod, but you can use a normal event to accomplish the same thing.  Here is the web page class:

    1 using System.Web.Services;

    2 using System.Collections.Generic;

    3 using System.Threading;

    4 using System.Runtime.Remoting.Messaging;

    5 using System.Web;

    6 

    7 public partial class _Default : System.Web.UI.Page

    8 {

    9     private static int _isCacheLoaded = 0;

   10     private delegate List<string> DelegateToCallMethod(string MyParameter); //match the calling method

   11     private static string myCacheKey;

   12     private static HttpContext _requestContext;

   13 

   14     protected void Page_Load(object sender, EventArgs e)

   15     {

   16 

   17     }

   18 

   19     private List<string> MyWorkerMethod(string Parameter1)

   20     {

   21         Thread.Sleep(120000); //sleep for 2 mins (REMOVE THIS IN REAL CODE - TEST ONLY)

   22         List<string> myList = new List<string>();

   23         myList.Add("Brett Robinson");

   24         return myList;

   25     }

   26 

   27     [WebMethod]

   28     public static List<string> DoSomething(string MyWebParameter)

   29     {

   30         myCacheKey = "myCacheKey";

   31         //need to save the state of httpcontext because it will get dereferenced in the callback

   32         _requestContext = HttpContext.Current;

   33         if (HttpContext.Current.Cache[myCacheKey] == null)

   34         {

   35             if (Interlocked.Exchange(ref _isCacheLoaded, 1) == 0)

   36             {

   37                 AsyncCallback callback = new AsyncCallback(CacheData);  //point to callback method

   38 

   39                 //custom delegate to invoke worker method

   40                 DelegateToCallMethod myCustomDelegate = new DelegateToCallMethod(MyWorkerMethod);

   41 

   42                 myCustomDelegate.BeginInvoke(MyWebParameter, callback, null); //call method

   43             }

   44         }

   45         return HttpContext.Current.Cache[myCacheKey] as List<string>;

   46     }

   47 

   48     public static void CacheData(IAsyncResult CallbackResult)

   49     {

   50         AsyncResult asyncResult = CallbackResult as AsyncResult;

   51         DelegateToCallMethod myCustomDelegateAgain = asyncResult.AsyncDelegate as DelegateToCallMethod;

   52         List<string> myValues = myCustomDelegateAgain.EndInvoke(CallbackResult);

   53         if (myValues != null && myValues.Count > 0)

   54         {

   55             double cacheDuration = 0;

   56             if (!double.TryParse(ConfigurationManager.AppSettings["SomeCacheValue"], out cacheDuration))

   57             {

   58                 cacheDuration = 10; //default to 10

   59             }

   60             _requestContext.Cache.Insert(myCacheKey, myValues, null

   61                 , DateTime.Now.AddHours(cacheDuration), Cache.NoSlidingExpiration);

   62         }

   63          _isCacheLoaded = 0;

   64     }

   65 }

   66 

Remember that threads are overhead, and you should only use them when they are appropriate.  Also, blocking is bad, so make sure that you never block unless completely necessary.

Hope this helps!  Enjoy.

I've been working with Linq lately and thought I would post 2 examples on casting with Linq.  Most of the ways that you get data back from linq is in the IEnumerable<> type.  So, here's two ways to cast to an object that you can use:

Linq to SQL

Once you create your dbml file it will generate a class based on a table or your own custom class.  Once this is done, you can do the following to get your strongly typed object back:

LinqDataContext dataContext = new LinqDataContext(myConnectionString);
return dataContext.MyStoredProcedure().ToList();

One thing to remember - make sure that the method that Visual Studio creates for your stored procedure also returns the strongly typed class instead of the <T> (for whatever T is) that it might try to create.

Linq to XML

With Linq to Xml, just create your XDocument object by loading in the xml file.  Then you can do this (for whatever your StrongType happens to be):

XDocument myXmlDoc = XDocument.Load("somefile.xml");
IEnumerable<StrongType> items = from item in myXmlDoc (and whatever else your statement is to select items)
                                                    select new StrongType { StrongTypeProperty = item.Property};
return items.ToList();

Lately I've been doing a lot of research and development around patterns and unit testing.  One pattern in particular, Model View Presenter (MVP), I found to be a very good pattern for doing web development.  The only thing, is that if you want to learn about the MVP, there seem to be two options.  1)  Completely theoretical in which you talk about the design and what its supposed to accomplish or 2) Simple - very simple examples on how to use the MVP - that doesn't show how to expand the pattern.  So, I thought I would give it a shot to write about a more complex MVP pattern to try to handle real world scenarios.

Here's some requirements for this example:

  1. Have a control library to handle generic/default implementations
  2. Have different implementations of the same control, but not have to re-write a ton of the logic.
  3. Server controls will write out their properties.
  4. Animals with different two (or N) types.  For this example I'll use Dog and Cat.

Lets get started:

I start off by creating a new Control Library project that contains 3 controls:

  1. Animal Control - this will contain the default behavior
  2. Dog Control - this will have dog specific behavior
  3. Cat Control - this will have cat specific behavior

I'll start with the Animal Control.  The first thing I want to do is define my interface, I do so by creating a structure that looks like this:

namespace MVP_Example

{

    public interface IAnimalView

    {

        string MyNoise { get; set; }

        string MyHappyGesture { get; set; }

    }

}

I then create my Animal Control using the new interface and inheriting from WebControl.  This is the main control that handles most of the details I would like to display, and the main implementation of the view.  I added comments into the code to explain what I'm doing:

namespace MVP_Example

{

    public class AnimalControl : WebControl, IAnimalView

    {

        private AnimalPresenter _presenter;

        private string _myNoise;

        private string _myHappyGesture;

 

        protected override void OnInit(EventArgs e)

        {

            base.OnInit(e);

 

            //pass in this control (the view) to the presenter

            _presenter = new AnimalPresenter(this);

        }

        protected override void Render(HtmlTextWriter writer)

        {

 

            //Here I custom render myself

            writer.RenderBeginTag(HtmlTextWriterTag.P);

            //output my noise property as defined in the view

            writer.Write(string.Format("My Noise is {0}", MyNoise));

            writer.RenderEndTag();

 

            writer.RenderBeginTag(HtmlTextWriterTag.P);

            //output my gesture property as defined in the view

            writer.Write(string.Format("I'm happy by {0}", MyHappyGesture));

            writer.RenderEndTag();

 

        }

 

        #region IAnimalView Members

 

        public string MyNoise

        {

            get

            {

                return _myNoise;

            }

            set

            {

                _myNoise = value;

            }

        }

 

        public string MyHappyGesture

        {

            get

            {

                return _myHappyGesture;

            }

            set

            {

                _myHappyGesture = value;

            }

        }

 

        #endregion

    }

}

For my Animal Control I also have the presenter which sets up the default values:

namespace MVP_Example

{

    public class AnimalPresenter

    {

        private IAnimalView _view;

 

        public AnimalPresenter(IAnimalView view)

        {

            _view = view;

            _view.MyNoise = "Making Noise";

            _view.MyHappyGesture = "Wagging My Tail";

        }

    }

}

Next, I want to use that Animal Control, but for my dog control it barks as a noise, so I want to override that property.  I inherit from the Animal Control to get the implementation of IAnimalView that I just coded.  The only difference is that I have a special DogPresenter that inherits from Animal Presenter so that I can use that functionality that I already coded.  You'll notice how empty the control is, and that is good because you have all your logic where it should be!

Here is the Dog Control:

namespace MVP_Example

{

    public class DogControl : AnimalControl

    {

        private DogPresenter _presenter;

 

        protected override void OnInit(EventArgs e)

        {

            base.OnInit(e);

            _presenter = new DogPresenter(this);

        }

    }

}

Here is my Dog Presenter:

namespace MVP_Example

{

    public class DogPresenter : AnimalPresenter

    {

        private IAnimalView _view;

 

        public DogPresenter(IAnimalView view)

            : base(view)

        {

            _view = view; // get the view from the control

 

            // add my own special noise, but keep the generic animal gesture

            _view.MyNoise = "Bark";

        }

    }

}

I do the same with the Cat Control:

namespace MVP_Example

{

    public class CatControl : AnimalControl

    {

        private CatPresenter _presenter;

 

        protected override void OnInit(EventArgs e)

        {

            base.OnInit(e);

            _presenter = new CatPresenter(this);

        }

    }

}

Now with the cat presenter, it has its own noise and gesture, so I override those: 

namespace MVP_Example

{

    public class CatPresenter : AnimalPresenter

    {

        private IAnimalView _view;

 

        public CatPresenter(IAnimalView view)

            : base(view)

        {

            _view = view; // get the view from the control

            _view.MyNoise = "Meow"; // add my own special noise

            _view.MyHappyGesture = "Purring"; //I have my own happy gesture

        }

    }

}

Now to display these I just add a reference to the control library and add the controls to the page (here are just the lines I added to the aspx):

<%@ Register Assembly="MVP_Example" Namespace="MVP_Example" TagPrefix="animal" %>

<strong>animal: </strong><animal:AnimalControl runat="server" />

<strong>dog: </strong><animal:DogControl runat="server" />

<strong>cat: </strong><animal:CatControl runat="server" />

And the output is as follows:

animal:

My Noise is Making Noise

I'm happy by Wagging My Tail

dog:

My Noise is Bark

I'm happy by Wagging My Tail

cat:

My Noise is Meow

I'm happy by Purring

There are a few different ways to accomplish some major tasks and having your base functionality isolated and then use that base functionality in other classes.  With the MVP pattern you can pull out the logic from the user interface and keep it in the presenters.  The example from above with the inheritance is extremely useful if you have a lot of data to get off the http request everytime, such as the url query string items, etc.  Having unique implementations of the presenter for your controls is useful for having your own databinding implementations, etc.

Download the code: http://brob.members.winisp.net/MVP_Example.zip (Example was created with VS 2008 Beta 2)

I wanted to get my hands dirty with Silverlight Alpha 1.1 and so I decided to make a DJ table with two turntables where you can match two beats in different songs.  You can click the button on the bottom right of each turntable to get the music started.  You can pause it or rewind it by clicking and dragging backwards.  There's also a fader so that you can cue up the music.  There isn't a scratch feature nor is there a fast forward feature. 

Silverlight DJ

I didn't write one line of javascript in this application and the entire thing is controlled by managed C# code.  Have fun!

If you are having issues with your ASP.NET Ajax application after you deployed it in a web farm and you notice that your partial page refreshes are not working, or you have javascript null reference errors, the problem lies in a config setting.  By default the setting for the MachineKey in ASP.NET is AutoGenerate, so when the session hops from one server to another the next server can't deserialize the previous server's values.  Here's what we did to fix it.

1.  Uninstall the ASP.NET Ajax installation on each server in the cluster and reinstall the same bits on each server.  This will ensure that all servers are working from the same installation.  You can skip this step if you're sure that all servers have the same installation on them and no prior installation hanging around on the machine.  Remember to do an iisreset.  If you are receiving the error "Sys is undefined", this is probably what you need to do.

2.  Generate a machine key by following this article: http://msdn2.microsoft.com/en-us/library/ms998288.aspx.  There's a C# example at the bottom you can cut and paste into a console app and generate your key.  Grab that key and place it in the machine config on each of the servers.  This will make sure all the servers are using the same key to encode the viewstate. 

Hope this saves you some time and headaches.

I've been working on building MSDN style documents for my assemblies and wanted to automate this into my build script.  If you follow the example that comes with the Sandcastle download, it has a .bat file that executes commands for all transformations and executables.  I preferred a target file that I could add in a few properties and have the script build the files.

There was one major hang up, apparently the name of the produced documents is tied to the 'test' name.  I went so far as to modify one of the transformations (reflectionToChmProject.xsl) to look at the assembly name in the reflection.xml file and rename the files based on that.  But, it blew up at the last step of creating a chm file because it was still looking for 'test'.  So, I designed the target file so that if down the road the Sandcastle team release a version that supports naming the documents, then you can change that property.

To install, I created a folder in C:\Program Files\MSBuild\Microsoft\ called Sandcastle and dropped my target file in there.  Then I created a project file and imported the target and added the "CreateDocumentation" to the default targets.  Change your <CurrentDirectory> value to where the code lives (folder that contains .csproj) and then specify the assembly to build documentation for in the <Assembly> property.

Feel free to open up the .target file and modify or change what is supported - I created it as more of a template.  I'll eventually have the main project file change the current directory and specify multiple assemblies to build.  Then it can be useful for multiple assemblies when you build solutions.

Also, this is not supported by the Sandcastle team, just something I created to build documentation with.

Required Tools: HTML Help 2.0 SDK and HTML Help Workshop.

Download here: SandcatleTarget (contains test.proj and Microsoft.Sandcastle.targets)

Use of included code sample is subject to the terms specified at http://www.microsoft.com/info/cpyright.htm

The team I am working on just finished a re-write of MSDN and TechNet search.  The MSDN and TechNet search pages now allow users to get to their answers faster than ever! Some key enhancements to the search are:

  • Refinements and prescoping of search terms - after your initial search you can narrow or broaden based on sub-terms
  • AutoComplete for search terms - type text in the search and see what terms are best for our search
  • Globalized Search - switch your page to a particular language so its easier for you to search with.
  • Results Language Switching - want to see results for a different language?  This drop down is the spot to do it.

One feature I use all the time now is the IE7 MSDN search provider.  Click the "Got IE7 - Get our Search" link on the MSDN search page on the top banner and you'll get this in your IE7:

IE7 Search - then you can search from right inside your browser and get to your answers even quicker.

Try it out:  http://search.msdn.microsoft.com/search/ and http://search.technet.microsoft.com/search/

Now there's no other reason to search other search engines for MSDN or TechNet content!  If you don't find what you're looking for within the predefined scope of the search, you can expand your search to the internet in the refinement section:

MSDN Search Refinement

Also, check our Jeremiah's blog as I'm sure he will continue to post more about it: http://blogs.msdn.com/msdnsearchblog/

 

I was looking at a post on Mike Harsh's blog about a utility that turns XAML into javascript and I didn't entirely agree with what this utility accomplished.  A while back I posted an entry about hooking in web services, Silverlight (WPF/E) and ASP.NET Ajax.  Although I did use string concatenation in the sample, I was posting a simple example just to demonstrate how to piece those three technologies together.  After creating large solutions with multiple Silverlight components and really digging deep into the technology, I recommend a different way of building out applications.  Here's what I found to work best and a way to really manage all the pieces easily. 

Lets say you are building a list in XAML and what gets populated in that list comes from some data source (text file, web service, etc.).  Of course you could do this in javascript and create xaml in the javascript and add objects to the canvas.  But, from what I've found, this gets hard to manage and your js files become enormous.  What I did was create a XAML template and give your dynamic values based on format items, like so:

<Image Height="26" Width="32" Source="{2}" Canvas.Top="{3}" Canvas.Left="6"/>

Now, the file that has the above line of code in has a lot of different attributes that are set based on code.  So, lets see how to hook it up.  You have created elements that have the values being defined as a format item and you need to add those values.  How I did this was to create an object that has a property in it that represents the fragment, like this:

public struct Item

{

   public string XamlFragment;

}

Then set the property to the correct data item by streaming in the XAML template and replacing the format item with the correct value, like so:

string itemTemplate = HttpContext.Current.Server.MapPath("~/Xaml/Item.xaml");

            string xamlText = String.Format(File.ReadAllText(itemTemplate)

                , myfirstvalue

                , textTop

                , item.TypeIcon);

 

I built an ArrayList of Item structs in C# and then have a method in javascript to call a C# web service method that returns the arraylist.  In javascript, have your function that calls the web service method point to a function that takes in the results as a parameter, like so:
 

MyService.GetItems(OnSucceeded); //call web service

function OnSucceeded(result)

{

    _results = result;

    Array.forEach(_results,AddXamlResultElement);

}

 

Then use the Array.foreach method, and point it to the function to add the xaml fragment to the canvas, like so:

 

function AddXamlResultElement(element,index)

{

    properCanvas.children.Add(canvas.CreateFromXaml(element.XamlFragment));

}

Hopefully this will help you build projects and manage them that could potentially be very large.  As you can see, it cuts down on the amount of javascript you have to use to keep concatenating the strings and adding them.  Plus its a lot easier to maintain, speaking from experience.

If you have ever worked with ASP.NET and binding data to a repeater control or placing content inside master pages, you're probably familiar with how ASP.NET renames the control to make it unique.  This makes web developers have many headaches as they try to get to those controls from javascript.  Here's a scenario I was recently faced with:  I had a web control using some controls from the ASP.NET Ajax control toolkit, the TextBoxWatermarkExtender and a DropDownExtender, and a regular textbox for user input.  The web control containing all of those controls was placed on a page that also had a master page (as you can tell there is going to be some renaming once its rendered to the browser)  The action to perform was to check if the textbox was empty and display a message to the user.  The problem was getting to that textbox, checking the text and not getting the watermark text.  The answer to this is in the BehaviorID property of the TextBoxWatermarkExtender.  With this id you can give the name of the control and use that in javascript to find the control. 

First set the BehaviorID in the control that you're using.  That BehaviorID you give it will be the one you use in javascript to find that control.

So, the solution in javascript would be something similar to this:

    //this finds the object on the page or any control with a behavior id

    var obj = $find("watermarkextender_behaviorID_here"); 

 

    //the get_Text method returns the text of the control, and NOT the watermark text

    var objectText = obj.get_Text();

 

    if(objectText == '')

    {

        alert("Hey User!  Enter something useful!");

        return false;

    }

Recently I've been working with WPF/E and extending some code that I have to make it more visually enhanced.  To display the proper data on the page I wanted to do the following: call a web service asynchronously, have it return to me an arrary of a complex type which I could then work with in javascript to get the proper data so that I could create XAML to be displayed by my webpage.  Here's what I did to get it to work.

Before you run this make sure you have the latest downloadeds: the latest WPF/E SDK bits (December CTP 2006) as well as the latest release of ASP.NET AJAX (1.0 RC). 

For demonstration purposes I'll just return some date information.  Now the first thing, create the web service and return a complex type.  For this I created a web service and referenced the System.Web.Script.Services namespace.  Here's a look at the code.

using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Collections;

using System.Web.Services;

using System.Web.Services.Protocols;

using System.Web.Script.Services;

 

namespace MyComplexType

{

    public class MyInformation

    {

        public string Day;

        public string Month;

        public string Year;

    }

    [WebService(Namespace = "http://tempuri.org/")]

    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

    // Here's where you tell ASP.NET AJAX to create a proxy for your complex type with the GenerateScriptType attribute

    [GenerateScriptType(typeof(MyInformation))]

    [ScriptService]

    public class MyComplexTypeService

    {

        public MyComplexTypeService()

        {

        }

 

        [WebMethod]

        public ArrayList GetMyInformation()

        {

            ArrayList list = new ArrayList();

            for (int counter = 0; counter < 2; counter++)

            {

                MyInformation info = new MyInformation();

                info.Day = System.DateTime.Today.Day.ToString();

                info.Month = System.DateTime.Today.Month.ToString();

                info.Year = System.DateTime.Today.Year.ToString();

                list.Add(info);

            }

            return list;

        }

    }

}

I also want to produce some XAML for my page that displays my data.  So, I create a simple XAML file that has a couple of canvas elements: 

<?xml version="1.0" encoding="utf-8"?>

<Canvas xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="216" Height="292" Background="LightGray">

  <Canvas x:Name="DataCanvas" Height="70" Width="200" Canvas.Left="8" Canvas.Top="200"></Canvas>

</Canvas>

 

 

The next thing I thought about was how my page would use the javascript to interact with the page and the XAML.  So, in my page I have a simple input control that the onclick method is set to call a javascript method called "OnLookup()"  From here this kicks off my call to the web service.  Lets take a look at the javascript file:
 

var _results;

 

function OnLookup()

{

    ClearList();

    MyComplexType.MyInformation.MyComplexTypeService.GetMyInformation(OnSucceeded);

}

 

function OnSucceeded(result)

{

    _results = result;

    Array.forEach(result,AddXamlElement);

   

}

 

function ClearList()

{

    //This gets a reference to the aghost control on the HTML page that holds the XAML object.

    var canvas = $get("WpfeControl");

   

    //next I get the canvas I want to add the data to in the form of a XAML rectangle.

    var properCanvas = canvas.findName("DataCanvas");

   

    //clear all the elements

    properCanvas.children.clear();

}

 

function AddXamlElement(element,index)

{

    //index automatically increments for each call, so I use that to name my rectangles

   

    //This gets a reference to the aghost control on the page that holds the XAML object.

    var canvas = $get("WpfeControl");

   

    //next I get the canvas I want to add the data to in the form of a XAML rectangle.

    var properCanvas = canvas.findName("DataCanvas");

 

    //Create a new XAML rectangle and give it a namespace and a name

    var xamlRect = '<Rectangle xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Name="';

    xamlRect += "Rect_"+index;

    xamlRect += '" Height="30" Width="170" Canvas.Left="2" Canvas.Top="';

    if(index === 0){xamlRect += '2';}

    else{xamlRect += (32 * index);}

    xamlRect += '" Stroke="White" StrokeThickness="1" MouseLeftButtonDown="javascript:DoSomething">';

    xamlRect += '<Rectangle.Fill>';

    xamlRect += '<LinearGradientBrush  StartPoint="0,0" EndPoint="1,0">';

    xamlRect += '<GradientStop Color="Black" Offset="0.0" />';

    xamlRect += '<GradientStop Color="Blue" Offset="0.50" />';

    xamlRect += '<GradientStop Color="Black" Offset="1.0" />';

    xamlRect += '</LinearGradientBrush>';

    xamlRect += '</Rectangle.Fill>';

    xamlRect += '</Rectangle>';

    var xamlText = '<TextBlock xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Name="';</