WPF中控件的快捷方式

4

我有一个TabControl,里面有多个TabItems。每个TabItem中都需要有这个特定的UserControl。现在我正在创建X个控件实例,其中X是我拥有的TabItems数目。所以这似乎是一种不好的方法。那么我想知道是否有一种方法可以只有一个控件实例,但可以在多个位置使用它。我知道每个控件只能有一个父级,所以答案似乎是否定的。

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

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

有没有可能在这两个位置只有一个[命令行控制]的实例?

5个回答

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>

4

2
控件是否真的更多或更少是共享控件?我的意思是,如果你真的想要一个控件出现在多个地方,那么最好将其托管到TabItem之外,以便可以从任何需要它的选项卡中访问它。
从你的示例中看来,最好还是生成项目。就个人而言,我会将TabControls Items属性绑定到ViewModel的集合,该集合托管TabItem。每个都有一个运行时创建的UserControl实例(带有关联的ViewModel和内容)。

2

这样做不还是会创建所有控件吗?我猜(也许是错误的?) OP 担心加载那么多用户控件会使用太多资源。 - Tim
@Tim 我想你是正确的。这将为每个选项卡项创建一个控件的新实例。但我认为这对OP不应该是一个问题。内存问题并不是真正的问题,因为在切换到新的TabItem时可以卸载控件。我同意您的答案,即OP可能可以通过代码后台切换控件位置,但这可能会引起问题。我能想到的唯一其他选择是将控件作为包含控件中的资源,并在每个tabItem中引用它(不确定)。 - JMcCarty
我不相信你可以将控件放入资源中,并在多个位置加载它。我认为这会导致与手动将同一控件添加到多个父级相同的错误。不过,可能我错了。 - Tim

0

据我所知,您描述的方式无法为其设置“快捷方式”,因为您的用户控件只能有一个父级。

我能想到的唯一解决方法是在用户单击不同选项卡时手动移动它(通过代码后台)。但是,当您移动它时可能会出现“卡顿”(我想在WPF中比其他框架更好),这可能与多个用户控件实例引起的任何资源使用问题一样糟糕。

我想另一种方法是缓存用户控件的创建,以便仅在用户实际点击选项卡时加载它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接