2012-08-26 60 views
0

我想在TabControl的所有頁面上具有相同的控件。TabControl在每個選項卡上具有相同的控件

我有tabControl沒有任何tabPages在我的形式。在相同的形式中,我有一些控件可以自動添加到每個tabPage。並與他們一起工作。我怎樣才能做到這一點?

我想是這樣的:

public chatForm(string chatID, object conversation) 
    { 
     InitializeComponent(); 

     createNewTab(chatID, conversation); 
    } 

    internal void createNewTab(string chatID, object conversation) 
    { 
     ISIMtabPage newTab = new ISIMtabPage(); 
     newTab.Text = Converter.getContactName(conversation); 
     newTab.Name = chatID; 

     newTab.conversation = conversation; 

     newTab.avatarBox.Image = new Bitmap("graphics\\anonymousAvatar.png");// how can I work with this control in the selected tab? 

我如何能做到這一點的所有控件將在每個tabPage自動地,我怎麼能與他們合作?

+3

我就從TabItem的創建一個新的用戶控件的驅動它。將其修改爲我的需要,並將此控件作爲TabItem添加到我的TabControl中。 – jwillmer

+0

我已經創建了我的TabPage控件。但是,在每個TabPage中控制什麼? – sczdavos

+1

題外話:這是一個不尋常的地方調用'InitializeComponent'。通常它被稱爲構造函數中的第一件事。 – stakx

回答

1

我會做這樣的(代碼是一個WPF的解決方案,已經overlooed在WinForm,標籤,但應該工作類似。):

MyTabItem.xaml.cs

public partial class MyTabItem : TabItem, INotifyPropertyChanged 
{ 
    #region PropertyChanged 

    public event PropertyChangedEventHandler PropertyChanged; 

    void OnPropertyChanged(string propName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propName)); 
    } 

    #endregion 

    #region Properties 

    private string myTitle; 
    public string MyTitle 
    { 
     get { return myTitle; } 
     set 
     { 
      myTitle = value; 
      OnPropertyChanged("MyTitle"); 
     } 
    } 

    private string myContent; 
    public string MyContent { 
     get { return myContent; } 
     set 
     { 
      myContent = value; 
      OnPropertyChanged("MyContent"); 
     } 
    } 

    #endregion 

    public MyTabItem() 
    { 
     InitializeComponent(); 
    } 
} 

MyTabItem的.xaml

<TabItem x:Class="WpfApplication1.MyTabItem" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      DataContext="{Binding RelativeSource={RelativeSource self}}"> 

    <TabItem.Header> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="{Binding MyTitle}"/> 
     </StackPanel> 
    </TabItem.Header> 

    <TabItem.Content> 
     <Grid> 
      <TextBlock Text="{Binding MyContent}" Background="Azure"/> 
     </Grid> 
    </TabItem.Content> 
</TabItem> 

MainWindow.xaml.cs

public MainWindow() 
{ 
    InitializeComponent(); 

    var tab = new MyTabItem {MyContent = "Content", MyTitle = "Title"}; 

    MyTabControl.Items.Add(tab); 
} 

MainWindow.xaml

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
     <TabControl x:Name="MyTabControl"/> 
    </Grid> 
</Window> 
+0

現在我擁有了這個。但我怎麼能做到這一點,在所有TabPages將具有相同的組件?那我該如何與他們合作? tabControl中有一些按鈕。選項卡控件尚未創建任何選項卡。我希望在所有tabPages中都有控件。我如何將它們添加到新的tabPage中,以及如何在存在的tabPage上使用它們? – sczdavos

+0

您可以在主視圖中添加與MytabItem相同的控件,並使用MyTitle和MyContent中的內容填充內容。 – jwillmer

+0

什麼事件? FXP。 button_click事件。我是否也應該將它們添加到我的tabPage? – sczdavos

1

我有自己的階級延伸TabPage的組成部分。我只是添加我的屬性。但是我希望所有頁面上都有相同的組件。如果我調用addMessage方法,它只是添加文本到tabPage [id] .conversationTextBox.Append(message); [...]如果我點擊另一個標籤,它會顯示其他當前對話。我不明白,不知道該怎麼做。 - sczdavos

這是因爲原始類型將通過值傳遞,通過引用複雜! 我發現這個關於參考和值類型的例子,並希望你能從中學習[1]。讀完之後試試這個:

@sczdavos通常你創建一個類,你想要使用的所有屬性並在你的視圖中共享這個類的一個實例。 [...]

[1] http://www.codeproject.com/Articles/32029/Reference-and-Value-Types-in-C

相關問題