質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

2回答

8702閲覧

WPFでボタンをWindow内で移動したいです。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

1クリップ

投稿2015/12/03 00:23

いつもお世話になります。
WPFでボタンをWindow内で移動したいです。

xaml
<Window x:Class="swipe.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="700" Width="525">

<Canvas Name="canvas"> <Image Name ="image" Source="C:\01.jpg" Stretch="None" MouseLeftButtonDown="object_MouseLeftButtonDown" MouseLeftButtonUp="object_MouseLeftButtonUp" MouseMove="object_MouseMove"

/>
<Button Height ="100" MouseLeftButtonDown="object_MouseLeftButtonDown" MouseLeftButtonUp="object_MouseLeftButtonUp" MouseMove="object_MouseMove" Click="button_Click" >button</Button>
</Canvas>
</Window>

C#
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Input;
using System.Windows.Media;

namespace swipe {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
private bool isDrag = false;
private Point dragOffset;
private Point startpoint;
private Point releasepoint;

/// <summary>
/// ドラッグ開始
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
UIElement element = sender as UIElement;
if (element != null) {
isDrag = true;
dragOffset = e.GetPosition(element);
startpoint = e.GetPosition(canvas);
element.CaptureMouse();
}
}

/// <summary>
/// ドラッグ終了
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void image_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) {
if (isDrag) {
UIElement element = sender as UIElement;
element.ReleaseMouseCapture();
releasepoint = e.GetPosition(canvas);

isDrag = false;

}
}

/// <summary>
/// ドラック中
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void image_MouseMove(object sender, MouseEventArgs e) {
if (isDrag) {
Point point = Mouse.GetPosition(canvas);
UIElement element = sender as UIElement;
Canvas.SetLeft(element, point.X - dragOffset.X);
Canvas.SetTop(element, point.Y - dragOffset.Y);
}
}

private void Button_Click(object sender, EventArgs e) {
MessageBox.Show("click");
//ここでキャンセルすればいい?
}
}
}

という場合、imageは移動できるのですが、buttonはButtonDownイベントが発生せず、Clickになって移動できずにいます。
Buttonを移動するには、どのようにしたらよいか、ご示唆ください。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

昔、やったことあります。

PreviewMouseLeftButtonDown、PreviewMouseMove、PreviewMouseLeftButtonUpイベントを使ってみてください。PreviewMouseLeftButtonDownのイベントハンドラ内で、e.Handled = true にすれば、Clickイベントは発生しないかと思います。

以上です。

投稿2015/12/03 00:41

daichan

総合スコア225

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/12/03 00:55

できました。 ありがとうございます。
guest

0

こんにちは。

以下に記載されていますが、明示的にイベントを通してやる必要があります。
https://msdn.microsoft.com/ja-jp/library/system.windows.uielement.mouseleftbuttondown(v=vs.110).aspx

C#

1private void Button_PreviewMouseDown(object sender, MouseButtonEventArgs e) 2{ 3 btnHoge.AddHandler(UIElement.MouseLeftButtonDownEvent, new RoutedEventHandler(Button_MouseLeftButtonDown), true); 4 btnHoge.AddHandler(UIElement.MouseMoveEvent, new RoutedEventHandler(Button_MouseMove), true); 5 btnHoge.AddHandler(UIElement.MouseLeftButtonUpEvent, new RoutedEventHandler(Button_MouseLeftButtonUp), true); 6} 7 8private void Button_MouseLeftButtonDown(object sender, RoutedEventArgs e) 9{ 10 //hoge 11} 12 13private void Button_MouseMove(object sender, RoutedEventArgs e) 14{ 15 //hoge 16} 17 18private void Button_MouseLeftButtonUp(object sender, RoutedEventArgs e) 19{ 20 //hoge 21}

投稿2015/12/03 00:40

Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/12/03 01:07

こんにちは。ありがとうございます。Previewを使うのですね。 勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問