Windows phone 7 如何在列表框中实现保持?

Windows phone 7 如何在列表框中实现保持?,windows-phone-7,listbox,selectedindex,tapandhold,Windows Phone 7,Listbox,Selectedindex,Tapandhold,如果按住列表框,我想获取列表框索引 这是我的代码: <ListBox Margin="0,0,-12,0" Hold="holdlistbox" x:Name="listbox" SelectionChanged="listbox_SelectionChanged" SelectedIndex="-1"> </ListBox> private void holdlistbox(objec

如果按住列表框,我想获取列表框索引

这是我的代码:

<ListBox Margin="0,0,-12,0" 
         Hold="holdlistbox" 
         x:Name="listbox" 
         SelectionChanged="listbox_SelectionChanged" 
         SelectedIndex="-1">
</ListBox>



private void holdlistbox(object sender, System.Windows.Input.GestureEventArgs e)
{
    //How to get ListBox index here
}  

private void holdlistbox(对象发送方,System.Windows.Input.GestureEventArgs e)
{
//如何在此处获取列表框索引
}  

如果有人知道,请帮助我执行此操作。

var selectedIndex=(发件人为列表框)。selectedIndex

e.OriginalSource将为您获取所持有的实际控件(位于您手指正下方的最上面的控件)。根据您的ItemTemplate和保存位置,这可能是项目中的任何控件。然后,您可以检查此控件的DataContext以获取绑定到该项的对象(根据您的注释,这将是一个ItemViewModel对象):

然后,您可以在items集合中获取此项的索引:

int index = _items.IndexOf(item);
如果希望获取ListBoxItem本身,则需要使用VisualHelper类来搜索父继承权。下面是我用来执行此操作的扩展方法:

public static T FindVisualParent<T>(this DependencyObject obj) where T : DependencyObject
{
    DependencyObject parent = VisualTreeHelper.GetParent(obj);
    while (parent != null)
    {
        T t = parent as T;
        if (t != null)
        {
            return t;
        }
        parent = VisualTreeHelper.GetParent(parent);
    }
    return null;
}
公共静态T FindVisualParent(此DependencyObject对象),其中T:DependencyObject
{
DependencyObject parent=VisualTreeHelper.GetParent(obj);
while(父级!=null)
{
T=作为T的父代;
如果(t!=null)
{
返回t;
}
父级=VisualTreeHelper.GetParent(父级);
}
返回null;
}
我不确定您是否需要此功能(我无法从您的评论中确定),但您可以执行以下操作以获得上下文菜单:

FrameworkElement element = (FrameworkElement)e.OriginalSource;
ListBoxItem listItem = element.FindVisualParent<ListBoxItem>();
ContextMenu contextMenu = ContextMenuService.GetContextMenu(listItem);
FrameworkElement=(FrameworkElement)e.OriginalSource;
ListBoxItem listItem=element.FindVisualParent();
ContextMenu ContextMenu=ContextMenuService.GetContextMenu(listItem);

这假设ContextMenu已附加到ListBoxItem,如果未附加,则需要在父继承权中搜索其他控件。

ListBoxHold 10或其他项目始终打印1。我的代码:var selectedIndex=(发送者作为列表框)。selectedIndex;Debug.WriteLine(“selectedIndex-----”+selectedIndex);当然可以。保留事件未选择项目。但你从未说过你为什么需要它;-)您实际需要Hold事件做什么?列表框总共包含10项。如果我保留第8项,我想打印8。但是,这里总是打印1。我想要列表的索引。现在为什么要继续使用
hold
事件呢?您肯定只是想使用
SelectionChanged
事件,而不是
Hold
事件?否则,我强烈建议您使用添加上下文菜单和打印选项!是的,我改变了上下文菜单,这里也是同样的问题。如果我选择第8项,我想打印8。但是,这里总是打印1。我想要列表的索引。什么是MyType?我正在将MyType替换为List,但出现空指针引用错误。。。告诉我上下文菜单选择列表索引的想法。更新了我的答案。如果你需要进一步的帮助,请告诉我。有点疯狂。为什么不简单地使用命令绑定,并将CommandParameter设置为DataTemplate中的当前项绑定?很明显,他不关心UI元素,只是想要数据绑定项。我并不认为这很清楚,因为他提到了ContextMenu。如果他不需要实际的UI元素,那么只需要3行。我唯一一次使用可视化树代码是如果我需要制作复杂的动画(这在xaml中很快就会成为一场噩梦)
FrameworkElement element = (FrameworkElement)e.OriginalSource;
ListBoxItem listItem = element.FindVisualParent<ListBoxItem>();
ContextMenu contextMenu = ContextMenuService.GetContextMenu(listItem);