从中选择项目后如何隐藏列表框?

Posted

技术标签:

【中文标题】从中选择项目后如何隐藏列表框?【英文标题】:how to hide a list-box after selecting items from it? 【发布时间】:2013-06-28 19:57:57 【问题描述】:

我正在学习 c# 的基础知识。我正在使用 WPF。我想让列表框在从中选择项目后消失。我使用了 visibility=collapsed 但它在这里不起作用我的代码是:

<ListBox Foreground="White" Grid.Row="1" SelectionMode="Single" SelectionChanged="PrintText" Background="DarkGray" Visibility="Collapsed"  Height="Auto" HorizontalAlignment="Left" Margin="156,36,0,0" Name="listBox1" VerticalAlignment="Top" Width="191" UseLayoutRounding="True" />

private void textBox1_TextChanged(object sender, TextChangedEventArgs e)

    if(autolist.Count>0)
    
        listBox1.ItemsSource = autolist;
        listBox1.Visibility = Visibility.Visible;
        // a = pk;
    
    else
    
        listBox1.Visibility = Visibility.Collapsed;
        listBox1.ItemsSource = null;
    


private void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)

    //selectedItemsId = (int)listBox1.SelectedValue;
    if (listBox1.ItemsSource != null)
    
        listBox1.Visibility = Visibility.Collapsed;
        textBox1.TextChanged += new TextChangedEventHandler(textBox1_TextChanged);
    

    if (listBox1.SelectedIndex != -1)
    
        textBox1.Text = listBox1.SelectedItem.ToString();
        textBox1.TextChanged += new TextChangedEventHandler(textBox1_TextChanged);
    

【问题讨论】:

这是 asp.net 吗?还是WPF?这也与 C#5.0 无关 您的代码中还有许多可怕的东西。每当列表框上的选择发生变化时,为什么要在文本框上附加额外的侦听器? 同意@TimothyGroote。您不想在每次列表框中的选择更改时附加事件处理程序。您希望在文本框创建/添加到您的 from 时执行一次,而不是在可能多次触发的事件中。 @DuaAli 我们已经想通了 ;) @TimothyGroote 是的,OP 远远领先于我们。 【参考方案1】:

没有发生任何事情,因为您定义的事件处理程序的名称与您在 XAML 中调用的名称不同。

您的列表框尝试触发 PrintText,但我可以在您的代码中看到,您希望它改为触发 listBox1_SelectionChanged

像这样更改您的 XAML:

<ListBox Foreground="White" Grid.Row="1" SelectionMode="Single" SelectionChanged="listBox1_SelectionChanged" Background="DarkGray" Visibility="Collapsed"  Height="Auto" HorizontalAlignment="Left" Margin="156,36,0,0" Name="listBox1" VerticalAlignment="Top" Width="191" UseLayoutRounding="True" />

另外,为了防止文本框更改事件将列表框设置回可见,请在列表框事件处理程序中尝试这样的操作

private void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        
            //selectedItemsId = (int)listBox1.SelectedValue;
            if (listBox1.ItemsSource != null)
            
                listBox1.Visibility = Visibility.Collapsed;
            

            if (listBox1.SelectedIndex != -1)
            
                //remove the listener on the textbox
                textBox1.TextChanged -= TextBoxBase_OnTextChanged;
                textBox1.Text = listBox1.SelectedItem.ToString();
                //put the listener back on the text box
                textBox1.TextChanged += TextBoxBase_OnTextChanged;
            
        

【讨论】:

我很惊讶,所以我只是尝试了你的代码,然后开始大笑。 IT 工作正常,您确实隐藏了列表框,但随后,您设置了文本框的值,使其触发其 textchanged 处理程序,这反过来又使列表框再次可见。 如果您想了解这些事情是如何发生的,以及运行代码时实际发生了什么,请了解断点。如何设置它们,以及如何使用它们。见msdn.microsoft.com/en-us/library/ktf38f66(v=vs.71).aspx Timothy Groote 谢谢你分享这个:) 我想要数据网格中的搜索面板你能分享一些与其创建相关的链接吗? @Dua Ali 有很多方法可以实现这一目标,但似乎都与这个问题无关。但你可能想看看***.com/questions/4166403/wpf-datagrid-filter【参考方案2】:

你可以写:

listBox1.Visible = false;

而不是 listBox1.Visibility。

【讨论】:

小心,“隐形”和“折叠”是有区别的。见***.com/questions/886742/… 此外,WPF UIElement 没有名为 Visible 的属性

以上是关于从中选择项目后如何隐藏列表框?的主要内容,如果未能解决你的问题,请参考以下文章

隐藏列表框滚动条和同步滚动

如何使用 wpf 代码隐藏在列表框中隐藏单个列表框项?

如何隐藏 ListView 列标题?

如何使用VBA隐藏多列列表框中的列

获取选择值列表作为隐藏字段中分隔的管道并提交

下拉列表框控制层的显示和隐藏