gpt4 book ai didi

c# - 为什么选项卡标题显示在 XAML TabControl 中选项卡的内容区域中?

转载 作者:行者123 更新时间:2023-11-30 15:49:43 25 4
gpt4 key购买 nike

我有一个 TabControl,它的 ItemsSource 绑定(bind)到一个可观察的 View 集合 (UserControls),每个 View 的根元素都是一个 TabItem .但是,当它显示时,Header 文本在每个 TabItem 的内容中,就好像 UserControl 包装器引起了冲突:

alt text

TabControl 在 SmartFormView.xaml 中:

<UserControl x:Class="TestApp.Views.SmartFormView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel
Margin="10">
<TextBlock Text="{Binding Title}"
FontSize="18"/>
<TextBlock Text="{Binding Description}"
FontSize="12"/>

<TabControl
Margin="0 10 0 0"
ItemsSource="{Binding SmartFormAreaViews}"/>
</StackPanel>
</UserControl>

我必须更改什么才能使 TabItem 在 TabControl 中显示为 TabItems?

下面是名为 SmartFormAreaView.xaml 的 TabItem View :

<UserControl x:Class="TestApp.Views.SmartFormAreaView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<TabItem Header="This is the header">
<StackPanel Margin="10">
<TextBlock Text="this is the content"/>
</StackPanel>
</TabItem>
</UserControl>

这里是我创建每个 View 并将其加载到 ObservableCollection 的地方:

var areas = from area in xmlDoc.Descendants("area")
select area;
foreach (var area in areas)
{
SmartFormArea smartFormArea = new SmartFormArea();
smartFormArea.IdCode = area.Attribute("idCode").Value;
smartFormArea.Title = area.Attribute("title").Value;
SmartFormAreaPresenter smartFormAreaPresenter = new SmartFormAreaPresenter(smartFormArea);
SmartFormAreaViews.Add(smartFormAreaPresenter.View as SmartFormAreaView);
}

最佳答案

对于任何 ItemsControl,如果添加到其 Items 集合(直接或通过 ItemsSource)的项目不是该控件的项目容器的实例,则每个项目都包装在项目容器的实例中。项目容器是一个类,例如 TabItem 或 ListBoxItem。项目容器通常是 ContentControl 或 HeaderedContentControl,您的实际项目分配给其 Content 属性,因此您可以使用模板等来控制内容的呈现方式。您还可以使用 ItemControl 的 ItemContainerStyle 属性设置项目容器本身的样式。

在这种特殊情况下,您应该将 ItemsSource 绑定(bind)到 SmartFormAreaPresenters 列表。然后对选项卡控件使用类似这样的东西:

<TabControl ItemsSource="{Binding SmartFormAreaPresenters}">
<TabControl.ItemContainerStyle>
<Style TargetType="{x:Type TabItem}">
<Setter Property="Header" Value="{Binding HeaderText}" />
</Style>
</TabControl.ItemContainerStyle>

<TabControl.ContentTemplate>
<DataTemplate DataType="{x:Type local:SmartFormAreaPresenter}">
<local:SmartFormAreaView />
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>

其中 HeaderText 是 SmartFormAreaPresenter 上的合适属性。您还应该从 SmartFormAreaView 定义中删除 TabItem。每个 View 的 DataContext 将自动设置为适当的 Presenter。

参见 WPF 博士的 blog对各种 ItemsControl 相关主题的精彩讨论。

关于c# - 为什么选项卡标题显示在 XAML TabControl 中选项卡的内容区域中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1226622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com