C# 列表框包含在ScrollViewer中
我希望在屏幕上无法显示所有信息时显示页面的ScrollViewer(即调整窗口大小) 但是,这里的列表框没有滚动条,除非我将其设置为MaxSize,否则它会一直显示到页面底部的草图。有没有一种方法可以让ListBox在我创建的滚动查看器之前优先显示它的滚动查看器 我现在有什么 我想要实现的,但是我使用了列表框的MaxHeight 以下是我的一些标记:C# 列表框包含在ScrollViewer中,c#,xaml,listbox,scrollviewer,C#,Xaml,Listbox,Scrollviewer,我希望在屏幕上无法显示所有信息时显示页面的ScrollViewer(即调整窗口大小) 但是,这里的列表框没有滚动条,除非我将其设置为MaxSize,否则它会一直显示到页面底部的草图。有没有一种方法可以让ListBox在我创建的滚动查看器之前优先显示它的滚动查看器 我现在有什么 我想要实现的,但是我使用了列表框的MaxHeight 以下是我的一些标记: <ScrollViewer HorizontalAlignment="Stretch" VerticalScrollBarVisibili
<ScrollViewer HorizontalAlignment="Stretch" VerticalScrollBarVisibility="Auto" Name="scrollViewer1" VerticalAlignment="Stretch" >
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<ComboBox Grid.Row="0" Width="120" HorizontalAlignment="Left"></ComboBox>
<ListBox HorizontalAlignment="Left" Name="listBox" Width="120" Grid.Row="1" <!--MaxHeight="500"--> />
</Grid>
</ScrollViewer>
/
试试这个
<ScrollViewer HorizontalAlignment="Stretch" VerticalScrollBarVisibility="Auto" Name="scrollViewer1" VerticalAlignment="Stretch" >
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<ComboBox Grid.Row="0" Width="120" HorizontalAlignment="Left" ></ComboBox>
<ListBox HorizontalAlignment="Left" Name="listBox" Width="120" VerticalAllignment = "Top" Grid.Row="1"/>
</Grid>
</ScrollViewer>
或者你也可以试试这个
<Grid >
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<ComboBox Grid.Row="0" Width="120" HorizontalAlignment="Left" ></ComboBox>
<ListBox HorizontalAlignment="Left" Name="listBox" VerticalAlignment= "Top" Width="120" Grid.Row="1" ScrollViewer.VerticalScrollBarVisibility="Auto"/>
</Grid>
试试这个
<ScrollViewer HorizontalAlignment="Stretch" VerticalScrollBarVisibility="Auto" Name="scrollViewer1" VerticalAlignment="Stretch" >
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<ComboBox Grid.Row="0" Width="120" HorizontalAlignment="Left" ></ComboBox>
<ListBox HorizontalAlignment="Left" Name="listBox" Width="120" VerticalAllignment = "Top" Grid.Row="1"/>
</Grid>
</ScrollViewer>
或者你也可以试试这个
<Grid >
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<ComboBox Grid.Row="0" Width="120" HorizontalAlignment="Left" ></ComboBox>
<ListBox HorizontalAlignment="Left" Name="listBox" VerticalAlignment= "Top" Width="120" Grid.Row="1" ScrollViewer.VerticalScrollBarVisibility="Auto"/>
</Grid>
不要在列表框上设置MaxHeight
,只需在行定义中使用星号“*”符号即可正确设置两个控件之间的相对大小。不要在列表框上设置MaxHeight
,只需在行定义中使用星号“*”符号,即可正确确定两个控件之间的相对大小。您的定义在逻辑上不一致
您提出的要求:“我希望当所有信息都无法在屏幕上显示时(不使用MaxHeight),页面的scrollviewer会显示出来。”-出现一个问题:“您如何确定‘所有信息都无法在屏幕上显示’?”或“在什么时候,列表框
应该停止增长并显示滚动条?”
从WPF\Silverlight布局管理逻辑来看,它完全满足您的要求-当列表框的高度加上组合框的高度之和大于滚动查看器的ViewportHeight
时,您会得到一个滚动条。只有当您允许ListBox
在不滚动的情况下增长到所需大小时,这才可能实现条形图。您的定义在逻辑上不一致
您提出的要求:“我希望当所有信息都无法在屏幕上显示时(不使用MaxHeight),页面的scrollviewer会显示出来。”-出现一个问题:“您如何确定‘所有信息都无法在屏幕上显示’?”或在什么时候,列表框
应该停止增长并显示滚动条?”
从WPF\Silverlight布局管理逻辑来看,它完全满足您的要求-当列表框的高度加上组合框的高度之和大于滚动查看器的ViewportHeight
时,您会得到一个滚动条。只有当您允许ListBox
在不滚动的情况下增长到所需大小时,这才可能实现酒吧。我知道这个问题很老了,但我也遇到了同样的问题,并想出了一些解决办法,但总比问题没有解决好
我读到的大部分内容都指出,在这种情况下,使用StackPanel之类的东西是不好的,因为面板会增长以适应它所容纳的元素。通常这很好,因为您可以将StackPanel粘贴到网格中,设置列/行的MinHeight和MaxHeight,并将控件锁定在适当的位置。一旦添加了ScrollView,就会出现这种情况见鬼去吧。上面的答案很好地描述了问题,但缺乏解决方案
我尝试了许多不同类型的面板而不是StackPanel,但它们都产生了相同的结果。我决定,由于我的ListBox位于网格内部,我需要将该网格位置的MaxHeight绑定到控件中的其他值,以防止ListBox增长。问题是没有可以绑定的元素直达并获得您想要的确切高度
进入黑客程序:
我的高度有点太大,创建了一个奇怪的总是在屏幕外的列表框(实际上,36像素太大,这是列表框上方标签的高度)。因此我实现了IValueConverter:
class HeightToAdjustedHeightConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var height = (double) value - 33d;
return height < 360d ? 360d : height;
//360 being the minimum height allowed for the listbox
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return null;
}
等级高度至调整重量转换器:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
变量高度=(双)值-33d;
返回高度<360d?360d:高度;
//360是列表框允许的最小高度
}
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
返回null;
}
}
在此之后,我所做的只是将其作为MaxHeight上绑定的转换器(注意,您需要命名您的usercontrol并绑定到它的x:name):
我唯一能想到的另一个选择是扩展其中一个面板,并尝试利用其增长行为。我承认这是一个黑客行为,但它会起作用。我知道这个问题很老,但我也遇到了完全相同的问题,并提出了一点黑客行为作为解决方案,但总比没有解决问题好
我读到的大部分内容都指出,在这种情况下,使用StackPanel之类的东西是不好的,因为面板会增长以适应它所容纳的元素。通常这很好,因为您可以将StackPanel粘贴到网格中,设置列/行的MinHeight和MaxHeight,并将控件锁定在适当的位置。一旦添加了ScrollView,就会出现这种情况见鬼去吧。上面的答案很好地描述了问题,但缺乏解决方案
我尝试了许多不同类型的面板而不是StackPanel,但它们都产生了相同的结果