none
Thumbを使ってオブジェクトを動かす ※コードビハインドでの書きっぷり RRS feed

  • 質問

  • 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>
    


    2012年8月15日 1:44

回答

  • > 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/



    2012年8月15日 2:38
    モデレータ

すべての返信

  • ご質問の意味がはっきりわからないのですが、DragDeltaイベントハンドラをどう書いてよいのかわからないということでしょうか? であれば、以下が参考になると思います。

    ドラッグで移動する:Thumbコントロールを使う方法
    http://d.hatena.ne.jp/CoMo/20110316/1300288737


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2012年8月15日 2:17
    モデレータ
  • trapemiya さま

    いつも有難う御座います。

    説明が悪くて申し訳ありません。

    記載した部分(XAML)をC#へ置き換えたいのです。

    DragDeltaイベントハンドラは、実装しております。

    実は教えていただいたページを参考に作りました(^o^;)

    2012年8月15日 2:25
  • > 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/



    2012年8月15日 2:38
    モデレータ
  • ひらぽんさま

    有難う御座います。

    早速実装してみます。

    またご連絡いたします。

    宜しくお願いします。

    2012年8月15日 3:07
  • ひらぽんさま

    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); }


    2012年8月15日 4:12
  • 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/



    2012年8月15日 4:46
    モデレータ
  • ひらぽんさま

    早速のお返事有難う御座います。

    おかげ様で実現出来ました。

    何もかも手取り足取りでお恥ずかしい限りです。

    すいません、本当に助かりました。有難う御座いました。

    2012年8月15日 4:52
  • 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/

    2012年8月15日 14:08
  • > canvasじゃなくてCanvasだとどうですか?VBと違ってC#は大文字小文字を区別するので。

    はうわっ! インスタンスメソッドじゃなく静的メソッドでしたかーっ!><

    VB の場合、型と同名でキャメルの変数生成すると、その変数でインスタンスメソッドも静的メソッドも呼べてしまうようですねっ!><

    #来年から for C# ではなく for VB にしてもらおう。自嘲・・・(^^;


    ひらぽん http://d.hatena.ne.jp/hilapon/


    2012年8月16日 2:21
    モデレータ