C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: ListViewのアイテムから座標を取得する方法について


(過去ログ 136 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■79718 / inTopicNo.1)  ListViewのアイテムから座標を取得する方法について
  
□投稿者/ 山丸 (15回)-(2016/05/09(Mon) 11:48:31)

分類:[C#] 

WPFでアプリを開発しております。

ListView.GetItemAt メソッド (Int32, Int32)を用いて指定した座標にあるアイテムを
取得できますが、これとは逆にアイテムから座標を取得することは可能でしょうか。
メソッドには見つかりませんでした。
ご存知のかた、ご教示よろしくお願いいたします。
引用返信 編集キー/
■79719 / inTopicNo.2)  Re[1]: ListViewのアイテムから座標を取得する方法について
□投稿者/ とっちゃん (352回)-(2016/05/09(Mon) 12:08:19)
No79718 (山丸 さん) に返信
> WPFでアプリを開発しております。
>
> ListView.GetItemAt メソッド (Int32, Int32)を用いて指定した座標にあるアイテムを
> 取得できますが、これとは逆にアイテムから座標を取得することは可能でしょうか。
> メソッドには見つかりませんでした。
> ご存知のかた、ご教示よろしくお願いいたします。

WPFのListViewのGetItemAtというと、ItemCollection.GetItemAt だと思いますが、こちらは、index を受け取るだけで
マウス座標を受け取ってというものはないと思いますが?

座標を受け取れるのは、System.Windows.Forms の ListView.GetItemAt() ではありませんか?
こちらの場合は、GetItemRectで特定のアイテムの矩形が取得できます。


引用返信 編集キー/
■79720 / inTopicNo.3)  Re[2]: ListViewのアイテムから座標を取得する方法について
□投稿者/ 山丸 (17回)-(2016/05/09(Mon) 12:39:33)
No79719 (とっちゃん さん) に返信

大変失礼いたしました。
そうですね。 System.Windows.Forms のリファレンスを参照していたようです。
申し訳ありません。

WPFでも、
Point pt = control.PointToScreen(new Point(0.0d, 0.0d));で
listview自体の座標の取得はできそうなのですが、各アイテムのマウス座標の
取得はできないのでしょうね。
引用返信 編集キー/
■79723 / inTopicNo.4)  Re[1]: ListViewのアイテムから座標を取得する方法について
□投稿者/ ぶなっぷ (80回)-(2016/05/09(Mon) 14:27:01)
ListView.GetItemRect()かな?
引用返信 編集キー/
■79724 / inTopicNo.5)  Re[3]: ListViewのアイテムから座標を取得する方法について
□投稿者/ とっちゃん (353回)-(2016/05/09(Mon) 18:41:19)
No79720 (山丸 さん) に返信
> WPFでも、
> Point pt = control.PointToScreen(new Point(0.0d, 0.0d));で
> listview自体の座標の取得はできそうなのですが、各アイテムのマウス座標の
> 取得はできないのでしょうね。

具体的にどうすればいいかなどはわかりませんが、VisualTreeからたどれると
昔どこかで見たので、それでたどることになると思います。


ところで、描画オブジェクト(Visual)の位置を取得できたとしてそれでどうするのでしょう?

キャッシュする場合は、位置が変わる処理を全部トラップしないとダメですし
WPFがやってることと同じことを自分でやるくらいなら、特定のアイテムがどこにいるかじゃなくて
アイテムにマウスが来たらとイベントを受け取るほうがいいと思いますが?

バインディングを使ってるのであれば、IsMouseOver 依存プロパティでマウスがUIElementの上にいるかどうかを動的に受け取ることができます。
イベントであれば、MouseEnter/MouseLeave をで使えば同じようなことができます。

引用返信 編集キー/
■79728 / inTopicNo.6)  Re[2]: ListViewのアイテムから座標を取得する方法について
□投稿者/ 山丸 (19回)-(2016/05/10(Tue) 09:38:30)
No79723 (ぶなっぷ さん) に返信
> ListView.GetItemRect()かな?

ぶなっぷさん、ありがとうございます。
WPFなので、System.Windows.Formsのメソッドは
使えないようです。
別の方法を検討します。
引用返信 編集キー/
■79729 / inTopicNo.7)  Re[4]: ListViewのアイテムから座標を取得する方法について
□投稿者/ 山丸 (20回)-(2016/05/10(Tue) 09:40:39)
No79724 (とっちゃん さん) に返信
> ■No79720 (山丸 さん) に返信
>>WPFでも、
>>Point pt = control.PointToScreen(new Point(0.0d, 0.0d));で
>>listview自体の座標の取得はできそうなのですが、各アイテムのマウス座標の
>>取得はできないのでしょうね。
>
> 具体的にどうすればいいかなどはわかりませんが、VisualTreeからたどれると
> 昔どこかで見たので、それでたどることになると思います。
>
>
> ところで、描画オブジェクト(Visual)の位置を取得できたとしてそれでどうするのでしょう?
>
> キャッシュする場合は、位置が変わる処理を全部トラップしないとダメですし
> WPFがやってることと同じことを自分でやるくらいなら、特定のアイテムがどこにいるかじゃなくて
> アイテムにマウスが来たらとイベントを受け取るほうがいいと思いますが?
>
> バインディングを使ってるのであれば、IsMouseOver 依存プロパティでマウスがUIElementの上にいるかどうかを動的に受け取ることができます。
> イベントであれば、MouseEnter/MouseLeave をで使えば同じようなことができます。
>

とっちゃんさん、ご教示ありがとうございます。
マウスイベントをハンドルして試してみます。

引用返信 編集キー/
■79732 / inTopicNo.8)  ListViewのアイテムから座標を取得する方法について
□投稿者/ ぶなっぷ (81回)-(2016/05/10(Tue) 18:07:33)
2016/05/10(Tue) 18:15:21 編集(投稿者)

失礼しました(^^;)

WPFの場合だと、以下のメソッドにて、ListViewからListViewItemを取得できます。
ListView.ItemContainerGenerator.ContainerFromIndex()

あとは、ListViewItemから座標を取得するだけです。

引用返信 編集キー/
■79885 / inTopicNo.9)  Re[4]: ListViewのアイテムから座標を取得する方法について
□投稿者/ 山丸 (23回)-(2016/05/26(Thu) 12:01:16)
No79732 (ぶなっぷ さん) に返信
> 2016/05/10(Tue) 18:15:21 編集(投稿者)
>
> 失礼しました(^^;)
>
> WPFの場合だと、以下のメソッドにて、ListViewからListViewItemを取得できます。
> ListView.ItemContainerGenerator.ContainerFromIndex()
>
> あとは、ListViewItemから座標を取得するだけです。
>

ぶなっぷさん、ご教示ありがとうございます。
すみません、よくわかっていないので、またまたお伺いします。

ContainerFromIndex()でDependencyObjectが返却されますが、
このなかに座標の情報が入っているのでしょうか??

引用返信 編集キー/
■79889 / inTopicNo.10)  Re[5]: ListViewのアイテムから座標を取得する方法について
□投稿者/ 山丸 (24回)-(2016/05/26(Thu) 17:37:03)
No79885 (山丸 さん) に返信
> ■No79732 (ぶなっぷ さん) に返信
>>2016/05/10(Tue) 18:15:21 編集(投稿者)
>>
>>失礼しました(^^;)
>>
>>WPFの場合だと、以下のメソッドにて、ListViewからListViewItemを取得できます。
>>ListView.ItemContainerGenerator.ContainerFromIndex()
>>
>>あとは、ListViewItemから座標を取得するだけです。
>>
>
ぶなっぷさん、ご教示ありがとうございます。
すみません、よくわかっていないので、またまたお伺いします。

ContainerFromIndex()でListViewItemを取得したときに、
このなかに座標の情報が入っているのでしょうか??

引用返信 編集キー/
■79901 / inTopicNo.11)  Re[6]: ListViewのアイテムから座標を取得する方法について
□投稿者/ ぶなっぷ (87回)-(2016/05/27(Fri) 10:25:20)
ListView.ItemContainerGenerator.ContainerFromIndex()
で返ってくるのは、DependencyObjectですが、その実体は、ListViewItemになります。

なので、
  var listViewItem = ListView.ItemContainerGenerator.ContainerFromIndex(Idx) as ListViewItem;
とすれば、listViewItemが取得できます。

listViewItemはListViewの1レコードを表す実際のコントロールになります。

listViewItemの座標系において、listViewItemの左上は当然(0, 0)なので、(0, 0)をスクリーン座標系に
変換すると、
  var listViewItemRect = listViewItem.PointToScreen(new Point(0, 0)));
listViewItemの左上座標になります。

listViewItemの幅/高さは、ActualWidth/ActualHeightなので、
求めた左上座標と、幅/高さを合わせれば、listViewItemの矩形が分かるわけです。

引用返信 編集キー/
■79903 / inTopicNo.12)  Re[7]: ListViewのアイテムから座標を取得する方法について
□投稿者/ 山丸 (25回)-(2016/05/27(Fri) 13:57:45)
No79901 (ぶなっぷ さん) に返信
> ListView.ItemContainerGenerator.ContainerFromIndex()
> で返ってくるのは、DependencyObjectですが、その実体は、ListViewItemになります。
>
> なので、
> var listViewItem = ListView.ItemContainerGenerator.ContainerFromIndex(Idx) as ListViewItem;
> とすれば、listViewItemが取得できます。
>
> listViewItemはListViewの1レコードを表す実際のコントロールになります。
>
> listViewItemの座標系において、listViewItemの左上は当然(0, 0)なので、(0, 0)をスクリーン座標系に
> 変換すると、
> var listViewItemRect = listViewItem.PointToScreen(new Point(0, 0)));
> listViewItemの左上座標になります。
>
> listViewItemの幅/高さは、ActualWidth/ActualHeightなので、
> 求めた左上座標と、幅/高さを合わせれば、listViewItemの矩形が分かるわけです。
>

ぶなっぷさん、ありがとうございます!!
おかげ様で、うまく取得できまして、解決いたしました。
丁寧なご説明でほんとに分かりやすかったです。
有難うございました。m(__)m

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -