XAML 获取使用模板wpf生成的TabItems

axzmvihb  于 2023-08-01  发布在  其他
关注(0)|答案(2)|浏览(111)

我想创建一个可变数量的选项卡,然后通过代码填充它们。此XAML代码基于集合Channels正确生成选项卡,该集合包含只有Name属性的匿名对象:

<ItemsControl      
                Name="ChannelTabs"
                ItemsSource="{Binding Path=Channels}"
                >

            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <UniformGrid Name="Channels" 
                            HorizontalAlignment="Stretch" 
                            Width="auto"
                                     Columns="2"
                            />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>

            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <DataTemplate.Resources>
                        <Style TargetType="TextBlock">
                            <Setter Property="FontSize" Value="18"/>
                            <Setter Property="HorizontalAlignment" 
                                    Value="Center"/>
                        </Style>
                    </DataTemplate.Resources>

                    <TabItem 
                            Header="{Binding Path=Name}"
                            Tag="{Binding Path=Name}"
                            VerticalAlignment="Top" 
                            HorizontalAlignment="Stretch" 
                            MinWidth="60"
                            Width="auto"
                            Margin="5,5,5,5"
                            Grid.Row="1" Grid.Column="1"
                     >
                        <WrapPanel />
                    </TabItem>


                </DataTemplate>
            </ItemsControl.ItemTemplate>

        </ItemsControl>

字符串
但是,现在我需要填充这些选项卡,因此需要按Name查找它们。我尝试这样做是为了找到Tag等于字符串ch_name的TabItem:

TabItem tab = (Panel)ChannelTabs.Items.Items.Cast<TabItem>().First(ti => (string)ti.Tag == ch_name);


...但我得到一个错误,因为我不能将匿名对象强制转换为TabItem。显然,Items属性并不像我预期的那样包含TabItem对象,而是包含匿名对象。换句话说,它包含与ItemsSource相同的内容。
如何访问从ItemsSource集合创建的实际TabItems,而不是ItemsSource本身?

dnph8jn4

dnph8jn41#

可以通过ItemsControl的项容器元素轻松访问TabItem。
item容器是一个ContentPresenter,可以通过ItemContainerGenerator及其ContainerFromItemContainerFromIndex方法使用:

var item = Channels[0]; // for example
var container = (ContentPresenter)ChannelTabs.ItemContainerGenerator.ContainerFromItem(item);

字符串
TabItem是容器的第一个子级:

var tabItem = (TabItem)VisualTreeHelper.GetChild(container, 0);

vhmi4jdf

vhmi4jdf2#

要获取选项卡项目,您需要访问TabPanel,它是选项卡项目的容器。
要访问TabPanel,您应该处理Loaded事件,并将对象添加到一个变量中,以便稍后引用。在你的tab控件中添加下面的setter

<TabControl.Resources>
    <Style TargetType="{x:Type TabPanel}">
        <EventSetter Event="Loaded" Handler="TabPanel_Loaded"/>
    </Style>
</TabControl.Resources>

字符串
并在事件处理程序中将其添加到变量

TabPanel tabPanel;

private void TabPanel_Loaded(object sender, RoutedEventArgs e)
{
    tabPanel = sender as TabPanel;
}


在你的函数中你想得到选项卡项

TabItem tab = tabPanel.Children.OfType<TabItem>().First(ti => (string)ti.Tag == ch_name);

相关问题