2013-03-22 119 views
1

我是WPF的新手。我开发了一个WPF UserControl应用程序,其中有一个列表框。为了获得垂直滚动条,列表框的高度限制为400。在这个列表框中,我有超过100个项目。现在对于这些项目中的每一个,我必须显示一些工具提示,我需要在当前鼠标指针下的列表框中的项目索引。所以,为此我添加了一个MouseOver事件,如MouseEnter。使用鼠标指针位置获取WPF列表框中的listboxitem的索引(system.windows.control.listbox)

这里是我的XAML代码

<ListBox Name="AllProjects" TabIndex="0" ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Visible" Height="400" MouseEnter="AllProjects_MouseEnter"> </ListBox> 

下面的代码段后端的C#代码

private void AllProjects_MouseEnter(object sender, MouseEventArgs e) 
    { 
     Point Position = e.GetPosition((IInputElement)sender); 
    } 

所以,我收到鼠标指针WRT我目前的列表框,但真正的问题的立场将此位置转换为列表框中项目的索引。因为我正在使用system.windows.control.listbox而不是System.Windows.Forms.listbox,我没有IndexFromPoint方法。由于我的列表框可以垂直滚动,如果我尝试开发一个逻辑来获取索引,它会变得混乱。我只是想知道在这种情况下是否有任何简单的方法来获取listboxitem索引。 AllProjects是我的列表框的名称。提前致谢。

+0

为什么你需要索引项?与显示工具提示有什么关系? – Ucodia 2013-03-22 10:46:32

+0

@Ucodia:实际上每个列表框项目都需要不同的工具提示,并且我有一个存储项目名称和相关工具提示的字典。为此,我需要一个索引。 – 2013-03-22 10:54:26

+0

好的。这个工具提示文本可以添加到列表中的项目的属性吗? – Ucodia 2013-03-22 11:08:55

回答

1

而不是使用MouseEnter事件,你应该钩住SelectionChanged事件。然后通过ListBox中的SelectedIndex属性获取物品的索引。

XAML:

<ListBox Name="AllProjects" SelectionChanged="AllProjects_SelectionChanged" /> 

C#:

private void AllProjects_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    int index = this.AllProjects.SelectedIndex; 
} 

但是,这是实现当前的目标相当 “快速和肮脏” 的方式。如果你真的想进入WPF,试着忘记你在其他UI框架(如Windows Forms)中使用的大部分技术,并开始学习WPF Databinding的强大功能和XAML data templating的美感。

+0

感谢Ucodia,这个工作现在。 – 2013-03-25 07:47:44

0

你会在这里找到你的问题的答案:https://stackoverflow.com/a/3368537/2132796
你不需要抓取列表框的选定索引属性。你只需要使用上面链接的项目模板。
我也建议遵循Ucodias建议并学习一些关于数据绑定的内容。

+0

感谢您的参考。 – 2013-03-25 07:48:06