天天看点

.Net Mirco Framework 2007技术大会

.Net Mirco Framework 2007技术大会

2006年在《程序员》杂志上通过看马宁的专栏文章,第一次知道了.Net MF。一年后的今天终于近距离地接触了.Net Mirco Frmaework,对MF有了一定的感性认识。

最近公司很多项目都有大量嵌入式设备使用,由于WinCE系统相对较大,对硬件平台要求过高,所以对.Net MF一直比较关注。今天总算大开眼界了。

微软公司的Colin Miller和Digi公司的John Leier在上午的演讲拉开了.Net MF序幕,针对嵌入式领域,一个从软件角度进行阐述,另一个从硬件平台角度进行呼应,一软一硬,二者强强联合,恐怕未来嵌入式智能设备一半以上的项目开发要被其收入囊中了。下午的中文演讲给人感觉有些干瘪,两三个演讲,平均短短十几分钟就草草收场。后来微软公司杜伟的演讲,从VS2005一行行难以看清的代码,到一个个令人惊艳的样例把MF开发技术推向最前台。

Digi公司很是有魄力,免费送出15套开发套件(5个作为回答问题的奖品,10个抽奖),自己即没有回答问题的勇气,也没有好的运气,只好剩下羡慕的份了。

最后为每个人送出的1G优盘(类似微软今年MVP大礼包中的优盘)很有分量,不仅是1G的容量,并且里面竟然把所有的幻灯片拷贝其中,更没有想到的是,MF 的SDK也在里面,真棒!

回到家迫不及待装了一份MF SDK(MicroFrameworkSDK.MSI 区区只有5998 kb,强!),有模拟器,也有示例。

其中几个示例不知道为什么编译成功,就是运行失败,对第二示例比较感兴趣,可以绘制图形,并且可以贴图。

相关代码如下:

.Net Mirco Framework 2007技术大会

// Copyright (C) Microsoft Corporation.  All rights reserved.

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

using System;

.Net Mirco Framework 2007技术大会

using System.Collections;

.Net Mirco Framework 2007技术大会

using System.Threading;

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

using Microsoft.SPOT;

.Net Mirco Framework 2007技术大会

using Microsoft.SPOT.Input;

.Net Mirco Framework 2007技术大会

using Microsoft.SPOT.Hardware;

.Net Mirco Framework 2007技术大会

using Microsoft.SPOT.Presentation;

.Net Mirco Framework 2007技术大会

using Microsoft.SPOT.Presentation.Media;

.Net Mirco Framework 2007技术大会

using Microsoft.SPOT.Presentation.Controls;

.Net Mirco Framework 2007技术大会

using Microsoft.SPOT.Presentation.Shapes;

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

using PresentationDemo;

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

/**///////////////////////////////////////////////////////////////////////////////

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

public sealed class MyApp : Application ...{

.Net Mirco Framework 2007技术大会

   // This static field prevents the object from being GC'd

.Net Mirco Framework 2007技术大会

   private static GpioButtonInputProvider s_gpioInputProvider;

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

   public Font NinaBFont;

.Net Mirco Framework 2007技术大会

   public Font SmallFont;

.Net Mirco Framework 2007技术大会

   public Bitmap Snowflake;

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

   private MyApp() ...{

.Net Mirco Framework 2007技术大会

      // Initialize the Buttons/Pins dispatcher

.Net Mirco Framework 2007技术大会

      s_gpioInputProvider = new GpioButtonInputProvider(this.Dispatcher, null);

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      // Load some resources

.Net Mirco Framework 2007技术大会

      NinaBFont = Resources.GetFont(Resources.FontResources.NinaBFont);

.Net Mirco Framework 2007技术大会

      SmallFont = Resources.GetFont(Resources.FontResources.SmallFont);

.Net Mirco Framework 2007技术大会

      Snowflake = Resources.GetBitmap(Resources.BitmapResources.Snowflake);

.Net Mirco Framework 2007技术大会

   }

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

   protected override void OnStartup(EventArgs e) ...{

.Net Mirco Framework 2007技术大会

      // Create and set the application's main window

.Net Mirco Framework 2007技术大会

      this.MainWindow = new MainMenuWindow(this);

.Net Mirco Framework 2007技术大会

      base.OnStartup(e);

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

   public void GoHome() ...{

.Net Mirco Framework 2007技术大会

      Buttons.Focus(this.MainWindow); // Set focus back to the main window

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

   public static void Main() ...{

.Net Mirco Framework 2007技术大会

      new MyApp().Run();   // Start the app's main window

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

}

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

// This is the base class of all our windows; it makes every window visible, 

.Net Mirco Framework 2007技术大会

// sets the window's size to the full size of the LCD, and give the window focus

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

internal class PresentationWindow : Window ...{

.Net Mirco Framework 2007技术大会

   protected MyApp m_app;

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

   protected PresentationWindow(MyApp app) ...{

.Net Mirco Framework 2007技术大会

      m_app = app;

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      // Make the window visible and the size of the LCD

.Net Mirco Framework 2007技术大会

      this.Visibility = Visibility.Visible;

.Net Mirco Framework 2007技术大会

      this.Width = SystemMetrics.ScreenWidth;

.Net Mirco Framework 2007技术大会

      this.Height = SystemMetrics.ScreenHeight;

.Net Mirco Framework 2007技术大会

      Buttons.Focus(this); // Set focus to this window

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

   protected override void OnButtonDown(ButtonEventArgs e) ...{

.Net Mirco Framework 2007技术大会

      // Remove this window form the Window Manager

.Net Mirco Framework 2007技术大会

      this.Close();

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      // When any button is pressed, go back to the Home page

.Net Mirco Framework 2007技术大会

      m_app.GoHome();

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

internal sealed class MainMenuWindow : PresentationWindow ...{

.Net Mirco Framework 2007技术大会

   private ListBox m_listbox;

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

   public ListBox MainListBox ...{ get ...{ return m_listbox; } }

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

   public MainMenuWindow(MyApp app)

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      : base(app) ...{

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      Color instructionTextColor = ColorUtility.ColorFromRGB(192, 192, 192);

.Net Mirco Framework 2007技术大会

      Color backgroundColor = ColorUtility.ColorFromRGB(26, 118, 183);  

.Net Mirco Framework 2007技术大会

      Color unselectedItemColor = ColorUtility.ColorFromRGB(192, 192, 255);   // Unselected listbox item color

.Net Mirco Framework 2007技术大会

      Color selectedItemColor = Colors.White;                                 // Selected listbox item color

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      // The Main window contains a veritcal StackPanel

.Net Mirco Framework 2007技术大会

      StackPanel panel = new StackPanel(Orientation.Vertical);

.Net Mirco Framework 2007技术大会

      this.Child = panel;

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      // The top child contains text with instructions

.Net Mirco Framework 2007技术大会

      TextFlow textflow = new TextFlow();

.Net Mirco Framework 2007技术大会

      textflow.TextAlignment = TextAlignment.Center;

.Net Mirco Framework 2007技术大会

      textflow.Visibility = Visibility.Visible;

.Net Mirco Framework 2007技术大会

      textflow.TextRuns.Add(

.Net Mirco Framework 2007技术大会

         new TextRun(Resources.GetString(Resources.StringResources.SelectAnItemFromBelow),

.Net Mirco Framework 2007技术大会

         app.NinaBFont, instructionTextColor));

.Net Mirco Framework 2007技术大会

      panel.Children.Add(textflow);

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      // Add a blank line to the stack

.Net Mirco Framework 2007技术大会

      panel.Children.Add(textflow = new TextFlow());

.Net Mirco Framework 2007技术大会

      textflow.TextRuns.Add(" ", app.NinaBFont, instructionTextColor);

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      // The next child contains a listbox with options

.Net Mirco Framework 2007技术大会

      m_listbox = new ListBox();

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      // Prepare the listbox

.Net Mirco Framework 2007技术大会

      Buttons.Focus(m_listbox);

.Net Mirco Framework 2007技术大会

      panel.Children.Add(m_listbox);

.Net Mirco Framework 2007技术大会

      this.Background = m_listbox.Background = new SolidColorBrush(backgroundColor);

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      m_listbox.SelectionChanged += delegate(Object sender, SelectionChangedEventArgs e) ...{

.Net Mirco Framework 2007技术大会

         Int32 previousSelectedIndex = e.PreviousSelectedIndex;

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

         if (previousSelectedIndex != -1) ...{  // If there was a previous index

.Net Mirco Framework 2007技术大会

            // Change previously-selected listbox item color to unselected color

.Net Mirco Framework 2007技术大会

            ((Text)m_listbox.Items[previousSelectedIndex].Child).ForeColor = unselectedItemColor;

.Net Mirco Framework 2007技术大会

         }

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

         // Change newly-selected listbox item color to selected color

.Net Mirco Framework 2007技术大会

         ((Text)m_listbox.Items[e.SelectedIndex].Child).ForeColor = selectedItemColor;

.Net Mirco Framework 2007技术大会

      };

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      // Add the items to the listbox

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      foreach (String s in new String[] ...{ "Vertical Stack", "Horizontal Stack", "Canvas", "Diagonal" }) ...{

.Net Mirco Framework 2007技术大会

         Text text = new Text(m_app.NinaBFont, s + " Panel Demo");

.Net Mirco Framework 2007技术大会

         text.ForeColor = unselectedItemColor;

.Net Mirco Framework 2007技术大会

         text.TextAlignment = TextAlignment.Center;

.Net Mirco Framework 2007技术大会

         text.Width = this.Width;

.Net Mirco Framework 2007技术大会

         ListBoxItem lbi = new ListBoxItem();

.Net Mirco Framework 2007技术大会

         lbi.Background = m_listbox.Background;

.Net Mirco Framework 2007技术大会

         lbi.Child = text;

.Net Mirco Framework 2007技术大会

         m_listbox.Items.Add(lbi);

.Net Mirco Framework 2007技术大会

      }

.Net Mirco Framework 2007技术大会

      m_listbox.SelectedIndex = 0;

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      // Add a blank line in the stack

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      // The bottom child contains text with return instructions

.Net Mirco Framework 2007技术大会

      textflow = new TextFlow();

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

         new TextRun("(After viewing a Panel Demo, hit Enter to return to this screen)",

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      // If <Enter> button is pressed, go into the selected demo

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      if (e.Button == Button.Select) ...{

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

         switch (MainListBox.SelectedIndex) ...{

.Net Mirco Framework 2007技术大会

            case 0:  // Vertical Stack Panel Demo

.Net Mirco Framework 2007技术大会

               new StackPanelDemo(m_app, Orientation.Vertical);

.Net Mirco Framework 2007技术大会

               break;

.Net Mirco Framework 2007技术大会

            case 1:  // Horizontal Stack Panel Demo

.Net Mirco Framework 2007技术大会

               new StackPanelDemo(m_app, Orientation.Horizontal);

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

            case 2:  // Canvas Panel Demo

.Net Mirco Framework 2007技术大会

               new CanvasPanelDemo(m_app);

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

            case 3:  // Diagonal Panel Demo

.Net Mirco Framework 2007技术大会

               new DiagonalPanelDemo(m_app);

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      // Don't call base implementation (base.OnButtonDown) or we'll go back Home

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

   protected override void OnGotFocus(FocusChangedEventArgs e) ...{

.Net Mirco Framework 2007技术大会

      // Whenever this window gets focus, it gives it to its listbox

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      base.OnGotFocus(e);

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

internal sealed class StackPanelDemo : PresentationWindow ...{

.Net Mirco Framework 2007技术大会

   // This class shows how to build your own shape drawing in a DrawingContext

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

   private sealed class Cross : Shape ...{

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      public Cross() ...{ }

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      public override void OnRender(DrawingContext dc) ...{

.Net Mirco Framework 2007技术大会

         // Draw a line from top, left to bottom, right

.Net Mirco Framework 2007技术大会

         dc.DrawLine(base.Stroke, 0, 0, Width, Height);

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

         // Draw a line from top, right to bottom, left

.Net Mirco Framework 2007技术大会

         dc.DrawLine(base.Stroke, Width, 0, 0, Height);

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

   public StackPanelDemo(MyApp app, Orientation orientation)

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      StackPanel panel = new StackPanel(orientation);

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      panel.Visibility = Visibility.Visible;

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      Shape[] shapes = new Shape[] ...{

.Net Mirco Framework 2007技术大会

         new Ellipse(),

.Net Mirco Framework 2007技术大会

         new Line(),

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

         new Polygon(new Int32[] ...{ 0, 0,    50, 0,    50, 50,    0, 50 }), // A Square

.Net Mirco Framework 2007技术大会

         new Rectangle(),

.Net Mirco Framework 2007技术大会

         new Cross() // Our own custom shape

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      for (Int32 x = 0; x < shapes.Length; x++) ...{

.Net Mirco Framework 2007技术大会

         Shape s = shapes[x];

.Net Mirco Framework 2007技术大会

         s.Fill = new SolidColorBrush(ColorUtility.ColorFromRGB(0, 255, 0));

.Net Mirco Framework 2007技术大会

         s.Stroke = new Pen(Color.Black, 2);

.Net Mirco Framework 2007技术大会

         s.Visibility = Visibility.Visible;

.Net Mirco Framework 2007技术大会

         s.HorizontalAlignment = HorizontalAlignment.Center;

.Net Mirco Framework 2007技术大会

         s.VerticalAlignment = VerticalAlignment.Center;

.Net Mirco Framework 2007技术大会

         s.Height = Height - 1;

.Net Mirco Framework 2007技术大会

         s.Width = Width - 1;

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

         if (panel.Orientation == Orientation.Horizontal)

.Net Mirco Framework 2007技术大会

            s.Width /= shapes.Length;

.Net Mirco Framework 2007技术大会

         else

.Net Mirco Framework 2007技术大会

            s.Height /= shapes.Length;

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

         panel.Children.Add(s);

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

internal sealed class CanvasPanelDemo : PresentationWindow ...{

.Net Mirco Framework 2007技术大会

   public CanvasPanelDemo(MyApp app)

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      Canvas canvas = new Canvas();

.Net Mirco Framework 2007技术大会

      this.Child = canvas;

.Net Mirco Framework 2007技术大会

      this.Background = new SolidColorBrush(ColorUtility.ColorFromRGB(0, 255, 255));

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      for (Int32 x = 0; x < Width; x += Width / 4) ...{

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

         for (Int32 y = 0; y < Height; y += Height / 4) ...{

.Net Mirco Framework 2007技术大会

            Text text = new Text(m_app.SmallFont, " (" + x + "," + y + ")");

.Net Mirco Framework 2007技术大会

            Canvas.SetLeft(text, x);

.Net Mirco Framework 2007技术大会

            Canvas.SetTop(text, y);

.Net Mirco Framework 2007技术大会

            canvas.Children.Add(text);

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

internal sealed class DiagonalPanelDemo : PresentationWindow ...{

.Net Mirco Framework 2007技术大会

   public DiagonalPanelDemo(MyApp app)

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      DiagonalPanel panel = new DiagonalPanel();

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      this.Background = new LinearGradientBrush(

.Net Mirco Framework 2007技术大会

         ColorUtility.ColorFromRGB(192, 0, 0), ColorUtility.ColorFromRGB(32, 0, 0), 0, 0, Width, Height);

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      for (Int32 x = 0; x < 4; x++) ...{

.Net Mirco Framework 2007技术大会

         Bitmap b = new Bitmap(Width / 4, Height / 4);

.Net Mirco Framework 2007技术大会

         b.StretchImage(0, 0, app.Snowflake, b.Width, b.Height, (UInt16)((x + 1) * 50));

.Net Mirco Framework 2007技术大会

         Image image = new Image(b);

.Net Mirco Framework 2007技术大会

         panel.Children.Add(image);

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

   // This class shows how to build your own Panel

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

   private sealed class DiagonalPanel : Panel ...{

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      public DiagonalPanel() ...{

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      protected override void MeasureOverride(int availableWidth, int availableHeight, out int desiredWidth, out int desiredHeight) ...{

.Net Mirco Framework 2007技术大会

         // Called to calculate the width/height desired

.Net Mirco Framework 2007技术大会

         desiredWidth = 0;

.Net Mirco Framework 2007技术大会

         desiredHeight = 0;

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

         foreach (UIElement child in Children) ...{

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

            if (child.Visibility != Visibility.Collapsed) ...{

.Net Mirco Framework 2007技术大会

               child.Measure(Int32.MaxValue, Int32.MaxValue);

.Net Mirco Framework 2007技术大会

               Int32 childWidth, childHeight;

.Net Mirco Framework 2007技术大会

               child.GetDesiredSize(out childWidth, out childHeight);

.Net Mirco Framework 2007技术大会

               desiredWidth += childWidth;

.Net Mirco Framework 2007技术大会

               desiredHeight += childHeight;

.Net Mirco Framework 2007技术大会

            }

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

      protected override void ArrangeOverride(int arrangeWidth, int arrangeHeight) ...{

.Net Mirco Framework 2007技术大会

         Int32 x = 0, y = 0;

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

               child.Arrange(x, y, childWidth, childHeight);

.Net Mirco Framework 2007技术大会

               x += childWidth;

.Net Mirco Framework 2007技术大会

               y += childHeight;

.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会
.Net Mirco Framework 2007技术大会

后记:此外在会上还遇到了我的偶像马宁、马琪、张欣(还是张欣强,通过回答问题获得一个MF开放套件),如果他们不介意附上照片作个留念:-)