- PR -

WPFのユーザーコントロール

1
投稿者投稿内容
いろは
常連さん
会議室デビュー日: 2005/05/11
投稿数: 31
投稿日時: 2008-01-29 15:36
いつもお世話になっております。
現在WPFを用いたプロジェクトの検討を行っております。
(開発環境 XP Pro Sp2 + VS2005 + WPF Extension)

やりたいことはWPFで作成した画面上にユーザーコントロールを配置して、このコントロールの位置やサイズを変更したいのです。
(VisualStudioのフォームデザイン画面の様なイメージです)

現在、ユーザーコントロールを使用して検討しているのですが、マウスのキャプチャが上手くいかず行き詰っています。
(依存関係プロパティと言うのも良く理解できない。。。)

Expression Blendのデザイン画面でやりたいことが実現できているので、方法があるのだと思うのですが、まず考え方自体が間違えていないか、間違えていないならばどの様に進めば良いかのヒントだけでも頂けたらと思います。

以上、よろしくお願いします。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2008-01-29 15:43
引用:

やりたいことはWPFで作成した画面上にユーザーコントロールを配置して、このコントロールの位置やサイズを変更したいのです。
(VisualStudioのフォームデザイン画面の様なイメージです)


を実行時にやりたいって事でしょうか?それともデザイン時(開発時)にこれが上手くいかないって事でしょうか?

とりあえず前者だとして。

まずは「絶対配置」にする必要があると思うので、移動対象のコントロールのコンテナは「Canvas」にする必要があるでしょう(Grid でもできなくないでしょうけど)。

で、移動対象のユーザーコントロールでマウスキャプチャし「EventTrigger」などで位置をずらしてみてはいかがでしょう。

# 上記一切試していません。

_________________
囚人のジレンマな日々
いろは
常連さん
会議室デビュー日: 2005/05/11
投稿数: 31
投稿日時: 2008-01-29 18:28
囚人さん 回答ありがとうございます。

やりたかったことは、ご推察の通り実行時に移動やサイズ変更をしたかったのです。

教えていただいた様に、Canvasからの派生としたところ上手くキャプチャ出来ました。
一応、ソースを上げておきます。

コード:
public class MyShape : Canvas
{
    public MyShape() : base()
    {
        Background = Brushes.LightBlue;
        Width = 30;
        Height = 50;

        SetLeft(this, 0.0);
        SetTop(this, 0.0);
    }

    protected Point PreviousePoint;

    protected override void OnMouseDown(System.Windows.Input.MouseButtonEventArgs e)
    {
        if (e.LeftButton == System.Windows.Input.MouseButtonState.Pressed)
        {
            PreviousePoint = e.GetPosition(Parent as IInputElement);
            CaptureMouse();
            e.Handled = true;
        }
        else
        {
            base.OnMouseDown(e);
        }
    }

    protected override void OnMouseUp(System.Windows.Input.MouseButtonEventArgs e)
    {
        if (IsMouseCaptured)
        {
            ReleaseMouseCapture();
            e.Handled = true;
        }
        else
            base.OnMouseUp(e);
    }

    protected override void OnMouseMove(System.Windows.Input.MouseEventArgs e)
    {
        if (IsMouseCaptured)
        {
            Point pos = e.GetPosition(Parent as IInputElement);

            SetLeft(this, GetLeft(this) + pos.X - PreviousePoint.X);
            SetTop(this, GetTop(this) + pos.Y - PreviousePoint.Y);

            PreviousePoint = pos;
        }

        base.OnMouseMove(e);
    }
}



また引っかかったりした時には、よろしくお願いします。
ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)