嗨,我一直在网上寻找一些选项卡按钮关闭功能,但所有这些解决方案都有一些复杂的事件处理程序,我想尝试保持简单,但这样做可能违反了良好的代码道德,所以请查看这个方法并告诉我哪里出了问题。
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 属性时是否使用了太多内存?
既然您要求对代码提供反馈,我建议您考虑将选项卡列表绑定到数据项的ObservableCollection,并使用DataTemplate来定义每个选项卡的外观。
查看 Josh Smith 的优秀 MSDN 关于 MVVM 的文章,其中有示例代码,可以在不触及 UI 代码的情况下添加和删除选项卡项。
至于在实际选项卡上有一个关闭按钮,这里有一个 示例,它是 TabItem 的子类。当然,您实际上不必必须对其进行子类化 - 您只需重新定义标准
TabItem
的模板即可。如果您决定为您的应用程序使用 MVVM 设计模式(您应该!),您可以将关闭按钮绑定到视图模型内的命令,该命令只需从上述ObservableCollection
中删除数据对象。
我对 WPF 的了解还不够,无法判断这是否是实现您想要的效果的最佳方式,但我没想到内存使用会成为这里的一个问题。
当你这样做时
closeBtn.Tag = newTabItem;
您仅在 closeBtn.Tag 属性中存储对 newTabItem 的引用。
TabItem 对象在任何情况下只要显示就需要保留在内存中。