ListView に ScrollViewer を付け下部に移動した時のインデックスが正しく取得できない
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 904
ListView に ScrollViewer タグをつけてスクロールバーを表示させています。スクロールバーを動かしていない時点でクリック(ドラッグアンドドロップの為)すると、正しく選択した位置を返してきます。
private void listView_MouseMove(object sender, MouseEventArgs e)内で取得できています。
ところが、スクロールバーを下げて下部のデータを表示した状態で下の方のデータ(スクロールバーを下げないと表示しない部分)を同じようにクリックするとスクロールバーが戻り(上にズレて先頭からの表示になる)その時点でのインデックスの取得になってしまいます。
スクロールバーを下げた下部データの位置でなくスクロールバーが戻った(初期位置)状態のインデックスになってしまう。
正しいクリックした位置の情報を取得する方法を知りたい。
以下にコードです。長文で申し訳ありません。VS2015 C# WPF
<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ページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
ListView
のHeight
を設定する。
もしくは、
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel HorizontalAlignment="Center" Orientation="Vertical" />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
をコメントアウトする。
と上に戻らなくなりました(理由はよくわかりませんでした)
というかこれだと表示がおかしいですよね?(ヘッダーと位置が合わないし、カラムの幅を変えるときの動作も変)
ListView
自体にスクロール機能がありますが、ScrollViewer
でスクロールさせる事情がありますか?(全体のxamlがわからないと何とも言えませんが
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.33%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2020/03/17 09:31
ListView には、その機能があったんですね。
気づきませんでした。下記でうまくいきました。ありがとうございます。
<ListView ・・・ Height="485" Width="340"
ScrollViewer.VerticalScrollBarVisibility="Visible">