wpf – 当存在基于触发器隐藏显示元素的复杂数据模板时,我的ListView或ListBox控件大小不会缩小?

wpf – 当存在基于触发器隐藏显示元素的复杂数据模板时,我的ListView或ListBox控件大小不会缩小?,第1张

概述我有一个ListView元素,每个ListViewItem都有一个DataTemplate定义如下.运行时,ListView的高度不会折叠到视图中的项目上,这是不合需要的行为: <DataTemplate x:Key="LicenseItemTemplate"> <Grid> <Grid.RowDefinitions> <RowDefinition 我有一个ListVIEw元素,每个ListVIEwItem都有一个DataTemplate定义如下.运行时,ListVIEw的高度不会折叠到视图中的项目上,这是不合需要的行为:

<DataTemplate x:Key="licenseItemTemplate">    <GrID>        <GrID.RowDeFinitions>            <RowDeFinition Height="auto"  />            <RowDeFinition Height="auto" />        </GrID.RowDeFinitions>        <TextBlock GrID.Row="0" Text="{Binding company}"></TextBlock>        <GrID GrID.Row="1" Style="{StaticResource HIDdenWhenNotSelectedStyle}">            <GrID.RowDeFinitions>                <RowDeFinition />            </GrID.RowDeFinitions>            <button GrID.Row="0">ClickIt</button>        </GrID>    </GrID></DataTemplate>

外部网格的第二行应用了一个样式,如下所示.样式的目的是公开所选数据项的详细视图:

<Style targettype="{x:Type GrID}" x:Key="HIDdenWhenNotSelectedStyle" >    <Style.Triggers>        <DataTrigger            Binding="{Binding Path=IsSelected,relativeSource={                        relativeSource                         Mode=FindAncestor,AncestorType={x:Type ListVIEwItem}                        }                        }"             Value="False">            <Setter Property="GrID.Visibility" Value="Collapsed" />        </DataTrigger>        <DataTrigger            Binding="{Binding Path=IsSelected,AncestorType={x:Type ListVIEwItem}                        }                        }"             Value="True">            <Setter                Property="GrID.Visibility"                Value="Visible"            />        </DataTrigger>    </Style.Triggers></Style>

ListVIEw呈现如下:

当没有选择任何元素时,所需的外观是这样的:

…当然,当通过选择使第二个网格可见时,ListVIEw的高度调整以适应附加内容.我该怎么做才能获得理想的行为?

解决方法 在TechEd讨论WPF人员的问题时,我向微软员工展示了这个问题.他不知所措.

我们下载了一个查询WPF布局的工具,并将该容器标识为ListVIEw中的“Virtualizing Stack Panel”元素.

在后续电子邮件中,他写道:“这是VirtualizingStackPanel的错误.我已经开了一个关于它的错误.希望它可以在将来的版本中修复.解决方法(使用StackPanel)现在应该没问题,只要您不需要ListVIEw来虚拟化其内容.

该错误涉及VSP测量算法中的一个步骤,该算法记住发现的最大尺寸,并强制所有未来的测量调用报告大小至少一样大.在您的情况下,VSP最初是在触发任何触发器之前测量的,因此它会计算大小,就像所有内容都可见一样.当触发器触发并折叠按钮时,度量算法会计算正确的(小)大小,但会强制结果再次变大.评论说明了在滚动时避免不必要的重新布局,但即使没有滚动,代码仍在运行.“

解决方法涉及使用以下代码重新模板化ListVIEw:

<ListVIEw.ItemsPanel>  <ItemsPanelTemplate>    <StackPanel/>  </ItemsPanelTemplate></ListVIEw.ItemsPanel>

这导致列表行为按预期工作,但它具有不具备VirtualizingStackPanel的内存管理功能的缺点.对我来说,这是合适的;列表项目一次不会超过2000左右.

总结

以上是内存溢出为你收集整理的wpf – 当存在基于触发器隐藏显示元素的复杂数据模板时,我的ListView或ListBox控件大小不会缩小?全部内容,希望文章能够帮你解决wpf – 当存在基于触发器隐藏显示元素的复杂数据模板时,我的ListView或ListBox控件大小不会缩小?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1078951.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-27
下一篇2022-05-27

发表评论

登录后才能评论

评论列表(0条)

    保存