C# TabItem'的样式;内容

C# TabItem'的样式;内容,c#,wpf,xaml,C#,Wpf,Xaml,我有TabControl,它是我的应用程序的一个主要元素: 每个选项卡内容都有一个标题(与菜单名重复)、分隔符和内容。我的XAML代码必须与此视图相对应,如下所示: <TabControl Style="{StaticResource MyCustomStyle}"> <TabItem Header="Menu 1"> <TabItem.Content> ... </TabItem.Con

我有
TabControl
,它是我的应用程序的一个主要元素:

每个选项卡内容都有一个标题(与菜单名重复)、分隔符和内容。我的XAML代码必须与此视图相对应,如下所示:

<TabControl Style="{StaticResource MyCustomStyle}">
    <TabItem Header="Menu 1">
        <TabItem.Content>
            ...
        </TabItem.Content>
    </TabItem>
    <TabItem Header="Menu 2">
        <TabItem.Content>
            <TextBlock>Content</TextBlock>
        </TabItem.Content>
    </TabItem>
    ...
</TabControl>
唯一的问题是内容的修改。标签不希望将值绑定到
选项卡项的头。
ContentPresenter的故事也一样

我尝试使用
RelativeSource
进行此操作,但不起作用:

<Label FontSize="20" Content="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}}, Path=Header}"/>

如果我理解正确,您非常接近了--您只想给它一个
ContentTemplate
,而不是在样式中设置
内容

<Style x:Key="MyCustomStyle" TargetType="{x:Type TabControl}">
    <Style.Resources>
        <Style TargetType="{x:Type TabItem}">
            <Setter Property="Padding" Value="10"/>
            <Setter Property="Width" Value="120"/>
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <StackPanel Margin="10">
                            <Label FontSize="20" Content="..."/>
                            <Separator/>
                            <ContentControl 
                                Content="{Binding}"
                                />
                        </StackPanel>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Style.Resources>
    <Setter Property="TabStripPlacement" Value="Left"/>
</Style>
以及新的XAML:

<Style x:Key="MyCustomStyle" TargetType="{x:Type TabControl}">
    <Style.Resources>
        <local:TabItemHeaderConverter x:Key="TabItemHeaderConverter" />

        <Style TargetType="{x:Type TabItem}">
            <Setter Property="Padding" Value="10"/>
            <Setter Property="Width" Value="120"/>
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <StackPanel Margin="10">
                            <Label 
                                FontSize="20" 
                                >
                                <Label.Content>
                                    <MultiBinding Converter="{StaticResource TabItemHeaderConverter}">
                                        <Binding RelativeSource="{RelativeSource AncestorType=TabControl}" />
                                        <Binding Path="." />
                                    </MultiBinding>
                                </Label.Content>
                            </Label>
                            <Separator />
                            <ContentControl 
                                Content="{Binding}"
                            />
                        </StackPanel>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Style.Resources>
    <Setter Property="TabStripPlacement" Value="Left"/>
</Style>

如果我理解正确,您非常接近了--您只想给它一个
ContentTemplate
,而不是在样式中设置
内容

<Style x:Key="MyCustomStyle" TargetType="{x:Type TabControl}">
    <Style.Resources>
        <Style TargetType="{x:Type TabItem}">
            <Setter Property="Padding" Value="10"/>
            <Setter Property="Width" Value="120"/>
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <StackPanel Margin="10">
                            <Label FontSize="20" Content="..."/>
                            <Separator/>
                            <ContentControl 
                                Content="{Binding}"
                                />
                        </StackPanel>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Style.Resources>
    <Setter Property="TabStripPlacement" Value="Left"/>
</Style>
以及新的XAML:

<Style x:Key="MyCustomStyle" TargetType="{x:Type TabControl}">
    <Style.Resources>
        <local:TabItemHeaderConverter x:Key="TabItemHeaderConverter" />

        <Style TargetType="{x:Type TabItem}">
            <Setter Property="Padding" Value="10"/>
            <Setter Property="Width" Value="120"/>
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <StackPanel Margin="10">
                            <Label 
                                FontSize="20" 
                                >
                                <Label.Content>
                                    <MultiBinding Converter="{StaticResource TabItemHeaderConverter}">
                                        <Binding RelativeSource="{RelativeSource AncestorType=TabControl}" />
                                        <Binding Path="." />
                                    </MultiBinding>
                                </Label.Content>
                            </Label>
                            <Separator />
                            <ContentControl 
                                Content="{Binding}"
                            />
                        </StackPanel>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Style.Resources>
    <Setter Property="TabStripPlacement" Value="Left"/>
</Style>


导致StackOverflowException。若将其删除,则可以启动应用程序。但这个标签仍然不起作用。哎呀,我错了,我应该改变它。这需要是
。对标签内容有什么想法吗?这很难,因为TabItem不在可视化树中。如果从该DataTemplate中的任何控件向上跟随VisualTreeHelper.GetParent(),则在不点击TabItem的情况下点击TabControl本身。@不过,我还是让它工作了。请参阅答案更新。
导致StackOverflowException。若将其删除,则可以启动应用程序。但这个标签仍然不起作用。哎呀,我错了,我应该改变它。这需要是
。对标签内容有什么想法吗?这很难,因为TabItem不在可视化树中。如果从该DataTemplate中的任何控件向上跟随VisualTreeHelper.GetParent(),则在不点击TabItem的情况下点击TabControl本身。@不过,我还是让它工作了。请参阅答案更新。