在 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
。
上下文: 我有一个里面有按钮的 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
。