请批评这个方法

问题描述 投票:0回答:2

嗨,我一直在网上寻找一些选项卡按钮关闭功能,但所有这些解决方案都有一些复杂的事件处理程序,我想尝试保持简单,但这样做可能违反了良好的代码道德,所以请查看这个方法并告诉我哪里出了问题。

   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 属性时是否使用了太多内存?

c# wpf tabcontrol observablecollection tabitem
2个回答
1
投票

既然您要求对代码提供反馈,我建议您考虑将选项卡列表绑定到数据项的ObservableCollection,并使用DataTemplate来定义每个选项卡的外观。

查看 Josh Smith 的优秀 MSDN 关于 MVVM 的文章,其中有示例代码,可以在不触及 UI 代码的情况下添加和删除选项卡项。

至于在实际选项卡上有一个关闭按钮,这里有一个 示例,它是 TabItem 的子类。当然,您实际上不必必须对其进行子类化 - 您只需重新定义标准

TabItem
的模板即可。如果您决定为您的应用程序使用 MVVM 设计模式(您应该!),您可以将关闭按钮绑定到视图模型内的命令,该命令只需从上述
ObservableCollection
中删除数据对象。


1
投票

我对 WPF 的了解还不够,无法判断这是否是实现您想要的效果的最佳方式,但我没想到内存使用会成为这里的一个问题。

当你这样做时

closeBtn.Tag = newTabItem;

您仅在 closeBtn.Tag 属性中存储对 newTabItem 的引用。

TabItem 对象在任何情况下只要显示就需要保留在内存中。

© www.soinside.com 2019 - 2024. All rights reserved.