2010-05-23 2 views
1

안녕하세요 몇 가지 탭 버튼 닫기 기능에 대한 그물 주위를 둘러 봤지만 모든 그 솔루션은 몇 가지 복잡한 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); 
    } 

그래서 버튼이 난 그냥 내 ObservableCollection에에서 TabItem의 제거를 클릭하고, UI는 적절하게 업데이트 될 때 나는 다음 btn.Tag 속성에 TabItem에 저장되어 일을하고 있어요.

너무 많은 메모리를 사용하여 Tag 속성을 Tag 속성에 저장하고 있습니까?

+1

안녕하세요. 얘기하고있는 언어/플랫폼을 가리키는 태그를 추가하고 싶습니까? –

+0

WPF C# – KroaX

+0

감사합니다 - 그 마음에 유지할 것입니다 – Jakob

답변

1

코드에 대한 피드백을 요청하기 때문에 탭 목록을 데이터 항목 ObservableCollection에 바인딩하고 DataTemplate을 사용하여 각 탭의 모양을 정의하는 것이 좋습니다.

조쉬 스미스 (Josh Smith)의 우수 MSDN article about MVVM에서 UI 코드를 건드리지 않고 탭 항목을 추가 및 제거하는 예제 코드가 있습니다.

실제 탭에 닫기 버튼이있는 경우 TabItem을 하위 클래스로 갖는 example here이 있습니다. 물론, 당신은 실제로 서브 클래 싱해야합니다 - 당신은 표준 TabItem의 템플릿을 다시 정의 할 수 있습니다. MVVM 디자인 패턴을 응용 프로그램에 사용하기로 결정한 경우 (을 사용해야 함) 위의 ObservableCollection에서 단순히 데이터 객체를 제거하는 viewmodel 내부의 command에 닫기 버튼을 바인딩 할 수 있습니다.

1

이것이 내가 원하는 것을 성취 할 수있는 가장 좋은 방법인지는 모르겠지만 여기서는 메모리 사용이 걱정이 될 것이라고 생각하지 않았습니다.

당신 만 closeBtn.Tag 속성에 newTabItem에 대한 참조를 저장하고

closeBtn.Tag = newTabItem; 

을 수행 할 때.

TabItem 개체는 어떤 경우에도 표시되는 동안 메모리에 있어야합니다.

+0

다른 솔루션 내가 사용하는 이벤트를 사용하고 다음 btn의 부모 찾기 위해 visualtree 사용하고있다하지만 그건 좀 지저분 해 보인다. 또한 나는 "공용 클래스 ObservableTabCollection : ObservableCollection "차이 .cs 파일을 가지고 있으므로 ObservableTabCollection에 특정하게 만들고 싶었고 탭을 삭제하기위한 전체 논리를 보유하고 싶었 기 때문에 배선 할 필요가 없었습니다. 그것 tabcontrol가있는 페이지에서 위로. – Jakob