我要在堆栈面板中添加一个UserControl,并且该UserControl包含一个按钮。我试图在单击它的儿童按钮时删除该UserControl。但这不起作用!
StackPanel
<StackPanel Name="StackPanelContainer" Grid.Row="3"> </StackPanel>
在StackPanel中添加控件
private void NewProducModule(object sender, RoutedEventArgs e)
{
UserControl productModules = new AddProductModule();
productModules.Name = "Product" + StackPanelContainer.Children.Count;
StackPanelContainer.Children.Add(productModules);
}
UserControl子按钮的点击方法
private void DeleteSelfProduct(object sender, RoutedEventArgs e)
{
FrameworkElement parent=(FrameworkElement)((Button)sender).Parent;
NewInvoiceControl newInvoiceControl = new NewInvoiceControl();
newInvoiceControl.StackPanelContainer.Children.Remove(parent);
}
答案 0 :(得分:0)
尝试从其子项中清除 StackPanel。 StackPanel 井倒塌了。
private void DeleteSelfProduct(object sender, RoutedEventArgs e)
{
StackPanelContainer.Children.Clear();
}
或者你可以从它的父级中删除 StackPanel。如果你认识父母。
private void DeleteSelfProduct(object sender, RoutedEventArgs e)
{
var parent = (StackPanel)StackPanelContainer.Parent;
parent.Children.Remove(StackPanelContainer);
}
答案 1 :(得分:0)
对于按钮中的操作,它缺少数据。
在命令参数中设置对面板的绑定:
CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type StackPanel}}}"
。
在答题器中,从参数中提取面板并从中删除 UserControl。 假设“DeleteSelfProduct”方法位于 UserControl 背后的代码中的示例:
private void DeleteSelfProduct(object sender, RoutedEventArgs e)
{
Button button = (Button)sender;
if (button.CommandParameter is Panel panel)
panel.Children.Remove(this);
}
P.S. 虽然这应该会有所帮助,但我仍然建议您仔细查看 MVVM 模式中的典型 WPF 实现。 您不应该(如果正确实现)在 Sharp 代码中创建甚至只是引用 WPF UI 元素。 您只需要在 Sharpe 上准备 WPF 所需的数据。 但是它们的表示(包括动态创建、修改等)必须在 XAML 中完全定义。 XAML 是 WPF 的核心语言。 您需要探索它的所有功能:DataContext、Binding、DataTemplate、Style 等等。