Критикуйте этот метод

Привет я по всей сети искал некоторую кнопку вкладки близкая функциональность, но все те решения имели, некоторые усложнили eventhandler, и я хотел попытаться сохранить это простым, но я, возможно, повредил хорошую этику кода, делающую так, поэтому рассмотрите этот метод и скажите мне что не так.

   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. Свойство тегов, и затем когда кнопка нажата я просто, удаляет tabitem из моего observablecollection, и UI обновляется соответственно.

Я использую слишком много памяти, сохраняющей tabitem к Свойству тегов?

1
задан Pavel Minaev 23 May 2010 в 09:40
поделиться

2 ответа

Поскольку вы запрашиваете отзыв о своем коде, я рекомендую вам взглянуть на привязку вашего списка вкладок к ObservableCollection элементов данных и использовать DataTemplate для определения внешнего вида каждой вкладки.

Взгляните на превосходную статью Джоша Смита MSDN о MVVM , где у него есть пример кода, который добавляет и удаляет элементы вкладок, не касаясь кода пользовательского интерфейса.

Что касается наличия кнопки закрытия на самой вкладке, здесь есть пример , который является подклассом TabItem. Конечно, на самом деле вам не нужно создавать подкласс - вы можете просто переопределить шаблон стандартного TabItem . Если вы решите использовать шаблон проектирования MVVM для своего приложения ( вам следует! ), вы можете привязать кнопку закрытия к команде внутри вашей модели просмотра, которая просто удаляет объект данных из вышеупомянутого ObservableCollection .

1
ответ дан 3 September 2019 в 00:22
поделиться

Я не знаю достаточно о WPF, чтобы сказать, является ли это лучшим способом достичь желаемого, но я бы не подумал, что использование памяти будет здесь проблемой.

Когда вы выполняете

closeBtn.Tag = newTabItem;

, вы сохраняете только ссылку на newTabItem в свойстве closeBtn.Tag.

В любом случае объект TabItem должен оставаться в памяти до тех пор, пока он отображается.

1
ответ дан 3 September 2019 в 00:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: