我有一组ViewModel,我绑定到TabControl的ItemsSource属性.让我们调用那些ViewModels AViewModel,BViewModel和CViewModel.其中每个都需要有不同的ItemTemplate(对于标题;因为它们每个都需要显示不同的图标)和不同的ContentTemplate(因为它们具有非常不同的交互模型).
我想要的是这样的:
在某处的Resource.xaml文件中定义:
<DataTemplate x:Key="ItemTemplate" DataType="{x:Type AViewModel}">
...
</DataTemplate>
<DataTemplate x:Key="ItemTemplate" DataType="{x:Type BViewModel}">
...
</DataTemplate>
<DataTemplate x:Key="ItemTemplate" DataType="{x:Type CViewModel}">
...
</DataTemplate>
<DataTemplate x:Key="ContentTemplate" DataType="{x:Type AViewModel}">
...
</DataTemplate>
<DataTemplate x:Key="ContentTemplate" DataType="{x:Type BViewModel}">
...
</DataTemplate>
<DataTemplate x:Key="ContentTemplate" DataType="{x:Type CViewModel}">
...
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
单独定义:
<TabControl ItemTemplate="[ Some way to select "ItemTemplate" based on the type ]"
ContentTemplate="[ Some way to select "ContentTemplate" based on the type ]"/>
Run Code Online (Sandbox Code Playgroud)
现在,我真实地知道,每次我使用相同的键定义DataTemplate时,系统就会抱怨.但是,有什么我可以做的类似于这将允许我将DataTemplate放入基于名称和数据类型的TabControl?
我想要的是一个控件,其功能就像选项卡控件一样,但不是在顶部有选项卡,项目将显示在侧面的列表框中.我想这是可能的,但没有找到任何例子,我希望有人在这里做了类似的事情.
我正在尝试使TabControl根据其外部空间(它在StackPanel中)自动调整大小:
<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Height="100">
<Grid>
<StackPanel>
<TabControl
BorderBrush="Red"
BorderThickness="2"
VerticalAlignment="Stretch"
VerticalContentAlignment="Stretch">
<TabItem Header="Tab1"/>
<TabItem Header="Tab2"/>
</TabControl>
</StackPanel>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
上面的代码片段生成以下窗口,同时我希望红色边框到达窗口的底部:

这是关于WPF TabControl,TabItem和TabPanel的新手问题.在StackOVF上有一个相关的问题,我在我的应用程序中愉快地使用了答案.这是答案的链接,以及代码片段:
WPF:TabControl中的Center TabItems
<TabControl>
<TabControl.Resources>
<Style TargetType="{x:Type TabPanel}">
<Setter Property="HorizontalAlignment" Value="Center" />
</Style>
</TabControl.Resources>
<TabItem Header="Test 1" />
<TabItem Header="Test 2" />
<TabItem Header="Test 3" />
<TabItem Header="Test 4" />
</TabControl>
Run Code Online (Sandbox Code Playgroud)
虽然这很棒,但我很乐意将资源和样式的东西移到更好的位置(样式表等).我的第一次尝试是将<TabControl.Resources>标签移动到,<Window.Resources>但这不起作用.我尝试了几种变化但无法使其工作.这是我有点期望尝试的一个例子:
<!-- Doesn't work as expected: -->
<Window.Resources>
<Style TargetType="{x:Type TabPanel}">
<Setter Property="HorizontalAlignment" Value="Center" />
</Style>
</Window.Resources>
Run Code Online (Sandbox Code Playgroud)
搜索网络和msdn并没有帮助我解决我的问题,而是给我留下了第二个(相关的)问题:实际上是一个TabPanel,它与TabControl有什么关系?
任何帮助和提示将不胜感激.
(编辑:在最后一个例子中评论说代码对我不起作用.)
嗨我的用户控件放在选项卡中每次更改选项卡时都会被卸载和加载.它会在应用程序中创建一些不必要的延迟.我正在寻找一些方法来修复这种行为.我知道我必须继承tabcontrol来改变这种行为但是如何..?
当水平尺寸太小时,WPF TabControl及其默认TabPanel将选项卡项排列为多行.然后,选项卡选择会更改这些行的顺序,因此选定的选项卡项始终位于第一行.
我发现了一些关于如何将TabPanel替换为另一个项控件的文章,因此他们获得滚动选项卡而不是多线行为.
我想保留多行(不滚动),但禁用行的重新排列.创建选项卡后,无论选择如何更改,它们都应保持原位.这可能吗?
在使用.Net 2.0的WinForms C#中,我想将TabControl添加到具有现有控件的Form中.有没有办法将所有控件移动到选项卡控件中,而Visual Studio不会吹掉我所有的事件处理程序?使用Visual Studio 2005.
我有一个WPF选项卡控件.但我想更改标签项样式.默认样式为方形.我需要把它变成雪佛龙列表.每个块都是六边形.
编辑:

出于某种原因,我TabControl很难在绑定ItemsSource到ObservableCollection视图模型时让我正确显示.我的设计基于这里的教程:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx.我确实在这里发现了一些像我这样的问题,但没有一个问题解决了我 这是我TabControl的xaml.
<TabControl ItemsSource="{Binding Workspaces}"
SelectedIndex="{Binding ActiveWorkspaceIndex}"
ItemTemplate="{StaticResource ClosableTabItemTemplate}"/>
Run Code Online (Sandbox Code Playgroud)
ClosableTabItemTemplate以下是哪里.
<DataTemplate x:Key="ClosableTabItemTemplate">
<DockPanel Width="120">
<Button
Command="{Binding Path=CloseCommand}"
Content="X"
Cursor="Hand"
DockPanel.Dock="Right"
Focusable="False"
FontFamily="Courier"
FontSize="9"
FontWeight="Bold"
Margin="0,1,0,0"
Padding="0"
VerticalContentAlignment="Bottom"
Width="16" Height="16"
/>
<ContentPresenter
Content="{Binding Path=DisplayName}"
VerticalAlignment="Center"
/>
</DockPanel>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
Workspaces是ObservableCollection视图模型.ActiveWorkspaceIndex只是我在视图模型中跟踪的活动工作区索引.我通过App.xaml文件中的以下数据模板将我的视图模型与视图实例相关联.
<DataTemplate DataType="{x:Type vm:ViewModelStartPage}">
<v:ViewStartPage/>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
我只在我的工作空间集合中添加了一个视图模型.我看到选项卡控件中显示了2个视图,它们没有标签.这几乎就像TabControl不知道将不同的视图视为TabItems,它的行为更像堆栈面板,堆叠视图.如果我在代码中创建选项卡项,它可以正常工作:
System.Windows.Controls.TabItem i = new System.Windows.Controls.TabItem();
i.Content = new Views.ViewStartPage();
i.Header = "A Tab Item";
this.xTabControl.Items.Add(i);
Run Code Online (Sandbox Code Playgroud)
我必须遗漏一些内容模板或其他东西.我将在稍后设置我的标签样式,但是现在我很乐意让基本标签工作.标签内容中的视图对于每个选项卡也可能不同,所以我不能使用我看到的所有地方的简单文本块TabControl模板示例...即使不是这样......
<TabControl.ContentTemplate>
<DataTemplate> …Run Code Online (Sandbox Code Playgroud) 所以,我希望我的标签中的标签项水平居中.我还想更改选项卡背后的背景.我找到了这两件事的答案:
我遇到的问题是它们都是单独工作的,但是当它们结合起来时,它们就无法工作.tabItems中心很好,但背景颜色不是我指定的颜色.
例如代码:
<TabControl>
<TabControl.Resources>
<Style TargetType="{x:Type TabPanel}">
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="Background" Value="Red" />
</Style>
</TabControl.Resources>
<TabItem Header="Test 1" />
<TabItem Header="Test 2" />
<TabItem Header="Test 3" />
<TabItem Header="Test 4" />
</TabControl>
Run Code Online (Sandbox Code Playgroud)
救命?
tabcontrol ×10
wpf ×9
c# ×2
xaml ×2
.net-2.0 ×1
binding ×1
datatemplate ×1
layout ×1
tabpanel ×1
winforms ×1
wpf-controls ×1