Привет я по всей сети искал некоторую кнопку вкладки близкая функциональность, но все те решения имели, некоторые усложнили 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 к Свойству тегов?
Поскольку вы запрашиваете отзыв о своем коде, я рекомендую вам взглянуть на привязку вашего списка вкладок к ObservableCollection элементов данных и использовать DataTemplate для определения внешнего вида каждой вкладки.
Взгляните на превосходную статью Джоша Смита MSDN о MVVM , где у него есть пример кода, который добавляет и удаляет элементы вкладок, не касаясь кода пользовательского интерфейса.
Что касается наличия кнопки закрытия на самой вкладке, здесь есть пример , который является подклассом TabItem. Конечно, на самом деле вам не нужно создавать подкласс - вы можете просто переопределить шаблон стандартного TabItem
. Если вы решите использовать шаблон проектирования MVVM для своего приложения ( вам следует! ), вы можете привязать кнопку закрытия к команде внутри вашей модели просмотра, которая просто удаляет объект данных из вышеупомянутого ObservableCollection
.
Я не знаю достаточно о WPF, чтобы сказать, является ли это лучшим способом достичь желаемого, но я бы не подумал, что использование памяти будет здесь проблемой.
Когда вы выполняете
closeBtn.Tag = newTabItem;
, вы сохраняете только ссылку на newTabItem в свойстве closeBtn.Tag.
В любом случае объект TabItem должен оставаться в памяти до тех пор, пока он отображается.