C# Visual Tree Helper使listbox SelectionChanged fire两次

C# Visual Tree Helper使listbox SelectionChanged fire两次,c#,windows-phone-7,windows-phone-8,C#,Windows Phone 7,Windows Phone 8,可视化树代码 public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject { if (depObj != null) { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)

可视化树代码

public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
    {
        if (depObj != null)
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
            {
                DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
                if (child != null && child is T)
                {
                    yield return (T)child;
                }

                foreach (T childOfChild in FindVisualChildren<T>(child))
                {
                    yield return childOfChild;
                }
            }
        }
    }
 private void mylistBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {

        if (mylistBox.SelectedItem == null)
            return;
             foreach (Button tb in FindVisualChildren<Button>(mainListBox))
        {

           Debug.WriteLine(tb.Name);
        }

        }
公共静态IEnumerable FindVisualChildren(DependencyObject depObj),其中T:DependencyObject
{
if(depObj!=null)
{
for(int i=0;i
选择更改的代码

public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
    {
        if (depObj != null)
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
            {
                DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
                if (child != null && child is T)
                {
                    yield return (T)child;
                }

                foreach (T childOfChild in FindVisualChildren<T>(child))
                {
                    yield return childOfChild;
                }
            }
        }
    }
 private void mylistBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {

        if (mylistBox.SelectedItem == null)
            return;
             foreach (Button tb in FindVisualChildren<Button>(mainListBox))
        {

           Debug.WriteLine(tb.Name);
        }

        }
private void mylistBox\u SelectionChanged(对象发送者,SelectionChangedEventArgs e)
{
如果(mylistBox.SelectedItem==null)
返回;
foreach(FindVisualChildren(主列表框)中的按钮tb)
{
Debug.WriteLine(tb.Name);
}
}
输出 注意,它将两个按钮的名称写入两次,因此循环4次,并且只有两个按钮。 选择权 选项BTN2 选择权
选项BTN2运行时,
mainListBox
中有多少项?它必须是2,这就是为什么它会打印两次按钮名称(列表框中的每个项目打印两次)。
SelectionChanged
或VisualTreeHelper

没有问题,但我指定了selectedIndex。看起来你是对的,但是,为什么我不能只关注selectedIndex呢?请注意,运行时的xaml将与您看到的不同,特别是在列表控件的情况下,其中为列表中的每个项生成特定的元素。你到底想做什么?我有一个任务列表,我想做的就是删除那个索引并显示一条消息,但是消息不断弹出。因此,如果有5个项目,它会弹出5次。你不需要循环。您只需调用Remove()并传递所选项目。myListBox.Remove(myListBox.SelectedItem);然后显示你的信息好的Alaa Masoud我会试试你的推荐谢谢你的帮助。