【问题标题】:Re sizing Window to Smaller Screen Without Losing Elements在不丢失元素的情况下将窗口大小调整为更小的屏幕
【发布时间】:2016-05-22 16:42:12
【问题描述】:

Window with frame containing main page

如您所见,(如果图像加载正确)当我从笔记本电脑运行程序时,我无法看到整个屏幕,也无法滚动查看框架中包含的其余元素。我试图添加一个滚动查看器来包含框架,但滚动条什么也不做,画布的元素被重新定位或消失。我是否包含正确的代码以使窗口适合屏幕尺寸?我是否必须使用滚动查看器才能查看整个窗口或至少查看框架页面中的元素?

    Height="{x:Static SystemParameters.PrimaryScreenHeight}" 
    Width="{x:Static SystemParameters.PrimaryScreenWidth}" 
    Loaded="Window_Load" WindowState="Maximized">

【问题讨论】:

  • 您的控件在哪种面板中?以及设置了什么样的属性?这决定了 WPF 如何决定布局和调整控件的大小。 ScrollViewers 仅在您为其设置高度/宽度时才能工作,否则根据其父面板,它们可能会增长以允许内容所需的任何大小。
  • 我正在使用画布作为容器。这些页面包含一个包含列表框、文本框和丰富文本框的画布。
  • 那是你的问题。Canvas 要求你指定每个子元素的位置,它根本不缩放它。您可以将 Canvas 包装在 ScrollViewer 中,但您必须设置 ScrollViewer 和 Canvas 的高度/宽度。更好的解决方案是使用不同的布局控件来显示您的项目,以实现更动态的显示。如果您不熟悉 WPF 的布局控件,我推荐这篇文章:WPF Layouts - A Quick Visual Start
  • 我想我使用画布是因为它很简单而且我很懒。那么,在window下,我应该使用一个grid,而grid应该包裹在一个ScrollViewer中?还是只是框架?谢谢!
  • 您希望您的应用程序根据窗口大小动态调整大小吗?它通常看起来更好一点,你总是可以给一个 MinSize 来强制执行最小尺寸。 ScrollViewer 应该包装包含所有控件的 Panel,并且您需要确保 ScrollViewer 的高度/宽度与屏幕尺寸无关。您可以绑定它,或者您可以使用 DockPanel.Dock=Fill 将其放置在 DockPanel 中,因为 DockPanel 会调整其子项的大小以适合可用大小。无论你用什么面板来包装你的控件,都必须是一个可以增长以填充所需空间的面板,例如 StackPanel、Grid 等

标签: wpf window frame scrollviewer


【解决方案1】:

在窗口中使用ScrollViewer,如下所示:

 <ScrollViewer MaxHeight="{Binding RelativeSource={RelativeSource AncestorType={x:Type Border}},Path=ActualHeight,Mode=OneWay}">
    <canvas>
............
</ScrollViewer>

示例输出:(如果width 也有问题,也绑定MaxWidthScrollviewer

【讨论】:

    【解决方案2】:

    在不丢失元素的情况下将窗口大小调整为更小的屏幕

    我想我代表很多人说我们强烈建议远离Canvas 来执行您的布局。 Canvas 很容易像您在 cmets 中提到的那样精简,因为它非常接近创建基于表单的简单 Windows 应用程序的方式。

    WPF 布局面板专为满足您的要求而设计。

    可能的结构是这样的

        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <TextBlock Text="Location"/>
            <TextBlock Grid.Row="1" Grid.Column="0" Text="Product Line"/>
            <TextBlock Grid.Row="2" Grid.Column="0" Text="Search"/>
            <ScrollViewer Grid.Row="0" Grid.Column="1" Grid.RowSpan="3">
                <StackPanel>
                   ...
                </StackPanel>
            </ScrollViewer>
        </Grid>
    

    【讨论】:

      猜你喜欢
      • 2021-11-19
      • 2013-12-22
      • 1970-01-01
      • 2018-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      相关资源
      最近更新 更多