我是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
先谢谢你,对不起,如果之前有人询问,我已经尝试过研究,不明白。
答案 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中正确显示你的控件。