用于布局控件类的XAML代码

时间:2011-06-02 18:43:38

标签: wpf class xaml layout

我是WPF和XAML的新手,并不完全了解如何执行以下操作(VS2010,WPF,VB.net):

我有一个继承自TabItem的自定义类,在这个类中,我在标签页上有一些我想要的控件,一个RichTextBox和一个TextBox。这些TabItem将在运行时动态创建,并根据用户需要添加到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 个答案:

答案 0 :(得分: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如何在逻辑树中找到它的实例时呈现该控件。

从外观上看,您已经在代码而不是模板中创建了控件。这是个错误。您应该定义依赖项属性以将数据存储在CodePage类中,并在模板中定义外观(无论是文本框,富文本框还是其他内容)。示例模板可能如下所示:

<Style ...>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CodePage}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>

                    <TextBox Text="{TemplateBinding Property1}"/>
                    <TextBox Grid.Column="1" Text="{TemplateBinding Property2}"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>

然后我可以使用你的CodePage类:

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

您可能希望自定义TabControl覆盖其容器生成以返回CodePage而不是TabItem的实例,但这是另一个故事。

答案 1 :(得分:1)

只是我的两个感觉,但看起来你是按照WinForms应用程序的方式编写的。有了WPF的强大功能,你根本不需要让你的CodePage继承TabItem。你有没有看过那里的任何MVVM文章?在高级别,我会说你想要创建一个CodePageViewModel,然后创建一个DataTemplate,以便它在Microsoft的TabItem中正确显示你的控件。