2012-08-26 38 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

相关问题