C# 列表框包含在ScrollViewer中

C# 列表框包含在ScrollViewer中,c#,xaml,listbox,scrollviewer,C#,Xaml,Listbox,Scrollviewer,我希望在屏幕上无法显示所有信息时显示页面的ScrollViewer(即调整窗口大小) 但是,这里的列表框没有滚动条,除非我将其设置为MaxSize,否则它会一直显示到页面底部的草图。有没有一种方法可以让ListBox在我创建的滚动查看器之前优先显示它的滚动查看器 我现在有什么 我想要实现的,但是我使用了列表框的MaxHeight 以下是我的一些标记: <ScrollViewer HorizontalAlignment="Stretch" VerticalScrollBarVisibili

我希望在屏幕上无法显示所有信息时显示页面的ScrollViewer(即调整窗口大小) 但是,这里的列表框没有滚动条,除非我将其设置为MaxSize,否则它会一直显示到页面底部的草图。有没有一种方法可以让ListBox在我创建的滚动查看器之前优先显示它的滚动查看器

我现在有什么

我想要实现的,但是我使用了列表框的MaxHeight

以下是我的一些标记:

<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,但它们都产生了相同的结果