在 WPF 中使用搜索栏(文本框)时如何对 StackPanel 进行重新排序?

How to make a StackPanel reorder when using a Search Bar (TextBox) in WPF?

上下文: 我有一个里面有按钮的 StackPanel。这些按钮以编程方式创建、命名并放入 stackPanel 中。然后我有一个文本框用作搜索栏,带有一个用作搜索按钮的按钮。

我想做什么: 我想要的是,当 TextBox 充满某些按钮标签的文本并单击搜索按钮时,StackPanel 删除似乎与 TextBox 内容不匹配的按钮,然后,当我擦除 TextBox 的内容时,重新出现(我不介意它是否与之前的顺序相同)。

问题: 我有两个主要问题,都与同一个问题有关:单击“搜索”按钮时,它没有成功。通过 FindName 方法调用 Button 似乎不起作用(它给了我一个 null 。所以,我的问题是:是否可以像我之前所说的那样对 StackPanel 进行重新排序?在那种情况下,我将如何调用 Button以编程方式创建?

代码:

private void buscarEntrada_Click(object sender, RoutedEventArgs e)
{
    //Search button's click event
    //All the buttons are named "Btn" + a constantly increasing number (0,1,2,3...)
    //stackBotones is my StackPanel, I remove the buttons and then readd them depending on the textbox's content
    try
    {
        for (int i = 0; i < stackBotones.Children.Count; i++)
        {
            stackBotones.Children.Remove((UIElement)stackBotones.FindName());
        }
    }
    catch (Exception error)
    {
        MessageBox.Show(error);
    }
}

预先感谢您阅读本文。

您可以在 Children 集合中按名称查找子元素,如下所示:

string name = txt.Text;
Button button = stackBotones.Children.OfType<Button>().FirstOrDefault(x => x.Name == name);

如果你想删除除匹配元素之外的所有元素,你可以循环执行此操作:

string name = "b";
for(int i = stackBotones.Children.Count - 1; i>=0; i--)
{
    if (stackBotones.Children[i] is FrameworkElement fe && fe.Name != name)
        stackBotones.Children.RemoveAt(i);
}

您可以将 stackBotones.Children[i] 添加到列表中,然后根据您的逻辑使用该列表重新填充 stackBotones.Children