您好我一直在网上寻找一些标签按钮关闭功能,但所有这些解决方案都有一些复杂的事件处理程序,我想尝试保持简单,但我可能已经破坏了良好的代码道德这样做,所以请查看此方法并告诉我出了什么问题。
public void AddCloseItem(string header, object content){
//Create tabitem with header and content
StackPanel headerPanel = new StackPanel() { Orientation = Orientation.Horizontal, Height = 14};
headerPanel.Children.Add(new TextBlock() { Text = header });
Button closeBtn = new Button() { Content = new Image() { Source = new BitmapImage(new Uri("images/cross.png", UriKind.Relative)) }, Margin = new Thickness() { Left = 10 } };
headerPanel.Children.Add(closeBtn);
TabItem newTabItem = new TabItem() { Header = headerPanel, Content = content };
//Add close button functionality
closeBtn.Tag = newTabItem;
closeBtn.Click += new RoutedEventHandler(closeBtn_Click);
//Add item to list
this.Add(newTabItem);
}
void closeBtn_Click(object sender, RoutedEventArgs e)
{
this.Remove((TabItem)((Button)sender).Tag);
}
所以我正在做的是将tabitem存储在btn.Tag属性中,然后当单击该按钮时,我只是从我的observablecollection中删除tabitem,并且UI被适当更新。
我是否使用太多内存将tabitem保存到Tag属性?
答案 0 :(得分:1)
我对WPF的了解不足以说明这是否是达到你想要的最佳方式,但我不会想到内存使用会成为一个问题。
当你这样做时
closeBtn.Tag = newTabItem;
您只在closeBtn.Tag属性中存储对newTabItem的引用。
TabItem对象在任何情况下都需要保留在内存中。
答案 1 :(得分:1)
由于您要求对代码提供反馈,我建议您查看将标签列表绑定到ObservableCollection数据项并使用DataTemplate定义每个标签的外观
看看Josh Smith的优秀MSDN article about MVVM,他有一些示例代码,可以在不触及UI代码的情况下添加和删除标签项。
至于在实际标签上有一个关闭按钮,有一个example here,它是TabItem的子类。当然,你并不是必须继承它 - 你可以重新定义标准TabItem
的模板。如果你决定为你的应用程序使用MVVM设计模式(你应该),你可以将关闭按钮绑定到viewmodel中的command,它只是从前面提到的{{{{}} { 1}}。