2010-02-19 30 views
1

我是一個非常新手的WPF程序員,所以在一些簡單的任務中需要幫助。 (+)選項卡(它是使用TabItem創建的選項卡,或者應該是按鈕還是別的什麼?: - /)創建一個選項卡留給它,比如說(A1),再次按下,應該創建(A2),類似於標籤式瀏覽器.........並且如果可能的話,按( - )刪除用戶提示符上的選定標籤。2快速WPF(Windows演示基礎)關於選項卡和組合框的問題

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

2 - 我想,該用戶在文本框中輸入文本,由逗號,或者分號分隔的內容,並且內容被添加到按鈕按下/點擊,我想一個組合框,它需要一些數據綁定?不確定,..在它結束時,從文本框中的內容變爲ComboBox中的列表(在按鈕上按下).................... 如果可能的情況下,在文本框中選擇文本時,在按鈕單擊(相同或不同的按鈕被選擇將文本框內容添加到組合框)時,它將從文本框和組合框中刪除相同的文本框。

請幫助,我正在學習WPF,但需要這種緊急幫助,我無法用我當前的知識來解決這個問題。謝謝。

回答

0

選項卡控件應該很容易。在+選項卡上處理Click事件,創建一個新選項卡並使其成爲活動選項卡。應該很容易...我必須跑,所以現在不能告訴你代碼的答案。嘗試一下並回到任何問題。

接下來的部分,我可以多一點有益的

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

代碼隱藏窗口(或類)必須執行INotifyPropertyChanged。也窗口的DataContext屬性設置爲自身(例如,在構造函數)等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")); 
      } 
     } 

文本改變事件處理程序修改所述代碼隱藏選項屬性,並觸發該屬性已被修改的通知。由於Combobox是綁定到該屬性並自行更新的數據,因此會通知Combobox。

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

不幸的是,'TabItem'沒有'Click'事件。它甚至沒有「Selected」事件。當用戶點擊一個標籤時,由TabControl控制。它也不區分點擊標籤和用鍵盤導航到標籤,如果你希望這些手勢有不同的結果,這是不幸的,就像你在這種情況下那樣。 – 2010-02-19 23:32:58

+0

嗨Gishu,謝謝你的幫助。雖然出現了另一個問題,但當我嘗試執行並發現由於我的下一個問題中提到的原因而無法訪問我的ComboBox時 - > http://stackoverflow.com/questions/2302876/datagrid-editable-issue-access-issue- in-wpf。請幫助。非常感謝。 – user276916 2010-02-20 16:49:41

+0

@Robert - 啊!不知道--Geny,我想你必須閱讀MVVM(搜索Josh Smith的文章),以便在WPF中輕鬆完成所有不平凡的事情 – Gishu 2010-02-22 06:49:08

2

所有數據綁定和MVVM都更容易。開始時更加困難,但最終更容易。

製作兩個類,ItemItemCollection,它們都實現了INotifyPropertyChangedItem應該公開一個字符串Text屬性,而ItemCollection應該公開一個ObservableCollection<Item>Items屬性和一個ItemSelectedItem屬性。

使ItemCollection類的構造函數填充Items與測試數據和設置SelectedItem

在實際使用tab控件之前,這似乎有很多事情要做,但請相信我,您會喜歡這個結果。您的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。它創建一個​​對象並將其設置爲TabControlDataContext。您已綁定ItemSourceItems,因此TabControl將爲每個項目創建一個TabItem。它將應用ItemContainerStyle每個TabItem,這將其Header屬性設置爲ItemText財產。

當控件呈現一個選項卡的內容,它發現它的渲染項,搜索整個資源,找到一個DataTemplateDataType的項目相匹配,並使用該模板。由於我們在TabControl.Resources中定義了一個,所以您會再次獲得一個很好的藍色背景和Text屬性。

這似乎很多要經過。但是現在您不必編寫任何操作UI的代碼;你只需編寫代碼來操縱你的UI,而且UI幾乎可以自己處理。

現在,讓我們添加新的選項卡的照顧。我們要做的是向控件添加一個新項目,當它被選中時,將向Items集合添加一個新項目。

創建一個新的類,叫哦,ControlItem。它來自Item。修改您的​​構造函數,以便它添加的最後一項是ControlItem,而不是Item。並讓它將該項目的Text屬性設置爲「+」。

此方法添加到​​:

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

現在添加到您的窗口的代碼隱藏,併爲您的TabControlSelectionChanged事件處理程序:

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(); 
    } 
} 

您可以實現類似的邏輯刪除列表中的一個項目,但您需要引入另一個變量來追蹤之前選擇的項目,以便您可以知道要刪除哪個項目。

你可以做的另一件事:實現Background財產Item和setter方法添加到該TabItemBackground屬性綁定到它的ItemContainerStyle。然後,您可以在ControlItem中重載該屬性,以便添加和刪除選項卡看起來不同。

您還可以爲您的控件項目實現不同的子類,並讓他們公開您在SelectionChanged事件處理程序中調用的方法。這樣,事件處理程序不必知道被點擊的控件項目在做什麼。事實上,如果你使方法成爲Item的一部分,並且除非被覆蓋,否則它什麼都不做,窗口甚至不需要知道Item具有的子類。

這就是MVVM背後的哲學:將視圖綁定到它幾乎什麼都不知道的對象上。讓視圖模型對象控制發生的事情,以便視圖不必。