繁体   English   中英

TabControl中的WPF UI持久性

[英]WPF UI persistence in TabControl

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

假设您有一个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?

我现在已经打了很长一段时间一直搞乱这个。 最后,我没有尝试修复/修改TabControl,而是简单地重新创建了它的功能。 它确实很好用。 我从Listbox(Tab标题)和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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM