2010-05-23 3 views
1

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

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

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

+1

Добро пожаловать в SO. Вы можете добавить тег, чтобы указать язык/платформу, о которой вы говорите? –

+0

Я бы предположил, что это WPF C# – KroaX

+0

спасибо - будем помнить об этом – Jakob

ответ

1

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

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

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

1

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

Когда вы

closeBtn.Tag = newTabItem; 

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

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

+0

Другие решения, которые я видел, используют событие, а затем используют visualtree для поиска родителя btn, но для меня это немного беспорядочно. Кроме того, у меня есть свой «открытый класс ObservableTabCollection: ObservableCollection » в файле .cs с разницей, поэтому я хотел сделать его конкретным для ObservableTabCollection, чтобы он оставил всю логику для удаления вкладок, так что мне не пришлось бы прокладывать провода это на странице, на которой находится tabcontrol. – Jakob

Смежные вопросы