Gerald Bauer (SchemaSoft .NET Division)
BC .NET User Group (.net BC) Talk, December 2004
Disclaimer: I work at SchemaSoft. The opinions expressed here are my own, and neither SchemaSoft nor any other party necessarily agrees with them.
Disclaimer: I work at SchemaSoft. The opinions expressed here are my own, and neither SchemaSoft nor any other party necessarily agrees with them.
Find out more about SchemaSoft @ schemasoft.com
XAML - eXtensible Application Markup Language
pronouced "zammel"
Lets you create desktop applications, web applications, animations, print documents, and much much more using markup
XAML combined with the next-gen Windows graphics kernel (code-named Avalon) is an all-in-one markup language for hypertext (HTML), vector graphics (SVG), animations (Flash,SMIL), print documents (PDF,XSL-FO), forms (XForms,XUL), and much more.
The best of both worlds: In the XAML world there's no longer a difference between a web application and a windows application. Windows is the browser kernel and Internet Explorer is just a shell.
The best of all worlds: A single programming model for media, documents and applications.
<Window Text="Xul Challenge 2004"> <FlowPanel> <SimpleText>Counter Sample</SimpleText> <TextBox ID="ValueTextBox" HorizontalAlignment="Center" IsReadOnly="True"/> <FlowPanel HorizontalAlignment="Center" Width="100%"> <Button Click="Dec">Dec (-)</Button> <Button Click="Clear">Clear</Button> <Button Click="Inc">Inc (+)</Button> </FlowPanel> </FlowPanel> </Window> |
<TextPanel Background="white"> <Section> <Heading>Adaptive-flow-format Example</Heading> <Paragraph>This example shows the advanced capabilities of adaptive-flow format. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure.</Paragraph> <Paragraph>Notice how images and text are flowed intelligently to enhance the reading experience. Lorem ipsum dolor sit amet, consectetuer dipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure.</Paragraph> <Paragraph>Adaptive-flow format is an exciting new feature. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure.</Paragraph> </Section> </TextPanel> |
Smiley Winking
<Canvas Width="120" Height="120"> <Ellipse CenterX="60" CenterY="60" RadiusX="50" RadiusY="50" Fill="Gray" Stroke="Black"/> <Ellipse CenterX="40" CenterY="40" RadiusX="10" RadiusY="10" Fill="Blue"/> <Ellipse CenterX="80" CenterY="40" RadiusX="10" RadiusY="10" Fill="Blue"> <Ellipse.RadiusY> <LengthAnimationCollection xmlns="anim"> <LengthAnimation From="10" To="1" Duration="0.5" AutoReverse="True" RepeatDuration="Indefinite"/> </LengthAnimationCollection> </Ellipse.RadiusY> </Ellipse> <Polyline Points="30, 70, 60, 80, 90, 70" StrokeThickness="10" Stroke="Red"/> </Canvas> |
XAML Version
<Button Background="LightSeaGreen" FontSize="24pt">Calculate</Button> |
C# Version
Button b = new Button(); b.Background = Brushes.LightSeaGreen; b.FontSize = new FontSize( 24, FontSizeType.Point ); b.Content = "Calculate"; |
XAML Version
<TextPanel Background="BlanchedAlmond" FontFamily="Comic sans MS" FontSize="36pt" HorizontalAlignment="Center"> Hello, world! </TextPanel> |
C# Version
using System; using System.Windows; using System.Windows.Controls; using System.Windows.Media; class HelloWorldApp : Application { static void Main() { HelloWorldApp app = new HelloWorldApp(); app.Run(); } protected override void OnStartingUp( StartingUpCancelEventArgs args ) { Window win = new Window(); TextPanel tp = new TextPanel(); tp.Background = Brushes.BlanchedAlmond; tp.FontFamily = "Comic sans MS"; tp.FontSize = new FontSize( 36f, FontSizeType.Point); tp.HorizontalAlignment = System.Windows.HorizontalAlignment.Center; tp.TextRange.Text = "Hello, world"; win.Children.Add(tp); win.Show(); } } |
<GridPanel> | lays out children in rows and columns |
<DockPanel> | lays out children docked to the top, bottom, left, right side of the panel |
<FlowPanel> | lays out children left-to-right and adds line breaks, and text wraps if necessary |
<Canvas> | absolute positioning using x, y coordinates |
<Section> | like XHTML2 <section> |
<Heading> | like HTML <h1>, <h2>, <h3>, <h4>, <h5>, <h6> |
<Paragraph> | like HTML <p> |
<Block> | like HTML <div> |
<Inline> | like HTML <span> |
<Note> | like HTML <blockquote> |
<Line> | like XHTML2 <l> |
<LineBreak> | like HTML <br> |
<List> | like HTML <ul>,<ol> |
<HyperLink> | like HTML <a> |
<Image> | like HTML <img> |
<Bold> | like HTML <b> |
<Italic> | like HTML <i> |
and many more |
Article Tip: A Standards-based Look at XAML's Feature by Nigel McFarlane
<Canvas> | like SVG <svg> | A drawing area |
<Ellipse> | like SVG <ellipse>,<circle> | Draws an ellipse |
<Line> | like SVG <line> | Draws a straight line |
<Path> | like SVG <path> | Draws a series of connected lines or curves |
<Polygon> | like SVG <polygon> | Draws a polygon |
<Polyline> | like SVG <polyline> | Draws a series of connected straight lines |
<Rectangle> | like SVG <rect> | Draws a - suprise, suprise - rectangle |
<Glyphs> | like SVG <glyph> | Represents one or more text characters (glyphs) used to represent fonts. |
<TransformDecorator> | like SVG transform attribute | Rotates, scales, shears or relocates shapes |
Article Tip: A Standards-based Look at XAML's Feature by Nigel McFarlane
<Style def:Name="Style1"> <Button Background="Red" /> </Style> <Style def:Name="Style2" BasedOn="{Style1}"> <Button FontSize="24" /> </Style> |
Usage:
<Button Style="{Style1}">Style 1</Button> <Button Style="{Style2}">Style 2</Button> |
There's no money in open royality-free standards for vendors.
Q: Why doesn't Microsoft invest in open royality-free standards?
Robert Scoble (Microsoft Tech Evangelist): We're not a charity. We are investing billions of dollars in our technology and our shareholders want a return on investment.
2847 Microsoft patents and counting.
XML Syntax Extensions:
"Standard" Syntax
<Button Background="Red"> Cancel </Button> |
Compound Syntax
<Button> Cancel <Button.Background> Red </Button.Background> </Button> |
Why?
<Button> Cancel <Button.Background> <SolidColorBrush> <SolidColorBrush.ColorAnimations> <ColorAnimation From="Red" To="Blue" Duration="10" Fill="Hold"/> </SolidColorBrush.ColorAnimations> </SolidColorBrush> </Button.Background> </Button> |
"Standard" Syntax
<Text> <Text.ImageEffect> <ImageEffectBlur Radius="3"/> </Text.ImageEffect> Inside XAML </Text> |
Compact Syntax
<Text ImageEffect="*ImageEffectBlur(Radius=3)"> Inside XAML </Text> |
eXtensible Avalon Markup Language - markup language for the Windows 2006 graphics kernel (desktop composition engine code-named Avalon) only
eXtensible Application Markup Language - markup language for wiring up all kinds of .NET objects - no longer tied to Windows 2006 graphics kernel (code-named Avalon)
eXtensible Application Markup Language - markup language for wiring up all kinds of objects - no longer tied to .NET; XAML parsers for Java, Flash, and so on upcoming
Windows 2006 graphics kernel only shipping with Windows 2006 (code-named Longhorn)
next-generation Windows graphics kernel available as an addon package (WinFX SDK) for Windows XP and Windows Server 2003 (requires .NET2 and managed DirectX)
All the XAML parsers essentially work the same at the core:
That, in a nutshell, is it.
Source: Writing XAML Friendly Assemblies by Marc Clifton
Unsupported code-drop sample of XAML-like parser for Windows Forms (.NET 1.1+) by Joe Stegman (Microsoft)
Lets you build Windows Forms using - suprise, suprise - XML. Example:
<Form wfml:root="true" Text="Basic Sample" Size="300,200"> <Label Text="Hello World" AutoSize="True" Location="10,20"/> <method.Show/> </Form> |
Find out more @ http://windowsforms.net/articles/wfml.aspx
Supported XAML parser for .NET (.NET1, .NET2, Compact) by Marc Clifton
Dual Licensed (Best of Both Worlds) - Free, Open Source Version and Commercial "Classic" Licensed Version
What can MyXAML do?
<MyXaml> <Form Name="AppMainForm" Text="XUL Challenge 2004" StartPosition='CenterScreen' Size="256, 144" FormBorderStyle="FixedSingle"> <Style def:Name="ButtonStyle"> <StyleProperties> <PropertyStyle FlatStyle="System"/> <PropertyStyle Size="72, 25"/> </StyleProperties> </Style> <Controls> <GroupBox Name="GroupBox1" Text="Counter" Location="8, 8" Size="232, 96" FlatStyle="System"> <Controls> <TextBox Name="TextBox1" Text="0" Location="8, 24" Size="216, 23" TextAlign="Center" BackColor="Black" ForeColor="Yellow" Font="Microsoft Sans Serif, 10pt, style=Bold"/> <Button Name="Button1" Text="Dec(-)" Location="8, 56" Style="{ButtonStyle}" Click="OnDec"/> <Button Name="Button2" Text="Clear" Location="80, 56" Style="{ButtonStyle}" Click="OnClear"/> <Button Name="Button3" Text="Inc(+)" Location="152, 56" Style="{ButtonStyle}" Click="OnInc"/> </Controls> </GroupBox> </Controls> </Form> </MyXaml> |
MyXAML Loader. Lets you start up an application from the .XAML file directly. (More)
MyXAML Lint. Lets you check your .XAML files "ahead-of-time" for errors. (More)
MyXAML Visual Studio Serializer. Lets you use Visual Studio to design forms and save your forms as XAML. (More)
MyXAML Solution Packs.
MyXAML Forms Designer (Upcoming).
Seven Golden Rules for "XAML-Friendly" .NET Libraries
Source: Writing XAML Friendly Assemblies by Marc Clifton
C# Source:
public class Name { protected string firstName; protected string lastName; protected ArrayList phoneNums; public string FirstName { get {return firstName;} set {firstName=value;} } public string LastName { get {return lastName;} set {lastName=value;} } public ArrayList PhoneNums { get {return phoneNums;} } public Name() { phoneNums=new ArrayList(); } } |
XAML "Out-of-the-Box" Markup Usage:
<Name FirstName="Marc" LastName="Clifton"> <PhoneNums> <PhoneNum Type="Home" Number="800-333-1212"/> <PhoneNum Type="Cell" Number="619-222-2345"/> </PhoneNums> </Name> |
Gtk# Source:
Window window = new Window("Simple Application"); // 1 Label label = new Label("Name"); // 1 Entry entry = new Entry(); Button button = new Button("Hello!"); // 1 window.DeleteEvent += new DeleteEventHandler(window_DeleteEvent); button.Clicked += new EventHandler(button_Clicked); VBox vbox = new VBox(); HBox hbox = new HBox(); hbox.PackStart(label, false, false, 12); // 2 hbox.PackStart(entry, false, false, 12); // 2 vbox.PackStart(hbox); // 2 vbox.PackStart(button, false, false, 12); // 2 window.Add(vbox); // 3 window.SetDefaultSize(200, 100); |
Issues:
Conclusion: If you want to "script" your .NET libraries using markup (e.g. XAML) than you either have to follow the seven golden rules for "XAML-friendly" .NET libraries or you have to create custom XAML parser extensions.
MyXAML --XAML-style GUI Generator
Generate controls, set property values, and wire up event handlers at runtime from an XML definition.
http://www.codeproject.com/cs/miscctrl/xmlGuiGenerator.asp
A Vector Graphics Rendered Animated Clock
Demos using MyXAML with a vector graphics engine to create an analog clock
http://www.codeproject.com/dotnet/vgclock.asp
An RSS 2.0 Blog Reader Written In MyXAML
An RSS 2.0 Blog Reader Written in MyXAML
http://www.codeproject.com/dotnet/RssMyXaml.asp
Consuming A Weather Web Service With MyXAML
Demos using MyXAML to consume a web service
http://www.codeproject.com/dotnet/MyXamlWeather.asp
MyXAML Database Tutorial
Demos connecting, displaying, and manipulating data in a database using MyXAML.
http://www.myxaml.com/wiki/ow.asp?DatabaseTutorial
MycroXAML
A declarative XML parser in less than 300 lines of code
http://www.codeproject.com/dotnet/MycroXaml.asp
Writing XAML Friendly Assemblies
How to write assemblies so that they will work with the various XAML parsers that are starting to emerge.
http://www.codeproject.com/gen/design/xaml.asp
MyXAML News - Marc Clifton Blog
http://myxaml.com/marcclifton
Richmond Post Q & A with Marc Clifton
http://xul.sourceforge.net/post/2004/04/xul...part_i.html |
http://xul.sourceforge.net/post/2004/05/xul...part_ii.html
A XAML parser in less than 300 lines of C# code; first published in a CodeProject article by Marc Clifton (of MyXAML fame); MycroXAML is in the public domain
What can MycroXAML do?
MycroXAML
<MycroXaml Name="Form" xmlns:wf="System.Windows.Forms, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" xmlns:mc="MycroXaml.MxContainer, MycroXaml.MxContainer"> <wf:Form Name="AppMainForm" Text="Color Chooser" ClientSize="400, 190" BackColor="White" FormBorderStyle="FixedSingle" StartPosition="CenterScreen"> <wf:Controls> <wf:TrackBar Name="RedScroll" Orientation="Vertical" TickFrequency="16" TickStyle="BottomRight" Minimum="0" Maximum="255" Value="128" Scroll="OnScrolled" Size="42, 128" Location="10, 30"/> <wf:TrackBar Name="GreenScroll" Orientation="Vertical" TickFrequency="16" TickStyle="BottomRight" Minimum="0" Maximum="255" Value="128" Scroll="OnScrolled" Size="42, 128" Location="55, 30"/> <wf:TrackBar Name="BlueScroll" Orientation="Vertical" TickFrequency="16" TickStyle="BottomRight" Minimum="0" Maximum="255" Value="128" Scroll="OnScrolled" Size="42, 128" Location="100, 30"/> <wf:Label Size="40,15" TextAlign="TopCenter" Font="Microsoft Sans Serif, 8.25pt, style= Bold" Location="10, 10" ForeColor="Red" Text="Red"/> <wf:Label Size="40,15" TextAlign="TopCenter" Font="Microsoft Sans Serif, 8.25pt, style= Bold" Location="55, 10" ForeColor="Green" Text="Green"/> <wf:Label Size="40,15" TextAlign="TopCenter" Font="Microsoft Sans Serif, 8.25pt, style= Bold" Location="100, 10" ForeColor="Blue" Text="Blue"/> <wf:Label Name="RedValue" Size="40,15" TextAlign="TopCenter" Font="Microsoft Sans Serif, 8.25pt, style= Bold" Location="10, 160" ForeColor="Red"> <wf:DataBindings> <mc:DataBinding PropertyName="Text" DataSource="{RedScroll}" DataMember="Value"/> </wf:DataBindings> </wf:Label> <wf:Label Name="GreenValue" Size="40,15" TextAlign="TopCenter" Font="Microsoft Sans Serif, 8.25pt, style= Bold" Location="55, 160" ForeColor="Green"> <wf:DataBindings> <mc:DataBinding PropertyName="Text" DataSource="{GreenScroll}" DataMember="Value"/> </wf:DataBindings> </wf:Label> <wf:Label Name="BlueValue" Size="40,15" TextAlign="TopCenter" Font="Microsoft Sans Serif, 8.25pt, style= Bold" Location="100, 160" ForeColor="Blue"> <wf:DataBindings> <mc:DataBinding PropertyName="Text" DataSource="{BlueScroll}" DataMember="Value"/> </wf:DataBindings> </wf:Label> <wf:PictureBox Name="ColorPanel" Location="90, 0" Size="200, 100" Dock="Right" BorderStyle="Fixed3D" BackColor="128, 128, 128"/> </wf:Controls> </wf:Form> </MycroXaml> |
Source: Code Project Article: MycroXAML by Marc Clifton
MSXAML
<DockPanel xmlns="http://schemas.microsoft.com/2003/xaml" xmlns:def="Definition" def:Language="C#"> <FlowPanel Width="50%" DockPanel.Dock="Left" > <FlowPanel.Resources> <Style> <Text Height="36pt" FontSize="12pt" HorizontalAlignment="Center" VerticalAlignment="Center"/> </Style> <Style> <VerticalSlider Width="50%" Margin="25%,0,25%,0" Minimum="0" Maximum="255" SmallChange="1" LargeChange="16" DockPanel.Dock="Fill"/> </Style> </FlowPanel.Resources> <DockPanel Width="33.3%"> <Text DockPanel.Dock="Top" Foreground="Red">Red</Text> <Text DockPanel.Dock="Bottom" Foreground="Red">0</Text> <VerticalSlider ID="RedScroll" ValueChanged="OnScrolled"/> </DockPanel> <DockPanel Width="33.3%"> <Text DockPanel.Dock="Top" Foreground="Green">Green</Text> <Text DockPanel.Dock="Bottom" Foreground="Green">0</Text> <VerticalSlider ID="GreenScroll" ValueChanged="OnScrolled"/> </DockPanel> <DockPanel Width="33.3%"> <Text DockPanel.Dock="Top" Foreground="Blue">Blue</Text> <Text DockPanel.Dock="Bottom" Foreground="Blue">0</Text> <VerticalSlider ID="BlueScroll" ValueChanged="OnScrolled"/> </DockPanel> <def:Code> ... </def:Code> </FlowPanel> <TextPanel ID="ColorPanel" DockPanel.Dock="Right" Width="50%" Background="Black"/> </DockPanel> |
Source: MSDN Article: Code Name Avalon: Create Real Apps Using New Code and Markup Model by Charles Petzold
Q: Can you tell us how MyXAML differs from Microsoft's Windows Forms Markup Language (WFML)?
Marc Clifton: There are some interesting differences. WFML provides a "method" element, allowing you to call a method with zero or one parameters. This is sort of a poor man’s implementation of inline coding, which MyXaml provides as a complete runtime compiled service. The WFML parser uses a "property-dot" notation for dealing with property types that the type converter can’t handle, similar to the Avalon-XAML compound property. Both are completely unnecessary if the parser is implemented correctly. For example, in WFML:
<MenuItem Text="New" > <property.MenuItems> <MenuItem Text="Window" Shortcut="CtrlN" /> <MenuItem Text="-" /> <MenuItem Text="Message" /> <MenuItem Text="Post" /> <MenuItem Text="Contact" /> <MenuItem Text="Internet Call" /> </property.MenuItems> </MenuItem> |
The MyXaml version is written:
<MenuItem Text="New" > <MenuItems> <MenuItem Text="Window" Shortcut="CtrlN" /> <MenuItem Text="-" /> <MenuItem Text="Message" /> <MenuItem Text="Post" /> <MenuItem Text="Contact" /> <MenuItem Text="Internet Call" /> </MenuItems> </MenuItem> |
One of the most striking differences however is WFML’s "argument" attribute, which allows you to instantiate classes that do not provide a default constructor, passing one and only one argument to the constructor. MyXaml handles this by implementing a generic Adapter Pattern so that non-compliant classes can be adapted to work with MyXaml. At some point, I’d like to look at the issue of instantiating classes that require arguments. .NET’s MethodInfo.Invoke already does all the hard work of finding the method that matches the argument types, so it really shouldn’t be that hard to pass both strings and references to classes already instantiated in the markup. MyXaml also provides a growing collection of useful extensions such as xml data sources, data binding, etc.
Q: Can you tell us how MyXAML differs from Microsoft's Longhorn Avalon XAML?
Microsoft has frozen Internet Explorer for years and Microsoft is busy to add all new features not to the browser but to the next-gen Windows OS codenamed Longhorn to create a compelling reason for consumer to upgrade and buy a Windows license.
Microsoft has no interest in investing and working together to build open royality-free standards such as SVG, XForms, XUL, XHTML 2.0, and other next-gen markup languages for a rich internet for everyone. Instead Microsoft tries to establish its very own all-in-one Windows-only markup language as a defacto industry standard competing head on with HTML, SVG, XUL, CSS, PDF, and many more open royality-free formats
Rob Relyea (Avalon Program Manager, XAML "spec owner", Avalon Architect Team Member)
XAML is a markup language that can be used on Longhorn for many things including creating desktop apps, web pages, and printable documents.
Chris Anderson (Avalon Core Developer, Avalon Architect Team Member)
We are past the world of generating static snapshots of display and blasting them down to a client.
My not-to-hidden agenda here is simple - dynamic applications should be dynamic on the client. The server should send data - either through web services, database access, or any other wire protocol - and the client should consume that data and generate UI. The model of a server trying to generate the correct display for a client is just broken.
I'm a bit confused by the concern that Microsoft is somehow trying to threaten or take over the web with the introduction of a markup language to program Windows applications. XAML is a new programming model for the next release of Windows, code named "Longhorn". That's it.
Joe Beda (Avalon Core Graphics Developer)
Our rendering model is very much like that of SVG.
Our markup isn't the same mostly because XAML is a direct reflection of the programming model.
Our object model (OM) doesn't match the SVG DOM because we choose to go with an object model that more closely matches what we think our users expect.
XHTML and SVG both have image elements. We avoid this duplicity. Text is another area where we avoid a large amount of duplication.
Zhanbo Sun (Avalon Team Member)
A Longhorn application can run inside or outside Internet Explorer. The support for the new programming model is implemented by Avalon rather than by Internet Explorer. Technically speaking, Internet Explorer serves as the host when HelloPDC.xaml runs.
Part of the Longhorn strategy is to extract from the web all of the services with any profit model at all: web magazines, auction sites, news, online retailers, and so on. When Microsoft tempts these organizations and communities to Longhorn, the web suffers the death of a thousand cuts. Over here will be the standards-based web, with a gradually shrinking set of web sites. Over there will be the future Longhorn-based proprietary global infrastructure—a global version of the early Novell NetWare, a sort of stock market/CNN fusion for content delivery. For Microsoft, the best possible outcome is for the standards-based web to be reduced to the profitless: a few idealistic hippies, some idle perverts, and the disaffected. Few others will want to go there; so every day there will be fewer traditional websites, every day less relevance.
Source: Smoke, Mirrors and Silence: The Browser Wars Reignite by Nigel McFarlane
Amazon:
Customer:
Google competes head on with Microsoft (e.g. desktop search, internet search, email service, etc.) and thus Google will try to break free from the dependence on Internet Explorer (and thus Windows) and go so far as to create its own browser (e.g. GBrowser) offering XAML-like HTML extensions for creating desktop-style applications.
Reach - HTML browser are ubiquitous, don't require Windows license, use open royality-free patent-free standards
Rich - XAML offers richer user experience, requires Windows license, protected by patents, "standard" controlled by single for-profit company
Marketshare Forecast - XAML-Ready (Windows) Computers in 2006-2008
Year | New Computers | All Computers |
2006 | 80 % | 20 % |
2007 | 90 % | 40 % |
2008 | 95 % | 60 % |
Microsoft XAML Tag Quick Reference
http://winfx.msdn.microsoft.com/winfx/port_ref_elements.aspx
Code Name Avalon: Create Real Apps Using New Code and Markup Model
by Charles Petzold, MSDN Magazine, January 2004
http://msdn.microsoft.com/msdnmag/issues/04/01/Avalon
Code Name Longhorn: A First Look at Writing and Deploying Apps in the Next Generation of Windows
by Dino Esposito, MSDN Magazine, January 2004
http://msdn.microsoft.com/msdnmag/issues/04/01/DevelopingAppsforLonghorn
Chapter 3: Controls and XAML - Introducing "Longhorn" for Developers
by Brent Rector (Wise Owl Consulting), December 2003
http://msdn.microsoft.com/library/en-us/dnintlong/html/longhornch03.asp
Inside XAML
by Ian Griffiths, ONDotnet.com, January 2004
http://www.ondotnet.com/pub/a/dotnet/2004/01/19/longhorn.html
A Standards-based Look at XAML's Features
by Nigel McFarlane, DevX, April 2004
http://www.devx.com/webdev/Article/20834
Rob Relyea (Microsoft XAML Spec Owner - Mr. XAML)
http://www.longhornblogs.com/rrelyea
Mobiform XAML (Commercial)
http://www.mobiform.com
Xamlon (Commercial)
http://xamlon.com
MyXAML (Dual-Licensed - Open Source and "Classic" Commercial License)
http://myxaml.com
MycroXAML (Public Domain)
http://sourceforge.net/projects/xaml
xaml-talk (XAML Developers Group)
http://groups.yahoo.com/group/xaml-talk
XAML Resources
by Marc Clifton, Code Project, November 2004
http://www.codeproject.com/dotnet/xamlresources.asp
Visit the United XAML site @ http://unitedxaml.org for more info