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);
  }

つまり、私が行っているのは、タブアイテムをbtn.Tagプロパティに格納し、ボタンがクリックされたときに、observablecollectionからタブアイテムを削除するだけで、UIが適切に更新されます。

タブアイテムをTagプロパティに保存するためにメモリを使いすぎていませんか?

4

2 に答える 2

1

WPFについては、これが目的を達成するための最良の方法であるかどうかを判断するのに十分なことはわかりませんが、ここでメモリ使用量が問題になるとは思いませんでした。

あなたがするとき

closeBtn.Tag = newTabItem;

newTabItemへの参照のみをcloseBtn.Tagプロパティに保存します。

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 に答える