我一直在尝试为WPF中的TabControl创建自定义皮肤/模板。
我希望标签显示在ComboBox中。当您从ComboBox中选择项目时,我希望选项卡控件的内容区域显示TabItem内容。
这是一张显示我正在寻找的图片:
我可以使用数据对象和模板进行某种主 - 细节设置,但问题是我想使用TabControl XAML格式设置控件,如下所示:
<TabControl Style="{DynamicResource ComboTabControlStyle}">
<TabItem Header="TabItem1">
<TextBlock Text="TabItem1 Content!" FontSize="18.667" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</TabItem>
<TabItem Header="TabItem2">
<TextBlock Text="TabItem2 Content!" FontSize="18.667" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</TabItem>
<TabItem Header="TabItem3">
<TextBlock Text="TabItem3 Content!" FontSize="18.667" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</TabItem>
</TabControl>
有任何想法或建议吗?
使用不同的Panel更改选项卡项的布局非常容易,但ComboBox是ItemsControl,而不是Panel。
我尝试将ComboBox放在TabControl模板中,并将ComboBox的ItemsSource绑定到TabControl.Items属性,但它似乎无法正常工作。
我还尝试创建一个自定义面板,一次只显示一个“选定”项目,并在单击时显示下拉列表中的所有项目(基本上是“ComboBox”面板)。我遇到了麻烦,因为视觉效果只能在视觉树中的一个地方。因此,将面板的子项放入弹出窗口会导致抛出异常。
有人还有其他想法吗?
感谢您的帮助!
答案 0 :(得分:1)
做你想做的事情是非常困难的。这非常接近:
<DockPanel>
<ComboBox x:Name="ItemSelector" DockPanel.Dock="Top">
<ComboBox.ItemTemplate>
<DataTemplate DataType="{x:Type TabItem}">
<TextBlock Text="{Binding Header}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
<TabItem Header="TabItem1">
<TextBlock Text="TabItem1 Content!" FontSize="18.667" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</TabItem>
<TabItem Header="TabItem2">
<TextBlock Text="TabItem2 Content!" FontSize="18.667" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</TabItem>
<TabItem Header="TabItem3">
<TextBlock Text="TabItem3 Content!" FontSize="18.667" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</TabItem>
</ComboBox>
<ContentPresenter Content="{Binding SelectedItem.Content, ElementName=ItemSelector}" DockPanel.Dock="Top"/>
<TextBlock/>
</DockPanel>
奇怪的是,奇怪的是,它在ComboBox中显示所选项目:渲染项目时忽略ItemTemplate,因此选择框包含一个TabItem。要修复 this ,你必须继承ComboBox并实现一个读/写SelectionBoxItemTemplate依赖属性,因为,由于某种原因,我肯定不像我现在看来那样愚蠢,物业的只读。
答案 1 :(得分:0)
创建一个新类,从面板继承,在里面放一个组合框,做很多父绑定,然后使用它。它会起作用。
您必须使用自定义类来编写标签,因为它们是常规标签项。
答案 2 :(得分:0)
我找到了解决方案。
我创建了一个自定义Control类(MasterDetailControl)。
这个类有两个模板部分:
[TemplatePart(Name = "PART_MasterSelector", Type = typeof(Selector))]
[TemplatePart(Name = "PART_DetailPresenter", Type = typeof(ContentPresenter))]
该控件具有项依赖项属性:
public IList Items { ... }
我添加了一个帮助类:
[ContentProperty("Detail")]
public class MasterDetail
{
public object Master { get; set; }
public object Detail { get; set; }
}
放置在项目DP中的项目由MasterDetailControl处理。如果它们是MasterDetail类型,则将主数据库添加到选择器项列表中。对于其他子项类型,将创建一个新的MasterDetail对象,并将对象分配给主字段和详细信息字段。单独的列表维护所有生成的MasterDetail对象,其索引与Selector控件中的索引相对应。
当SelectionChanged事件在Selector对象上触发时,我将ContentPresenter的Content属性设置为与所选主对象对应的项的Detail字段。
如果有人想要更多详情,请随时发表评论。
最后,我现在可以使用一个简单的控件模板来指定任何选择器对象(ListBox,ComboBox等)和ContentPresenter。