【问题标题】:C# WPF XAML: Layout issues with dynamic stretching, statusbar and horizontal datagrid expansionC# WPF XAML:动态拉伸、状态栏和水平数据网格扩展的布局问题
【发布时间】:2020-05-14 10:25:42
【问题描述】:

我将 WinMain.xaml 分成 3 个部分(菜单、框架(用于页面)和状态栏):

<Window x:Class="myCrazyApp.WinMain"
    ...
    MinHeight="600" MinWidth="1000">

    <DockPanel  Width="{Binding ActualWidth,  RelativeSource = {RelativeSource AncestorType = {x:Type Window}}}"
               Height="{Binding ActualHeight, RelativeSource = {RelativeSource AncestorType = {x:Type Window}}}">

        <Menu DockPanel.Dock="Top" Height="20">
            ...MenuItems...
        </Menu>

        <Frame DockPanel.Dock="Top" Name="WinMain_FrameContent" HorizontalAlignment="Stretch" HorizontalContentAlignment="Left" VerticalAlignment="Stretch" VerticalContentAlignment="Top" Source="Pages\PageOne.xaml" NavigationUIVisibility="Hidden"/>

        <StatusBar DockPanel.Dock="Bottom" Background="LightSlateGray" Height="32">
            <StatusBar.ItemsPanel>
                <ItemsPanelTemplate>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="Auto" />
                            <ColumnDefinition Width="180" />
                            <ColumnDefinition Width="Auto" />
                            <ColumnDefinition Width="Auto" />
                            <ColumnDefinition Width="Auto" />
                            <ColumnDefinition Width="Auto" MinWidth="60"/>
                        </Grid.ColumnDefinitions>
                    </Grid>
                </ItemsPanelTemplate>
            </StatusBar.ItemsPanel>
            <StatusBarItem Grid.Column="0">
                <TextBlock Name="WinMain_TB_Log" />
            </StatusBarItem>
            <Separator Grid.Column="1" />
            <StatusBarItem Grid.Column="2">
                <ProgressBar Name="WinMain_PB" Value="0" Width="170" Height="16" />
            </StatusBarItem>
            <Separator Grid.Column="3" />
            <StatusBarItem Grid.Column="4">
                <Label Content="Status:"/>
            </StatusBarItem>
            <Separator Grid.Column="5" />
            <StatusBarItem Grid.Column="6" Padding="4" HorizontalAlignment="Center">
                <TextBlock Name="WinMain_TB_Status" />
            </StatusBarItem>
        </StatusBar>
    </DockPanel>

然后我的 PageOne.xaml 填充了一个数据网格:

<Page x:Class="myCrazyApp.PageOne"
  ...>

<DockPanel Background="Beige">
    <Label DockPanel.Dock="Top">MyTitle</Label>

    <Grid DockPanel.Dock="Top">
        <DataGrid x:Name="myDataGrid" x:FieldModifier="public" IsReadOnly="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" MinWidth="500" EnableColumnVirtualization="True" EnableRowVirtualization="True" Margin="0,0,0,171" />
    </Grid>
</DockPanel>

1) 主窗口的状态栏不在底部,而是在窗口中间下方,与页面内容重叠。为什么?

2) 页面水平调整其大小以适应主窗口的大小(这是正确的),但不垂直调整。为什么?

3) 页面中的数据网格不显示垂直滚动条,并且不会在最后一列水平结束(相反:它无限地向右延伸,并带有一个空列/网格)。为什么?

很抱歉一次问了 3-4 个问题,但我是假的,在这里。

提前致谢!

【问题讨论】:

    标签: c# wpf layout


    【解决方案1】:

    1)

    因为您已将Menu 和Frame 的DockPanel.Dock 附加属性设置为Top,并且最后一个子元素填充DockPanel,除非您将LastChildFill 设置为false。此外,DockPanel 默认填充它的父容器,因此绑定到窗口的ActualWidth 和ActualHeight 属性是没有意义的。

    从Frame 中删除DockPanel.Dock="Top" 并将其移至StatusBar 下方。然后Frame 将填充DockPanel 的中间“行”:

    <DockPanel>
    
        <Menu DockPanel.Dock="Top" Height="20">
            ...
        </Menu>
    
        <StatusBar DockPanel.Dock="Bottom" Background="LightSlateGray" Height="32">
            ...
        </StatusBar>
    
        <Frame>...</Frame>
    
    </DockPanel>
    

    2)

    应该通过执行上述操作来修复它,并且可能还会减少Page 中DataGrid 的底部边距:

    Margin="0,0,0,171"
    

    3)

    因为Frame 没有按预期填充DockPanel。见 1)。

    【讨论】:

    • 非常感谢,@mm8!这解决了所有问题。顺便说一句,margin 171 不是故意的,但我猜是我通过单击 XAML 编辑器中的错误对象意外插入的。
    猜你喜欢
    • 1970-01-01
    • 2012-11-05
    • 2017-12-17
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    相关资源
    最近更新 更多