Что мне нужно сделать, чтобы ссылаться на событие двойного щелчка для элемента управления списком?
Получить элемент doubleclick event listview
Ответ 1
Я использую что-то вроде этого только для двойного щелчка по элементу ListViewItem, а не при двойном щелчке по заголовку ListView.
private void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
DependencyObject obj = (DependencyObject)e.OriginalSource;
while (obj != null && obj != myListView)
{
if (obj.GetType() == typeof(ListViewItem))
{
// Do something here
MessageBox.Show("A ListViewItem was double clicked!");
break;
}
obj = VisualTreeHelper.GetParent(obj);
}
}
Ответ 2
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<EventSetter Event="MouseDoubleClick" Handler="listViewItem_MouseDoubleClick" />
</Style>
</ListView.ItemContainerStyle>
Единственная трудность заключается в том, если вы заинтересованы в базовом объекте, который отображает список, например,
private void listViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
ListViewItem item = sender as ListViewItem;
object obj = item.Content;
}
Ответ 3
private void positionsListView_DoubleClick(object sender, EventArgs e)
{
if (positionsListView.SelectedItems.Count == 1)
{
ListView.SelectedListViewItemCollection items = positionsListView.SelectedItems;
ListViewItem lvItem = items[0];
string what = lvItem.Text;
}
}
Ответ 4
Использовать метод ListView.HitTest
private void listView_MouseDoubleClick(object sender, MouseEventArgs e)
{
var senderList = (ListView) sender;
var clickedItem = senderList.HitTest(e.Location).Item;
if (clickedItem != null)
{
//do something
}
}
Или старый способ
private void listView_MouseDoubleClick(object sender, MouseEventArgs e)
{
var senderList = (ListView) sender;
if (senderList.SelectedItems.Count == 1 && IsInBound(e.Location, senderList.SelectedItems[0].Bounds))
{
//Do something
}
}
public bool IsInBound(Point location, Rectangle bound)
{
return (bound.Y <= location.Y &&
bound.Y + bound.Height >= location.Y &&
bound.X <= location.X &&
bound.X + bound.Width >= location.X);
}
Ответ 5
Мне тоже это нужно. Я обнаружил, что на msdn:http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.activation.aspx
Я думаю, этот делегат для этого.
Ответ 6
для меня, я делаю двойной щелчок ListView в этом разделе кода.
this.listView.Activation = ItemActivation.TwoClick;
this.listView.ItemActivate += ListView1_ItemActivate;
ItemActivate указывает, как пользователь активируется с элементами
Когда пользователь делает двойной щелчок, ListView1_ItemActivate будет триггером. Свойство ListView ItemActivate означает доступ к коллекции выбранных элементов.
private void ListView1_ItemActivate(Object sender, EventArgs e)
{
foreach (ListViewItem item in listView.SelectedItems)
//do something
}
он работает для меня.
Ответ 7
У меня пока нет достаточно большой оценки репутации, чтобы добавить комментарий, где это было бы очень полезно, но это касается тех, кто спрашивает о решении .Net 4.5.
Вы можете использовать координаты X и Y мыши и метод ListView GetItemAt, чтобы найти элемент, на который был нажат.
private void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
ListViewItem item = myListView.GetItemAt(e.X, e.Y)
// Do something here
}
Ответ 8
Я нашел это в Microsoft Dev Center. Он работает правильно и игнорирует двойной щелчок в неправильных местах. Как вы видите, дело в том, что элемент выбирается до запуска события двойного щелчка.
private void listView1_DoubleClick(object sender, EventArgs e)
{
// user clicked an item of listview control
if (listView1.SelectedItems.Count == 1)
{
//do what you need to do here
}
}
http://social.msdn.microsoft.com/forums/en-US/winforms/thread/588b1053-8a8f-44ab-8b44-2e42062fb663
Ответ 9
Вот как получить выбранный объект и код соответствия объекта для элемента с двойным щелчком в представлении WPF:
/// <summary>
/// Get the object from the selected listview item.
/// </summary>
/// <param name="LV"></param>
/// <param name="originalSource"></param>
/// <returns></returns>
private object GetListViewItemObject(ListView LV, object originalSource)
{
DependencyObject dep = (DependencyObject)originalSource;
while ((dep != null) && !(dep.GetType() == typeof(ListViewItem)))
{
dep = VisualTreeHelper.GetParent(dep);
}
if (dep == null)
return null;
object obj = (Object)LV.ItemContainerGenerator.ItemFromContainer(dep);
return obj;
}
private void lvFiles_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
object obj = GetListViewItemObject(lvFiles, e.OriginalSource);
if (obj.GetType() == typeof(MyObject))
{
MyObject MyObject = (MyObject)obj;
// Add the rest of your logic here.
}
}
Ответ 10
Сначала вы можете получить ListView, а затем получить Selected ListViewItem. У меня есть пример для ListBox, но ListView должен быть похож.
private void listBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
ListBox box = sender as ListBox;
if (box == null) {
return;
}
MyInfo info = box.SelectedItem as MyInfo;
if (info == null)
return;
/* your code here */
}
e.Handled = true;
}
Ответ 11
В событии DoubleClick ListBox получите элемент selecteditem (s) из списка, и вы там.
void ListBox1DoubleClick(object sender, EventArgs e)
{
MessageBox.Show(string.Format("SelectedItem:\n{0}",listBox1.SelectedItem.ToString()));
}
Ответ 12
Используйте событие MouseDoubleClick, а также все события MouseClick имеют число кликов в переменной eventargs 'e'. Итак, если e.ClickCount == 2, затем дважды щелкнуть.
Ответ 13
Это раздражает, но лучший способ сделать это - это что-то вроде:
<DataTemplate Name="MyCoolDataTemplate">
<Grid Loaded="HookLVIClicked" Tag="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}}">
<!-- your code here -->
</Grid>
</DataTemplate>
Затем в коде:
public void HookLVIClicked(object sender, RoutedEventArgs e) {
var fe = (FrameworkElement)sender;
var lvi = (ListViewItem)fe.Tag;
lvi.MouseDoubleClick += MyMouseDoubleClickHandler;
}
Ответ 14
Имеет аналогичную проблему со списком ListBox, который хочет открыть окно (Different View), с помощью SelectedItem как контекста (в моем случае, поэтому я могу его отредактировать).
Три параметра, которые я нашел: 1. Код позади 2. Использование привязанных действий 3. Использование Blend i: Interaction и EventToCommand с использованием MVVM-Light.
Я пошел с третьим вариантом, и он выглядит примерно так:
<ListBox x:Name="You_Need_This_Name"
ItemsSource="{Binding Your_Collection_Name_Here}"
SelectedItem="{Binding Your_Property_Name_Here, UpdateSourceTrigger=PropertyChanged}"
... rest of your needed stuff here ...
>
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
<Command:EventToCommand Command="{Binding Your_Command_Name_Here}"
CommandParameter="{Binding ElementName=You_Need_This_Name,Path=SelectedItem}" />
</i:EventTrigger>
</i:Interaction.Triggers>
Что об этом... когда вы дважды щелкните по нужному элементу, ваш метод в ViewModel будет вызываться с параметром SelectedItem как, и вы можете делать все, что хотите:
Ответ 15
Отправитель имеет тип ListView, а не ListViewItem.
private void listViewTriggers_MouseDoubleClick(object sender, MouseEventArgs e)
{
ListView triggerView = sender as ListView;
if (triggerView != null)
{
btnEditTrigger_Click(null, null);
}
}