首页 文章

TabControl中的WPF UI持久性

提问于
浏览
4

我遇到的问题似乎应该非常简单,但实际上已经证明非常困难 .

假设您有一个TabControl绑定到ViewModel的itemsource和使用DataTemplate显示的项目 . 现在假设DataTemplate包含一个带有两列的网格和一个用于调整列大小的网格分割器 .

问题是如果您在一个选项卡上调整列的大小,并切换到另一个选项卡,列也会调整大小 . 这是因为TabControl在所有选项卡中共享DataTemplate . UI持久性的缺乏应用于模板的所有元素,这可以在调整各种UI组件时产生令人沮丧的体验 . 另一个例子是DataGrid中的滚动位置(在选项卡上) . 如果具有更多行的DataGrid在另一个选项卡上滚动到底部,则具有少量项目的DataGrid将滚出视图(仅一行可见) . 除此之外,如果TabControl在多个DataTemplates中定义了各种项目,则在不同类型的项目之间切换时将重置视图 . 我可以理解这种方法可以节省资源,但最终的功能似乎与预期的UI行为相矛盾 .

所以我想知道是否有解决方案/解决方法,因为我确信这是其他人以前遇到的事情 . 我在其他论坛上发现了一些类似的问题,但没有真正的解决方案 . 一个关于使用AdornerDecorator但是当与DataTemplate一起使用时似乎不起作用 . 我并不热衷于将所有UI属性(如列宽,滚动位置)绑定到我的ViewModel,事实上我尝试将其用于简单的GridSplitter示例,但我没有设法让它工作 . ColumnDefinitions的宽度不一定受网格分割器的影响 . 无论如何,如果有一个通用的解决方案,这将是很好的 . 有什么想法吗?

如果我抛弃TabControl并使用ItemsControl我会遇到类似的问题吗?是否可以修改TabControl样式,以便它不在选项卡之间共享ContentPresenter?

1 回答

  • 1

    我现在已经打了很长一段时间一直搞乱这个 . 最后,我没有尝试修复/修改TabControl,而是简单地重新创建了它的功能 . 它确实很好用 . 我从Listbox(Tab Headers )和ItemsControl中创建了一个Tab'like'Control . 关键是将ItemsControl的ItemsPanelTemplate设置为Grid . 一点样式,以及一个DataTrigger来管理项目的可见性和瞧 . 它工作得很完美,每个“Tab”都是一个独特的对象,并保留其所有的UI状态,如滚动位置,选择,列宽等 . 此类解决方案可能出现任何缺点或问题?

    <DockPanel>
                <ListBox
                    DockPanel.Dock="Top"
                    ItemsSource="{Binding Tabs}"
                    SelectedItem="{Binding SelectedTab}"
                    ItemContainerStyle="{StaticResource ImitateTabControlStyle}">
                    <ListBox.ItemsPanel>
                        <ItemsPanelTemplate>
                            <StackPanel
                                Orientation="Horizontal">
                            </StackPanel>
                        </ItemsPanelTemplate>
                    </ListBox.ItemsPanel>
    
                    <ListBox.ItemTemplate>
                        <DataTemplate>                            
                            <StackPanel 
                                Margin="2,2,2,0"
                                Orientation="Horizontal" >
                                <TextBlock 
                                    Margin="4,0" FontWeight="Bold"
                                    Padding="2"
                                    VerticalAlignment="Center" HorizontalAlignment="Left"
                                    Text="{Binding Name}" >
                                </TextBlock>
                                <Button
                                    Margin="4,0"
                                    Command="{Binding CloseCommand}">
                                    <Image Source="/TERM;component/Images/Symbol-Delete.png" MaxHeight="20"/>
                                </Button>
                            </StackPanel>                            
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
                <ItemsControl    
                    ItemsSource="{Binding Tabs}">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <Grid />
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <ContentControl                                
                                Content="{Binding}">
                                <ContentControl.Style>
                                    <Style>
                                        <Style.Triggers>
                                            <DataTrigger
                                                Binding="{Binding IsSelected}" Value="False">
                                                <Setter Property="ContentControl.Visibility" Value="Hidden" />                                                
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </ContentControl.Style>
                            </ContentControl>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>                
            </DockPanel>
    

相关问题