我有一个带有多个TabItem的TabControl。在每个TabItem中都需要有这个特定的UserControl。现在我正在创建控件的X实例,其中X是我拥有的TabItems的数量。所以这似乎是一种糟糕的方式。所以我想知道有没有办法让一个控件实例,但它有多个位置。我知道每个控件只能有一个父级,所以看起来答案是否定的。
[TabItem1]
[CommandLine Control]
[Content unique to TabItem1]
[TabItem2]
[CommandLine Control]
[Content unique to TabItem2]
是否可以在这两个位置拥有[CommandLine Control]
的一个实例?
答案 0 :(得分:4)
您可以使用触发器来实现此目的,这些触发器可确保控件不会同时位于两个位置,例如。
<TabControl>
<TabControl.Resources>
<!-- Define control which is to be reused in resources -->
<TextBox x:Key="SharedTB" Text="test"/>
<!-- This style gets the shared control only if the parent
TabItem is selected -->
<Style x:Key="LoadTBStyle" TargetType="{x:Type ContentControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=TabItem}, Path=IsSelected}"
Value="True">
<Setter Property="Content" Value="{StaticResource SharedTB}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TabControl.Resources>
<TabItem Header="TabItem 1">
<StackPanel>
<TextBlock Text="Lorem Ipsum"/>
<ContentControl Style="{StaticResource LoadTBStyle}"/>
</StackPanel>
</TabItem>
<TabItem Header="TabItem 2">
<StackPanel>
<TextBlock Text="Dolor Sit"/>
<ContentControl Style="{StaticResource LoadTBStyle}"/>
</StackPanel>
</TabItem>
</TabControl>
答案 1 :(得分:4)
如果您使用数据模板作为控件并将选项卡控件数据绑定到集合,那么框架将只创建一个控件实例,并在更改选项卡项时交换其数据上下文。
您可以在此处找到更详细的讨论:Why do tab controls reuse View instances when changing tab
答案 2 :(得分:2)
控件真的或多或少是共享控件吗?我的意思是,如果你真的想让一个控件放在比1更多的位置,那么你最好在TabItem之外托管它,这样就可以从任何需要它的标签项中访问它。
从您的示例中看,您可能最好产生这些项目。就个人而言,我将TabControls Items属性绑定到托管TabItem的ViewModel集合。其中每个都有一个运行时创建的UserControl实例(具有关联的ViewModel和内容)。
答案 3 :(得分:2)
听起来你正在做的事情可以通过使用模板来完成。
请查看此链接以获取tabitem模板的示例:http://msdn.microsoft.com/en-us/library/ms752032.aspx
答案 4 :(得分:0)
没有办法像你所描述的那样有一个“快捷方式”,因为你的用户控件只能有一个父级。
我唯一能想到的就是当用户点击其他标签时手动切换(通过代码隐藏)。但是,当你转移它时可能导致的“口吃”(虽然在WPF中比我在其他框架中更好)但可能与你通过拥有多个用户控件实例看到的资源使用问题一样糟糕
我想另外要做的事情就是缓存用户控件的创建,这样只有当用户实际点击选项卡时才会加载它们。