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本身。@不过,我还是让它工作了。请参阅答案更新。