C# WPF XAML: проблемы с макетом при динамическом растяжении c, расширении строки состояния и горизонтальной сетки данных - PullRequest
1 голос
/ 29 января 2020

Я разделил свой 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 вопроса за один раз, но я обманываю здесь.

Заранее спасибо!

1 Ответ

1 голос
/ 29 января 2020

1)

Поскольку вы установили для DockPanel.Dock присоединенного свойства значение Top для Menu и Frame, а последний дочерний элемент заполняет DockPanel если вы не установите LastChildFill на false. Кроме того, DockPanel заполняет его родительский контейнер по умолчанию, поэтому нет смысла связываться со свойствами ActualWidth и ActualHeight окна.

Удалить DockPanel.Dock="Top" из Frame и переместить это ниже StatusBar. Затем Frame заполнит средний «ряд» DockPanel:

<DockPanel>

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

    <StatusBar DockPanel.Dock="Bottom" Background="LightSlateGray" Height="32">
        ...
    </StatusBar>

    <Frame>...</Frame>

</DockPanel>

2)

Это должно быть исправлено, выполнив вышеуказанное и возможно также уменьшить нижнее поле DataGrid в Page:

Margin="0,0,0,171"

3)

Поскольку Frame не заполняет DockPanel как и ожидалось. Смотри 1).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...