天天看點

.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開放套件),如果他們不介意附上照片作個留念:-)