下拉TabControl

时间:2010-09-22 20:32:16

标签: wpf templates combobox tabcontrol

我一直在尝试为WPF中的TabControl创建自定义皮肤/模板。

我希望标签显示在ComboBox中。当您从ComboBox中选择项目时,我希望选项卡控件的内容区域显示TabItem内容。

这是一张显示我正在寻找的图片:

alt text

我可以使用数据对象和模板进行某种主 - 细节设置,但问题是我想使用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”面板)。我遇到了麻烦,因为视觉效果只能在视觉树中的一个地方。因此,将面板的子项放入弹出窗口会导致抛出异常。

有人还有其他想法吗?

感谢您的帮助!

3 个答案:

答案 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。