【发布时间】:2009-05-30 06:33:07
【问题描述】:
为了引用列表视图控件的双击事件,我需要做什么?
【问题讨论】:
-
可能你想绑定到项目的双击事件?
标签: c# .net wpf wpf-controls
为了引用列表视图控件的双击事件,我需要做什么?
【问题讨论】:
标签: c# .net wpf wpf-controls
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<EventSetter Event="MouseDoubleClick" Handler="listViewItem_MouseDoubleClick" />
</Style>
</ListView.ItemContainerStyle>
唯一的困难是如果您对 listviewitem 映射到的底层对象感兴趣,例如
private void listViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
ListViewItem item = sender as ListViewItem;
object obj = item.Content;
}
【讨论】:
我使用这样的东西只触发 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);
}
}
【讨论】:
使用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);
}
【讨论】:
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;
}
}
【讨论】:
ListViewItem lvItem = positionsListView.SelectedItems[0]; 更整洁
我也需要那个。我在 msdn 上找到了:
http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.activation.aspx
我认为这个代表就是为了这个。
【讨论】:
我还没有足够大的声誉分数来添加评论最有帮助,但这与那些询问 .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
}
【讨论】:
对我来说,我在此代码部分中双击 ListView。
this.listView.Activation = ItemActivation.TwoClick;
this.listView.ItemActivate += ListView1_ItemActivate;
ItemActivate specify how user activate with items
当用户双击时,ListView1_ItemActivate 将被触发。 ListView ItemActivate 的属性是指访问被选中项的集合。
private void ListView1_ItemActivate(Object sender, EventArgs e)
{
foreach (ListViewItem item in listView.SelectedItems)
//do something
}
它对我有用。
【讨论】:
我在 Microsoft 开发中心找到了这个。它可以正常工作并忽略在错误位置双击。如您所见,关键是在触发双击事件之前选择了一个项目。
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
【讨论】:
以下是如何在 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.
}
}
【讨论】:
可以先获取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;
}
【讨论】:
要么使用 MouseDoubleClick 事件,而且所有 MouseClick 事件在 eventargs 变量“e”中都有一个点击计数。所以如果e.ClickCount == 2,则双击。
【讨论】:
在 ListBox DoubleClick 事件中,获取列表框的 selecteditem(s) 成员,然后就可以了。
void ListBox1DoubleClick(object sender, EventArgs e)
{
MessageBox.Show(string.Format("SelectedItem:\n{0}",listBox1.SelectedItem.ToString()));
}
【讨论】:
这很烦人,但最好的方法是:
<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;
}
【讨论】:
ListBox 遇到了类似的问题,想要打开一个以 SelectedItem 作为上下文的窗口(不同视图)(在我的情况下,我可以对其进行编辑)。
我发现的三个选项是:1. 隐藏代码 2. 使用附加行为 3. 使用 Blend 的 i:Interaction 和 EventToCommand 和 MVVM-Light。
我选择了第 3 个选项,它看起来是这样的:
<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 作为参数,你可以在那里做任何你想做的事情:)
【讨论】:
发件人的类型是 ListView 而不是 ListViewItem。
private void listViewTriggers_MouseDoubleClick(object sender, MouseEventArgs e)
{
ListView triggerView = sender as ListView;
if (triggerView != null)
{
btnEditTrigger_Click(null, null);
}
}
【讨论】:
我看到这个主题在谷歌上很受欢迎,这是我的简单且有效的示例:)
XAML:
<ListView Name="MainTCList" HorizontalAlignment="Stretch" MinHeight="440" Height="Auto" Margin="10,10,5.115,4" VerticalAlignment="Stretch" MinWidth="500" Width="Auto" Grid.Column="0" MouseDoubleClick="MainTCList_MouseDoubleClick" IsSynchronizedWithCurrentItem="True">
<ListView.View>
<GridView>
<GridViewColumn Header="UserTID" DisplayMemberBinding="{Binding UserTID}" Width="80"/>
<GridViewColumn Header="Title" DisplayMemberBinding="{Binding Title}" Width="410" />
</GridView>
</ListView.View>
</ListView>
C#
private void MainTCList_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
TC item = (TC)MainTCList.Items.CurrentItem;
Wyswietlacz.Content = item.UserTID;
}
Wyswietlacz 是用于查看项目内容的测试标签 :) 我在最后一行中添加了一个方法来使用来自项目的数据加载页面。
【讨论】: