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

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

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

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

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

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

Q&A

解決済

2回答

6545閲覧

【C#】【WPF】InkCanvasでMouseLeftButtonDownイベントを拾う方法が分かりません

galmacher

総合スコア37

C#

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

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

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

0グッド

0クリップ

投稿2018/10/11 13:56

編集2018/10/11 14:35

■実現したい事
・InkCanvasにてユーザが描いた内容をPointCollectionにて座標情報で保持したい。
・そのため、MouseLeftButtonDown、MouseMove、MouseLeftButtonUpにて座標情報を取得しつつ、
それぞれのタイミングで個別の処理を実装したい。

■困っていること
MouseMove、MouseLeftButtonUpが動くことは以下ソースで確認できましたが、
なぜかMouseLeftButtonDownが動きません。
※検索するとBackgroundプロパティを指定しないと動かないという情報を見つけましたが、
下記のソースのとおりBackground="Transparent" と指定しております。

XAML

1<Window x:Class="DragCanvasPaint.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:Ink="clr-namespace:System.Windows.Ink;assembly=PresentationCore" 5 Title="Hello, InkCanvas!" Height="472" Width="708" 6 > 7 <Grid> 8 <Viewbox Name="viewbox" Height="472" Width="708" Stretch="Uniform" > 9 <InkCanvas Name="canvas" HorizontalAlignment="Stretch" Height="472" Width="708" VerticalAlignment="Stretch" Background="Transparent" MouseLeftButtonDown="canvas_MouseLeftButtonDown" MouseLeftButtonUp="canvas_MouseLeftButtonUp" MouseMove="canvas_MouseMove"/> 10 </Viewbox> 11 </Grid> 12</Window>

C#

1namespace DragCanvasPaint 2{ 3 /// <summary> 4 /// MainWindow.xaml の相互作用ロジック 5 /// </summary> 6 public partial class MainWindow : Window 7 { 8 public MainWindow() 9 { 10 InitializeComponent(); 11 } 12 13 private void canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 14 { 15 Console.WriteLine("_MouseLeftButtonDown"); 16 } 17 18 private void canvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 19 { 20 Console.WriteLine("MouseLeftButtonUp"); 21 } 22 23 private void canvas_MouseMove(object sender, MouseEventArgs e) 24 { 25 Console.WriteLine("MouseMove"); 26 } 27 28 } 29}

InkCanvasではMouseLeftButtonDownに対応していないのでしょうか?
その場合、MouseLeftButtonDownに代わるクリックした直後に処理を行う方法はございますでしょうか?
また、今回はInkCanvasの利用について検討しておりますので、
「InkCanvasではなくCanvasを利用すればいい」というご回答は無しでお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

試してないのですが、 PreviewMouseLeftButtonDown なら捕捉できるかもしれません。

##追記
Preview*** について説明します。
以下のような構造を例にします。

xml

1<Window> 2 <Grid> 3 <Button>

ここで Button 上でマウスダウンした場合、以下の順番でイベントが発生します。

  1. Window の PreviewMouseDown
  2. Grid の PreviewMouseDown
  3. Button の PreviewMouseDown
  4. Button の MouseDown
  5. Grid の MouseDown
  6. Window の MouseDown

しかし IsHandled を true にするとイベントの伝播を止めることができます。

###その1

  1. Window の PreviewMouseDown
  2. Grid の PreviewMouseDown で e.IsHandled = true;
  3. Button の PreviewMouseDown
  4. Button の MouseDown
  5. Grid の MouseDown
  6. Window の MouseDown

###その2

  1. Window の PreviewMouseDown
  2. Grid の PreviewMouseDown
  3. Button の PreviewMouseDown
  4. Button の MouseDown
  5. Grid の MouseDown で e.IsHandled = true;
  6. Window の MouseDown

投稿2018/10/11 14:41

編集2018/10/15 09:17
gaya-K

総合スコア449

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

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

galmacher

2018/10/13 03:02

ありがとうございます。 仰るようにPreviewMouseLeftButtonDown にて補足することができました。 ググってもいまいちPreviewの有り/無しの使い分けというか意味合いがよくわかりませんでしたが…。
galmacher

2018/10/15 14:55

追記での分かりやすいご説明ありがとうございました! ご説明の内容だと、inkcanvasのPreviewMouseDownが動き、MouseDownが動かないということは、 内部的にはinkcanvasの中に実は子が隠れていて、 そいつがIsHandled = true;しているということになるのでしょうね。
gaya-K

2018/10/15 15:11

そのとおりです!
galmacher

2018/10/15 15:19

ありがとうございます!
guest

0

マウスダウンに関しては、gaya-Kさんが書かれている「PreviewMouseLeftButtonDown」が使えると思います。

座標をどういう用途で使われるのかが分からないのですが、
InkCanvas.Strokesプロパティを使用するのは駄目なのでしょうか?

投稿2018/10/12 02:02

lain

総合スコア161

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

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

galmacher

2018/10/13 03:08

ご回答ありがとうございます。 ユーザが描いた線の内側を塗りつぶしたいと思っていてその方法のひとつとして座標を使おうとしてました。 座標をPointCollectionに入れて、各座標を線で繋いで最後に始点と終点を繋いで閉じて中を塗りつぶす、みたいなイメージです。 ただ、おっしゃるようにStrokesプロパティでも出来そうなので調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問