トップ回答者
Thumbを使ってオブジェクトを動かす ※コードビハインドでの書きっぷり

質問
-
Thumbを使ってオブジェクトを動かすプログラムを作りたいです。
XAMLではどうにか出来ましたが、C#からの書きっぷりが分かりません(T0T)C#での書きっぷりを教えていただけますでしょうか?
以下がXAMLです↓
<Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300"> <Canvas> <Thumb DragDelta="DragDelta" Canvas.Left="12" Canvas.Top="12" Height="250" Width="250"> <Thumb.Template> <ControlTemplate> <!--ドラッグ対象のオブジェクトを定義する--> <TextBlock Text="これはTextBlockです。" Width="150" Height="20" Background="Aqua" /> </ControlTemplate> </Thumb.Template> </Thumb> </Canvas> </Window>
回答
-
> C#での書きっぷりを教えていただけますでしょうか?
VBですみませんが、以下のようになると思います。動作は確認してます。クラスの使い方は全く同じなので、比較的簡単に移植できると思います。
#参考にしたのは C# のコードですが、たまたま VB のプロジェクト起動中だったので (汗
Imports System.Windows.Controls.Primitives Imports System.Windows.Controls Imports System.Windows.Media Class MainWindow Public Sub New() InitializeComponent() Dim canvas = New Canvas() Me.Content = canvas Dim element = New FrameworkElementFactory(GetType(TextBlock)) element.SetValue(TextBlock.TextProperty, "これはTextBlockです。") element.SetValue(TextBlock.WidthProperty, 150.0) element.SetValue(TextBlock.HeightProperty, 20.0) element.SetValue(TextBlock.BackgroundProperty, New SolidColorBrush(Colors.Aqua))
Dim template = New ControlTemplate(GetType(Thumb)) With {.VisualTree = element}
Dim thumb = New Thumb() With {.Template = template} AddHandler thumb.DragDelta, Sub(obj, args) Dim th = CType(obj, Thumb) canvas.SetLeft(th, canvas.GetLeft(thumb) + args.HorizontalChange) canvas.SetTop(th, canvas.GetTop(thumb) + args.VerticalChange) End Sub canvas.SetLeft(thumb, 12) canvas.SetTop(thumb, 12) canvas.Children.Add(thumb) End Sub End Class
ひらぽん http://d.hatena.ne.jp/hilapon/
- 編集済み ひらぽんModerator 2012年8月15日 2:44
- 回答としてマーク sumi_sumi 2012年8月15日 4:52
すべての返信
-
ご質問の意味がはっきりわからないのですが、DragDeltaイベントハンドラをどう書いてよいのかわからないということでしょうか? であれば、以下が参考になると思います。
ドラッグで移動する:Thumbコントロールを使う方法
http://d.hatena.ne.jp/CoMo/20110316/1300288737★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
-
> C#での書きっぷりを教えていただけますでしょうか?
VBですみませんが、以下のようになると思います。動作は確認してます。クラスの使い方は全く同じなので、比較的簡単に移植できると思います。
#参考にしたのは C# のコードですが、たまたま VB のプロジェクト起動中だったので (汗
Imports System.Windows.Controls.Primitives Imports System.Windows.Controls Imports System.Windows.Media Class MainWindow Public Sub New() InitializeComponent() Dim canvas = New Canvas() Me.Content = canvas Dim element = New FrameworkElementFactory(GetType(TextBlock)) element.SetValue(TextBlock.TextProperty, "これはTextBlockです。") element.SetValue(TextBlock.WidthProperty, 150.0) element.SetValue(TextBlock.HeightProperty, 20.0) element.SetValue(TextBlock.BackgroundProperty, New SolidColorBrush(Colors.Aqua))
Dim template = New ControlTemplate(GetType(Thumb)) With {.VisualTree = element}
Dim thumb = New Thumb() With {.Template = template} AddHandler thumb.DragDelta, Sub(obj, args) Dim th = CType(obj, Thumb) canvas.SetLeft(th, canvas.GetLeft(thumb) + args.HorizontalChange) canvas.SetTop(th, canvas.GetTop(thumb) + args.VerticalChange) End Sub canvas.SetLeft(thumb, 12) canvas.SetTop(thumb, 12) canvas.Children.Add(thumb) End Sub End Class
ひらぽん http://d.hatena.ne.jp/hilapon/
- 編集済み ひらぽんModerator 2012年8月15日 2:44
- 回答としてマーク sumi_sumi 2012年8月15日 4:52
-
ひらぽんさま
c#で試してみました。
画面上にTextBlockは表示されましたがドラッグで動きませんでした。
どこで移植ミスしているか分かりません・・・・。
public Window1() { InitializeComponent(); Canvas canvas = new Canvas(); this.Content = canvas; FrameworkElementFactory element = new FrameworkElementFactory(typeof(TextBlock)); element.SetValue(TextBlock.TextProperty, "これはTextBlockです。"); element.SetValue(TextBlock.WidthProperty, 150.0); element.SetValue(TextBlock.HeightProperty, 20.0); element.SetValue(TextBlock.BackgroundProperty, new SolidColorBrush(Colors.Aqua)); ControlTemplate template = new ControlTemplate(typeof(Thumb)); template.VisualTree = element; Thumb thumb = new Thumb(); thumb.Template = template; thumb.DragDelta += new DragDeltaEventHandler(myDragDelta); canvas.Children.Add(thumb); } //Thumbコントロールのドラッグイベント処理 private void myDragDelta(object sender, DragDeltaEventArgs e) { var thumb = sender as Thumb; if (thumb == null) return; //ドラッグ量に応じてThumbコントロールを移動する Canvas.SetLeft(thumb, Canvas.GetLeft(thumb) + e.HorizontalChange); Canvas.SetTop(thumb, Canvas.GetTop(thumb) + e.VerticalChange); }
-
Thumb に Top と Left が設定されてないからだと思います。
Canvas に追加する前に、Top と Left 追加したら動作しました。// C# はなぜか canvas.SetLeft が使えない。VB側で Option Strict On にしてるのだが・・・
thumb.SetValue(Canvas.TopProperty, 12.0);
thumb.SetValue(Canvas.LeftProperty, 12.0);
canvas.Children.Add(thumb);
ひらぽん http://d.hatena.ne.jp/hilapon/
- 編集済み ひらぽんModerator 2012年8月15日 5:02 コメントの修正
-
canvasじゃなくてCanvasだとどうですか?VBと違ってC#は大文字小文字を区別するので。
Thumb に Top と Left が設定されてないからだと思います。
Canvas に追加する前に、Top と Left 追加したら動作しました。// C# はなぜか canvas.SetLeft が使えない。VB側で Option Strict On にしてるのだが・・・
thumb.SetValue(Canvas.TopProperty, 12.0);
thumb.SetValue(Canvas.LeftProperty, 12.0);
canvas.Children.Add(thumb);
ひらぽん http://d.hatena.ne.jp/hilapon/
かずき Blog:http://d.hatena.ne.jp/okazuki/
-
> canvasじゃなくてCanvasだとどうですか?VBと違ってC#は大文字小文字を区別するので。
はうわっ! インスタンスメソッドじゃなく静的メソッドでしたかーっ!><
VB の場合、型と同名でキャメルの変数生成すると、その変数でインスタンスメソッドも静的メソッドも呼べてしまうようですねっ!><
#来年から for C# ではなく for VB にしてもらおう。自嘲・・・(^^;
ひらぽん http://d.hatena.ne.jp/hilapon/
- 編集済み ひらぽんModerator 2012年8月16日 2:21