2010-02-19 3 views
1

저는 아주 초보자 WPF 프로그래머이므로 간단한 작업에 도움이 필요합니다.빠른 WPF (Windows 프레젠테이션 파운데이션)에 대한 질문이 탭과 콤보 상자에 표시됩니다.

1- 이미지가 보여 주듯이, (+) 탭을 원합니다 (지금 TabItem으로 생성 된 탭이거나 버튼이든 다른 것이어야합니까? : - /) 왼쪽으로 탭을 생성하려면 (A1)을 다시 누르면, (A2)를 생성해야하며, 탭 브라우저와 비슷합니다 ......... 가능하면 (-)을 누르면 사용자 프롬프트에서 선택된 탭이 삭제됩니다.

alt text http://img191.imageshack.us/img191/4532/tabn.png

2 내가 원하는, 즉 사용자가 쉼표 또는 세미콜론으로 구분 내용으로, 텍스트 상자에 텍스트를 입력하고 그 내용이 버튼을 눌러/I 추측, 클릭에 콤보 상자에 추가, 일부가 필요합니다 일종의 데이터 바인딩? 잘 모르겠다. .. 텍스트 상자의 내용이 콤보 상자 내에서 (버튼을 눌렀을 때) 나타나는 .................... 그리고 만약 그렇다면 텍스트 상자에서 텍스트를 선택하면 버튼 클릭 (텍스트 상자 내용을 콤보 상자에 추가하기 위해 선택한 동일한 또는 다른 버튼)에서 텍스트 상자와 콤보 상자에서 동일한 텍스트가 삭제됩니다.

도와주세요. WPF를 배우고 있지만이 긴급한 도움이 필요합니다.이 지식은 현재 지식으로는 해결할 수 없습니다. 고맙습니다.

답변

0

탭 컨트롤이 쉬워야합니다. + 탭에서 클릭 이벤트를 처리하고 새 탭을 만들어 활성 탭으로 만듭니다. 쉬워야합니다 ... 실행해야합니다. 지금 코드 답변을 보여줄 수 없습니다. 시도해보고 문제가 있으면 다시 받으십시오.

다음 부분 내가 조금 더 도움이 될 수

<StackPanel> 
      <TextBox x:Name="txtOptions" TextChanged="OnTextChanged"></TextBox> 
      <ComboBox x:Name="cboSelect" ItemsSource="{Binding Path=Options}"/> 
     </StackPanel> 

코드 숨김 창 (또는 클래스)에서 INotifyPropertyChanged를 구현해야한다. 또한 텍스트 변경 이벤트 처리기가 코드 숨김의 옵션 속성을 수정하고 속성이 수정되었습니다 통지를 발생 this.DataContext = this;

public partial class Window1 : Window, INotifyPropertyChanged 
    { 
     string[] _options; 
     public string[] Options 
     { 
      get 
      { return _options;   } 
      set 
      { 
       _options = value; 
       if (this.PropertyChanged != null) 
        this.PropertyChanged(this, new PropertyChangedEventArgs("Options")); 
      } 
     } 

처럼 자체 (예를 들어, ctor에있는)에 창의의 DataContext 속성을 설정합니다. 콤보 박스는 해당 속성과 자체 업데이트에 바인딩 된 데이터이므로 알림을받습니다.

private void OnTextChanged(object sender, TextChangedEventArgs e) 
     { 
      this.Options = txtOptions.Text.Split(';'); 
     } 
+0

'TabItem'에는 비극적으로'Click' 이벤트가 없습니다. 그것은'Selected' 이벤트조차 가지고 있지 않습니다. 사용자가 탭을 클릭 할 때 응답하는 것은 'TabControl'에 달려 있습니다. 또한 탭을 클릭하고 키보드로 탭으로 이동하는 것을 구별하지 않습니다.이 경우에는 제스처가 다른 결과를 나타 내기를 원하면 불행합니다. –

+0

안녕하세요. Gishu, 도움을 주셔서 감사합니다.다른 문제가 발생하더라도 구현을 시도 할 때 내 다음 질문에서 언급 한 이유로 ComboBox에 액세스 할 수 없다는 것을 알게되었습니다. -> http://stackoverflow.com/questions/2302876/datagrid-editable-issue-access-issue- in-wpf. 제발 도와주세요. 정말 고마워. – user276916

+0

@ 로버트 - 아! 그걸 몰랐어 - 제니, 난 WPVM에서 쉽게 할 수있는 모든 사소한 것들을 얻으려면 MVVM (그 조쉬 스미스의 기사 검색)에 읽어야 할 것 같아요 – Gishu

2

데이터 바인딩 및 MVVM을 사용하면 모든 것이 더 쉬워집니다. 처음에는 힘들었지 만, 궁극적으로 훨씬 쉽습니다.

ItemItemCollection의 두 클래스를 모두 INotifyPropertyChanged으로 구현하십시오. ItemText 문자열을 노출해야하며 ItemCollection 속성은 ObservableCollection<Item>Items 속성과 ItemSelectedItem 속성을 노출해야합니다.

ItemCollection 클래스의 생성자가 테스트 데이터가있는 Items으로 채우고 SelectedItem으로 설정합니다.

이것은 실제로 탭 컨트롤을 구현하기 전에해야 할 일처럼 보입니다. 그러나 나를 믿으십시오. 결과를 좋아할 것입니다. TabControl에 대한 XAML은 다음과 같습니다.

<TabControl 
    ItemsSource="{Binding Items}" 
    SelectedItem="{Binding SelectedItem}"> 
    <TabControl.DataContext> 
     <local:ItemsCollection/> 
    </TabControl.DataContext> 
    <TabControl.Resources> 
     <DataTemplate DataType="{x:Type local:Item}"> 
      <TextBlock Background="AliceBlue" Text="{Binding Text}"/> 
     </DataTemplate> 
    </TabControl.Resources> 
    <TabControl.ItemContainerStyle> 
     <Style TargetType="{x:Type TabItem}"> 
      <Style.Setters> 
       <Setter Property="Header" Value="{Binding Text}"/> 
      </Style.Setters> 
     </Style> 
    </TabControl.ItemContainerStyle> 
</TabControl> 

이 기능을 이해해 봅시다. TabControl을 만듭니다. ItemsCollection 개체를 만들고 TabControlDataContext으로 설정합니다.ItemSourceItems으로 묶었으므로 TabControl은 각 항목에 대해 TabItem을 만듭니다. 각 TabItemItemContainerStyle을 적용하여 Header 속성을 ItemText 속성으로 설정합니다.

컨트롤이 탭의 콘텐츠를 렌더링 할 때 렌더링하는 항목을 찾고 리소스를 검색하여 이 DataType 인 항목을 찾고 해당 템플릿을 사용합니다. TabControl.Resources에 하나를 정의 했으므로 멋진 파란색 배경과 Text 속성을 다시 얻게됩니다.

이것은 많은 문제가 될 것 같습니다. 그러나 이제는 UI를 조작하는 코드를 작성할 필요가 없습니다. ItemsCollection을 조작하는 코드를 작성하면 UI가 거의 자체적으로 처리됩니다.

이제 새 탭을 추가해 보겠습니다. 이제 컨트롤에 새 항목을 추가하여 선택하면 Items 컬렉션에 새 항목을 추가합니다.

새 클래스 (예 : ControlItem)를 만듭니다. Item에서 파생 되었습니까? ItemsCollection 생성자를 수정하여 마지막 항목이 ControlItem이되고 Item이 아닌 값이되도록합니다. 그리고 해당 항목의 Text 속성을 "+"로 설정했는지 확인하십시오.

것은 ItemsCollection에이 방법을 추가

public Item AddItem() 
{ 
    Item newItem = new Item {Text = "New item"}; 
    Items.Insert(Items.Count-1, newItem); 
    return newItem; 
} 

는 이제 윈도우의 코드 숨김에 추가하고 TabControl에 대한 SelectionChanged 이벤트 핸들러로 :

void TabControl_SelectionChanged(object sender, RoutedEventArgs e) 
{ 
    TabControl tc = (TabControl) sender; 
    if (tc.SelectedItem is ControlItem) 
    { 
     ItemsCollection ic = (ItemsCollection) tc.DataContext; 
     tc.SelectedItem = ic.AddItem(); 
    } 
} 

당신은 제거 유사한 논리를 구현할 수 있습니다 목록에서 항목을 삭제할 수 있지만 삭제할 항목을 알 수 있도록 이전에 선택한 항목을 추적하려면 ItemsCollection에 다른 변수를 추가해야합니다. 당신이 할 수있는

또 한가지 : ItemBackground 속성을 구현하고 그것에 TabItemBackground 속성을 결합하는 ItemContainerStyle에 세터를 추가합니다. 그런 다음 해당 속성을 ControlItem에 오버로드하여 추가 및 삭제 탭이 다르게 표시되도록 할 수 있습니다.

컨트롤 항목에 대해 다른 하위 클래스를 구현하고 SelectionChanged 이벤트 처리기에서 호출하는 메서드를 노출시킬 수도 있습니다. 이렇게하면 이벤트 핸들러는 클릭되는 컨트롤 항목이 수행중인 작업에 대해 아무 것도 알 필요가 없습니다. 실제로 메소드가 Item의 일부가되고 오버라이드하지 않는 한 아무 작업도 수행하지 않으면 윈도우가 Item 하위 클래스가 있음을 알 필요조차 없습니다.

MVVM의 철학은 간단합니다. 거의 아무것도 모르는 객체에 뷰를 바인딩합니다. 뷰 모델 객체가 어떤 일이 일어나도록 제어하므로 뷰가 반드시 필요하지 않습니다.