gpt4 book ai didi

c# - 从 WPF 中删除额外的垂直空格

转载 作者:行者123 更新时间:2023-11-30 22:36:28 25 4
gpt4 key购买 nike

    <Border CornerRadius="2,2,2,2" BorderThickness="1" BorderBrush="LightSkyBlue" Margin="5,2,2,2" x:Name="PersonBorder" Visibility="Collapsed">
<StackPanel Orientation="Vertical">

<ListBox Name="personListBoxTest"
BorderThickness="0"
ScrollViewer.HorizontalScrollBarVisibility="Hidden"
ScrollViewer.VerticalScrollBarVisibility="Auto"
HorizontalContentAlignment="Stretch"
Background="LemonChiffon"
>
<ListBox.ItemTemplate >
<DataTemplate>
<StackPanel>
<StackPanel Orientation="Horizontal" Background="Pink">
<StackPanel Orientation="Horizontal" Visibility="{Binding ElementName=Involvement, Path=Text, Converter={StaticResource cIsVisibleOrCollapsed}}" Margin="0,0,5,0">
<TextBlock Text="Involvement:"/>
<TextBlock Margin="5,0,0,0" Text="{Binding Path=NameInvolvementType}" Foreground="Blue" x:Name="Involvement"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Name:"/>
<TextBlock Margin="3,0,0,0" Text="{Binding Path=FirstName}" Foreground="Blue" />
<TextBlock Margin="3,0,0,0" Text="{Binding Path=MiddleName}" Foreground="Blue" />
<TextBlock Margin="3,0,0,0" Text="{Binding Path=LastName}" Foreground="Blue" />
<TextBlock Margin="3,0,0,0" Text="{Binding Path=NameSuffix}" Foreground="Blue" />
<TextBlock Margin="5,0,0,0" Text="DOB:"/>
<TextBlock Margin="3,0,0,0" Text="{Binding Path=BirthDate, StringFormat=MM/dd/yyyy}" Foreground="Blue" />
</StackPanel>
</StackPanel>
<StackPanel Visibility="{Binding ElementName=myEventAddress,Path=Visibility, Converter={StaticResource cVisibilityMirror}}" Orientation="Horizontal" >
<TextBlock Text="Address:" />
<EventDet:EventAddress Margin="5,0,0,0" x:Name="myEventAddress" Foreground="Blue" CityTextBlockOrientation="Horizontal" />
</StackPanel>

<StackPanel Visibility="{Binding ElementName=Phone1, Path=Text, Converter={StaticResource cIsVisibleOrCollapsed}}" Orientation="Horizontal">
<TextBlock Text="Home:" />
<TextBlock Margin="5,0,0,0" Text="{Binding Path=Phone1}" Foreground="Blue" x:Name="Phone1"/>
</StackPanel>
<StackPanel Visibility="{Binding ElementName=Phone2, Path=Text, Converter={StaticResource cIsVisibleOrCollapsed}}" Orientation="Horizontal">
<TextBlock Text="Mobile:" />
<TextBlock Margin="5,0,0,0" Text="{Binding Path=Phone2}" Foreground="Blue" x:Name="Phone2"/>
</StackPanel>
<StackPanel Visibility="{Binding ElementName=Phone3, Path=Text, Converter={StaticResource cIsVisibleOrCollapsed}}" Orientation="Horizontal">
<TextBlock Text="Work:" />
<TextBlock Margin="5,0,0,0" Text="{Binding Path=Phone3}" Foreground="Blue" x:Name="Phone3"/>
</StackPanel>


<StackPanel x:Name="PersonAlertSP" Visibility="Collapsed" Background="WhiteSmoke">
<TextBlock Text="Alerts:" />
<ListBox ItemsSource="{Binding Path=PersonAlertList}" x:Name="PersonAlertListBox" BorderThickness="1" >
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=AlertType}" Margin="0,0,5,0" Foreground="Blue" Width="150"/>
<TextBlock Text="{Binding Path=Description}" Margin="0,0,5,0" Foreground="Blue"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>


</StackPanel>

</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

</StackPanel>
</Border>

代码隐藏:

//this is a little unweidly, but its test code until this works
MobileWPF.singleton.EventDetailsTabControl.myEventDetailControl.personListBoxTest.ItemsSource =
dc.SessionEvent.SessionPersons.ToList();

下面是6项结果的图片,所有数据都是废话测试数据:

screenshot

编辑 2:

在尝试了一下之后,我想这就是正在发生的事情......首先,ListBox 是贪婪的,占用了最大量的垂直空间,然后完成了一些 IValueConverter 计算,并折叠了一些元素。但是,一旦完成,ListBox 高度就不会更新。

编辑 3:

我尝试将 PersonListBoxTest 转换为 ItemsControl,而不是 ListBox,唯一的区别在于代码和 <ItemsControl.ItemTemplate >声明...现在它按预期工作,没有额外的空格。

所以 ItemsControl 以某种方式尊重我的一些元素通过 IValueConverters 折叠的事实,而 ListBox 没有。在测试 ItemsControl 之前,我尝试了 ListBox 中的 VirtualizingStackPanel 属性,将 IsVirtualizing 设置为 true 和 false(无变化)。

我会把这些要点提供给任何可以解释为什么我观察到它起作用的人。
感谢大家的回答,你永远不知道什么会有所作为。

这是一个正在使用的IValueConverter的例子,它们都差不多。

[ValueConversion(typeof(object), typeof(System.Windows.Visibility))]
public class NullToVisibleOrCollapsed : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null) return System.Windows.Visibility.Collapsed;

if (value is Image)
{
if (((Image)value).Source == null) return System.Windows.Visibility.Collapsed;
return System.Windows.Visibility.Visible;
}

if (value is string)
{
string myString = (string)value;
if (string.IsNullOrEmpty(myString) == true)
return System.Windows.Visibility.Collapsed;
}

if (value is int)
{
int myInt = (int)value;
if (myInt == 0)
return System.Windows.Visibility.Collapsed;
}

return System.Windows.Visibility.Visible;
}

最佳答案

发生这种情况的原因是因为 ListBox 覆盖了默认的 ItemsPanelTemplate 设置以使用 VirtualizingStackPanel。这样做是因为 VirtualizingStackPanel 支持 UI 虚拟化,这意味着仅评估和创建可见控件,这可以提高大型数据集的性能。

在 UI 虚拟化期间,控件检查子元素的可见性,然后测量它及其后代。这种评估顺序是您看到额外空间的关键原因。您正在使用子元素的绑定(bind)值来设置父元素的可见性。

<StackPanel 
...
Visibility="{Binding
ElementName=Phone1,
Path=Text,
Converter={StaticResource cIsVisibleOrCollapsed}}">
<TextBlock
x:Name="Phone1"
Text="{Binding Path=Phone1}" />
</StackPanel>

当框架评估您的 StackPanel 时,Visibility 尚未设置,因此它默认为 Visible。如果您将可见性绑定(bind)改为使用与子属性相同的绑定(bind)路径,则可以解决此问题。

<StackPanel 
...
Visibility="{Binding Phone1,
Converter={StaticResource cIsVisibleOrCollapsed}}">
<TextBlock
x:Name="Phone1"
Text="{Binding Path=Phone1}" />
</StackPanel>

您还可以指定 CollapsedFallbackValue,它告诉引擎在无法解析绑定(bind)时使用 Visibility.Collapsed。但是,我对此持谨慎态度,因为这似乎会搞砸 UI 测量,这可能会产生其他不良影响。

最后,普通的ItemsControl模板不需要预量,因为它不支持UI虚拟化。换句话说,控件被生成然后被隐藏,并且相应地调整大小。

关于c# - 从 WPF 中删除额外的垂直空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7012872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com