c#-WPF列表框超出屏幕尺寸(MVVM浅)

我有一个典型的MVVM结构.一个主窗口由一些标签和一个视图模型(绑定为ContentControl)组成.这个视图模型有一个列表框,我可以在其中添加条目.随着列表的增加,我的视图模型的高度也随之增加,因此整个应用程序的高度也随之增加.不幸的是,尺寸并没有停留在屏幕边缘,而是逐渐超出了屏幕.我在主窗口上尝试了所有不同的大小限制,在两个维度上都扩展了视图模型.
此外,我尝试获取列表框的滚动条,但没有成功(或者它只是存在,但如果我强制使用,则不会启用.)

如何将最大大小限制为屏幕(全屏)的分辨率,并在达到大小时获取列表框的滚动条?

€:好的,这应该是我代码的相关部分.我尝试使用1024×768的固定大小,但即使这样也不起作用.

MainWindow.xaml

<Window x:Class="SWS.MainWindow"
    DataContext="{Binding Main, Source={StaticResource Locator}}"
    Width="1024"
    Height="768"
    MaxWidth="1024"
    MaxHeight="768">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <ContentControl Grid.Row="0" Content="{Binding CurrentViewModel}" />
    </Grid>
</Window>

有问题的ViewModel

<UserControl x:Class="SWS.Views.ProgramView"
    HorizontalAlignment="Stretch"
    VerticalAlignment="Stretch">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <DockPanel Grid.Row="0">
            <Label Width="65" Content="{x:Static p:Resources.PrV_Number}" />
            <Label Width="75" Content="{x:Static p:Resources.PrV_Weight}" />
            <Label Width="55" Content="{x:Static p:Resources.PrV_Action}" />
            <Label Content=" " />
        </DockPanel>
        <ListBox Grid.Row="1" 
                 VerticalAlignment="Stretch" 
                 ItemsSource="{Binding ParticleCollection}" 
                 ScrollViewer.CanContentScroll="True"
                 ScrollViewer.VerticalScrollBarVisibility="Auto">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <DockPanel>
                        <TextBlock Text="{Binding ID}" Width="53" />
                        <TextBlock Text="{Binding Weight, StringFormat=F4}" Width="65" />
                        <TextBlock Text="{Binding Action}" Width="52" />
                    </DockPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</UserControl>

解决方法:

您需要在ContentControl的窗口和UserControl中的ListBox上将行高设置为*,以填充可用空间,而不是尝试获取所需的空间.

这工作正常:

MainWindow.xaml:

<Window x:Class="SWS.MainWindow"
    DataContext="{Binding Main, Source={StaticResource Locator}}"
    Width="1024"
    Height="768"
    MaxWidth="1024"
    MaxHeight="768">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <ContentControl Grid.Row="0" Content="{Binding CurrentViewModel}" />
    </Grid>
</Window>

和UserControl:

<UserControl x:Class="SWS.Views.ProgramView"
    HorizontalAlignment="Stretch"
    VerticalAlignment="Stretch">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        ...
    </Grid>
</UserControl>

也可以通过以下几种方法来做到这一点:

在窗口中,您只需删除< Grid.RowDefinitions> …< Grid.RowDefinitions>完全.默认行为是您要寻找的.

当您有多于1行时,可以选择指定Height =“ *”或仅从RowDefinition中删除Height属性.

<Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
    <RowDefinition />
</Grid.RowDefinitions>
上一篇:修改浏览器的滚动条样式


下一篇:python-如何为tkinter Scale Widget滚动条使用非整数,浮点值?