2011-05-16 74 views
4

我有一个带有多个TabItems的TabControl。在每个TabItem中都需要这个特定的UserControl。现在我创建控件的X实例,其中X是我拥有的TabItems的数量。所以这似乎是一个不好的方法来做到这一点。所以我想知道有没有办法让一个控件的实例,但它的多个位置。我知道每个控制只能有一个父母,所以看起来答案是否定的。WPF中控件的快捷方式

[TabItem1] 
[CommandLine Control] 
[Content unique to TabItem1] 

[TabItem2] 
[CommandLine Control] 
[Content unique to TabItem2] 

是否有可能有一个[CommandLine Control]的实例,但在这两个位置?

回答

2

控件真的或多或少是共享控件吗?我的意思是,如果你真的想把控件放在比1更多的位置,那么你最好将它托管在TabItem之外,这样它就可以从任何需要它的标签项中访问。

从你的例子看来,你可能是最好的产卵项目。就个人而言,我会将TabControls Items属性绑定到托管TabItem的ViewModel集合。其中每一个都会有一个UserControl的运行时创建实例(以及相关的ViewModel和内容)。

2

这听起来像你想要做的事可以通过使用模板来完成。

看看这个链接,一个TabItem的模板的一个例子:http://msdn.microsoft.com/en-us/library/ms752032.aspx

+0

那不是最终仍创造所有的控制?我假设(也许是错误的?)OP关心加载用户控件的许多实例的资源使用情况。 – Tim 2011-05-16 18:20:03

+0

@Tim我想,你会是对的。这仍然会为每个选项卡项目创建控件的新实例。不过,我认为这不应该是OP的问题。内存问题并不是真正的问题,因为当切换到新的TabItem时可以卸载控件。我同意你的回答,即OP可能会切换控制代码的位置,但可能会导致问题。我能想到的唯一的其他选择是使控件成为包含控件中的资源,并在每个tabItem中引用它(不确定思想)。 – JMcCarty 2011-05-16 18:26:56

+0

我不认为你可以将控件放入资源中,并将其加载到多个位置。我认为这给出了同样的错误,就好像你试图手动添加同一个控件给多个父母一样。可能是错误的。 – Tim 2011-05-16 18:32:01

0

有没有办法有一个“快捷方式”来了你描述我所知道的方式,因为你的用户控件只能有一位家长。

我能想到的唯一办法是当用户点击不同的选项卡时手动(通过代码隐藏)将其切换。但是当你转移它时可能导致的“口吃”(虽然WPF更好,我会想象比其他框架更好),但可能与通过拥有多个用户控件实例所看到的资源使用问题一样糟糕。

我想要做的另一件事是缓存用户控件的创建,以便只有当用户实际点击选项卡时才会加载它们。

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>