1

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

   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 属性?

4

2 回答 2

1

我对 WPF 知之甚少,无法说出这是否是实现您想要的最佳方式,但我不会认为内存使用会成为这里的一个问题。

当你这样做

closeBtn.Tag = newTabItem;

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

TabItem 对象在任何情况下都需要一直保留在内存中。

于 2010-05-23T09:53:24.947 回答
1

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

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

至于在实际选项卡上有一个关闭按钮,这里有一个将 TabItem 子类化的示例。当然,您实际上不必子类化它 - 您可以重新定义标准的模板TabItem。如果您决定为您的应用程序使用 MVVM 设计模式(您应该!),您可以将关闭按钮绑定到视图模型中的一个命令,该命令只是从上述ObservableCollection.

于 2010-05-23T20:08:37.223 回答