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

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

新規登録して質問してみよう
ただいま回答率
86.12%
WPF

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

解決済

ListView に ScrollViewer を付け下部に移動した時のインデックスが正しく取得できない

byori
byori

総合スコア66

WPF

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

1回答

0リアクション

1クリップ

4368閲覧

投稿2020/03/16 02:45

ListView に ScrollViewer タグをつけてスクロールバーを表示させています。スクロールバーを動かしていない時点でクリック(ドラッグアンドドロップの為)すると、正しく選択した位置を返してきます。
private void listView_MouseMove(object sender, MouseEventArgs e)内で取得できています。

ところが、スクロールバーを下げて下部のデータを表示した状態で下の方のデータ(スクロールバーを下げないと表示しない部分)を同じようにクリックするとスクロールバーが戻り(上にズレて先頭からの表示になる)その時点でのインデックスの取得になってしまいます。

スクロールバーを下げた下部データの位置でなくスクロールバーが戻った(初期位置)状態のインデックスになってしまう。

正しいクリックした位置の情報を取得する方法を知りたい。

以下にコードです。長文で申し訳ありません。VS2015 C# WPF

Xaml

<ScrollViewer Height="485" Width="340"> <StackPanel> <ListView Margin = "0" Name="lvUsers" MouseMove="listView_MouseMove" BorderThickness="1" ItemsSource="{Binding}" > <ListView.Resources> <Style TargetType="{x:Type ListViewItem}"> <Style.Resources> <Style TargetType="{x:Type TextBlock}"> <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path='Text'}" /> <Style.Triggers> <DataTrigger Binding="{Binding ElementName=check3, Path=IsChecked}" Value="True"> <!-- <Setter Property="FontWeight" Value="Bold" /> --> <Setter Property="TextWrapping" Value="Wrap" /> </DataTrigger> </Style.Triggers> </Style> </Style.Resources> </Style> </ListView.Resources> <ListView.ItemsPanel> <ItemsPanelTemplate> <StackPanel Orientation="Vertical" HorizontalAlignment="Center" /> </ItemsPanelTemplate> </ListView.ItemsPanel> <ListView.View> <GridView> <GridViewColumn Header = "No" Width="30" DisplayMemberBinding="{Binding No}" /> <GridViewColumn Header = "Name" Width="80" DisplayMemberBinding="{Binding Name}" /> <GridViewColumn Header = "Data" Width="170" DisplayMemberBinding="{Binding Data}" /> </GridView> </ListView.View> </ListView> </StackPanel> </ScrollViewer>

ビハインドコード

private void listView_MouseMove(object sender, MouseEventArgs e) { ListView listView = sender as ListView; if (listView != null && e.LeftButton == MouseButtonState.Pressed) { //ドラッグするアイテムのインデックスを取得する int itemIndex = listView.SelectedIndex; if (itemIndex < 0) return; : : } } public class User { public string No { get; set; } public string Name { get; set; } public string Data { get; set; } public User(string _no, string _name,string _data) { No = _no; Name = _name; Data = _data; } public User() { } } // 下記のようなデータが CSV 形式で保存され comment に読み込まれています。 2,No SMT,Note : SMTの所見は認められません。, 3,f-u,Note : Follow up の上、難治性の時は再検して下さい。, 4,f-u 1 - 2,Note : Follow-up の上、1~2ヶ月後に再検して下さい。, 5,f-u 3 - 6,Note : Follow-up の上、3~6ヶ月後に再検して下さい。, 6,f-u 6 - 9,Note : Follow-up の上、6~9ヶ月後に再検して下さい。, 7,Ca なし f-u,Note : 悪性像は見られません。Follow upを!, : : // リストの初期化 List<User> items = new List<User>(); foreach (var txt in comment) { items.Add(new User() { No = txt.No, Name = txt.Name, Data = txt.Data }); } lvUsers.ItemsSource = items;

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

WPF

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