2011-06-02 79 views
0

我很新的WPF和XAML和不完全明白怎么做了以下(VS2010,WPF,VB.net):XAML代码布局控件类

我有继承的自定义类从TabItem中,并在这个类中我有我想要在我的标签页上,一个RichTextBox和一个文本框的几个控件。这些TabItems将在运行时动态创建,并随用户需要添加到TabControl。如何创建XAML代码并存储它,以便在运行时动态创建自定义类时,它会根据需要列出两个包含的控件?

Public Class CodePage : Inherits TabItem 
     Private RTB As RichTextBox 
     Private TB As TextBox 
     ... 
    End Class 

我在XAML猜测:

<Window x:Class="MainWindow" 
     xmlns:local="clr-namespace:KRL" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 

     <Style TargetType="{x:Type local:CodePage}"> 
      <Grid> 
       NEED HELP HERE 
      </Grid> 
     </Style> 

     <Grid> 
      ... 
     </Grid> 
    </Window 

预先感谢您和抱歉,如果这已被问过,我试过研究和不理解。

回答

2

首先,您的自定义TabItem需要重写元数据,以便根据您的新类型而不是基类获取正确的样式(道歉 - 我使用过C#,因为我在VB中不够精通):

public static CodePage() 
{ 
    FrameworkElement.DefaultStyleKeyProperty.OverrideMetadata(
     typeof(CodePage), 
     new FrameworkPropertyMetadata(typeof(CodePage))); 
} 

这将让你在你的主题(Generic.xaml)这样定义默认的样式:

<Style TargetType="{x:Type local:CodePage}"> 
    ... 
</Style> 

在这种风格,你可以定义的模板。这告诉WPF如何在逻辑树中找到它的实例时再呈现该控件。

通过外观的东西,你已经在代码而不是你的模板中创建了控件。这是个错误。您应该定义依赖项属性来将数据存储在您的类中,并定义模板中的外观(无论是文本框,富文本框还是其他内容)。一个例子模板可能是这样的:

我会那么可以使用您的代码页类是这样的:

<TabControl> 
    <whatever:CodePage Header="Hello" Property1="Foo" Property2="Bar"/> 
</TabControl> 

那么你就需要一个定制TabControl重写它的容器一代返回CodePage而不是TabItem的实例,但那是另一回事。

+0

嗨肯特,谢谢你的答案。这是什么:代码页你写了什么,即我把什么?我知道,我很新。最后,我如何选择正确的答案?我找不到“正确答案”按钮。谢谢。 – 2011-06-03 16:05:09

+0

请参阅此页(http://msdn.microsoft.com/en-us/library/ms747086.aspx)[http://msdn.microsoft.com/en-us/library/ms747086.aspx]。 – Code0987 2011-06-03 18:16:21

1

只是我的两个意义,但它看起来像你正在写一个WinForms应用程序的方式。有了WPF的强大功能,您可能根本不需要从TabItem继承CodePage。你有没有看过任何MVVM文章?在高层次上,我会说你想改为创建一个CodePageViewModel,然后创建一个DataTemplate,以便它在Microsoft的TabItem中正确显示你的控件。