【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

四角と文字

n7shi2009-06-11


昨日までWPFでやっていたことをSilverlightに移植しました。⇒ 動作確認とソース

WPF版との違いは以下の通りです。

  1. 対話環境 ⇒ プログラム
  2. Window ⇒ Page
  3. MouseDown/MouseUp ⇒ MouseLeftButtonDown/MouseLeftButtonUp

プロジェクトの作成方法は以下の通りです。

  1. VWDでC#Silverlightプロジェクトを作成
  2. Page.xamlを削除
  3. Page.csを追加

Page.csは以下の通りです。(usingとnamespaceは省略)

public class Page : UserControl
{
    public Page()
    {
        var canvas = new Canvas();
        Content = canvas;

        var r = new Rectangle { Width = 40.0, Height = 40.0 };
        Canvas.SetLeft(r, 20.0);
        Canvas.SetTop(r, 60.0);
        r.Stroke = new SolidColorBrush(Colors.Black);
        r.Fill = new SolidColorBrush(Colors.Orange);
        canvas.Children.Add(r);

        var tb = new TextBlock { Text = "Silverlight", FontSize = 24.0 };
        canvas.Children.Add(tb);

        Action<UIElement, double, double> move = (el, x, y) =>
        {
            Canvas.SetLeft(el, x);
            Canvas.SetTop(el, y);
        };
        move(tb, 20.0, 30.0);

        UIElement elem = null;
        var click = new Point();
        var orig = new Point();
        Action<UIElement, MouseButtonEventArgs> down = (el, e) =>
        {
            elem = el;
            orig = new Point(Canvas.GetLeft(el), Canvas.GetTop(el));
            click = e.GetPosition(canvas);
            canvas.CaptureMouse();
        };
        r.MouseLeftButtonDown += (sender, e) => down(r, e);
        tb.MouseLeftButtonDown += (sender, e) => down(tb, e);
        canvas.MouseMove += (sender, e) =>
        {
            if (elem != null)
            {
                var p = e.GetPosition(canvas);
                move(elem, orig.X + p.X - click.X, orig.Y + p.Y - click.Y);
            }
        };
        canvas.MouseLeftButtonUp += (sender, e) =>
        {
            elem = null;
            canvas.ReleaseMouseCapture();
        };
    }
}

プログラム自体に大した意味はありませんが、F#やIronPythonと文法を比較する例にはなるかもしれません。