昨日までWPFでやっていたことをSilverlightに移植しました。⇒ 動作確認とソース
WPF版との違いは以下の通りです。
- 対話環境 ⇒ プログラム
- Window ⇒ Page
- MouseDown/MouseUp ⇒ MouseLeftButtonDown/MouseLeftButtonUp
プロジェクトの作成方法は以下の通りです。
- VWDでC#のSilverlightプロジェクトを作成
- Page.xamlを削除
- 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と文法を比較する例にはなるかもしれません。