Пожалуйста, критикуйте этот метод - PullRequest
1 голос
/ 23 мая 2010

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

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

Использую ли я слишком много памяти для сохранения табита в свойстве Tag?

Ответы [ 2 ]

1 голос
/ 24 мая 2010

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

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

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

1 голос
/ 23 мая 2010

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

Когда вы делаете

closeBtn.Tag = newTabItem;

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

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

...