【问题标题】:Why is my DataGrid going off screen no matter what solution I try?为什么无论我尝试什么解决方案,我的 DataGrid 都会离开​​屏幕?
【发布时间】:2018-02-18 14:11:22
【问题描述】:

我是 C# 和 WPF 的新手,试图获得我认为简单的东西,但它不起作用。

我有一个由 SQL 填充的数据网格,无论我尝试什么,我都无法让 DataGridHeight 留在窗口内。它总是向下延伸。我希望它对窗口大小是动态的。

下面是我非常简单的代码,或者至少是最近的一次迭代。

<Page x:Class="TMSMaintenance.PaymentError"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:local="clr-namespace:TMSMaintenance"
      Title="PaymentError">

    <!--<DataGrid Name="MydataGrid" CanUserAddRows="False" SelectionMode="Single" />-->

        <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="1*"/>              
        </Grid.RowDefinitions>

        <DockPanel Grid.Row="0" VerticalAlignment="Stretch" >

            <DataGrid x:Name="MydataGrid" 
                      VerticalAlignment="Stretch" 
                      MinHeight="100" 
                      VerticalScrollBarVisibility="Auto" VerticalContentAlignment="Stretch">                    
            </DataGrid>               
        </DockPanel>           
    </Grid>        
</Page>

我已经尝试使用ScrollView 进行包装——它没有用。我尝试通过将Height 绑定到窗口来设置它 - 它不起作用。我试过Grid.RowDefinition Height = "*""1*" - 它没有用。 VerticalAlignment = "Stretch" 也没有用。

那么我错过了什么?

编辑:也许我还应该说这是在框架标签内调用的Page 文件上。不确定它是否在这里有所作为。

 <StackPanel CanVerticallyScroll="True" CanHorizontallyScroll="True">
        <!-- Navigation -->
        <StackPanel Orientation="Horizontal" Margin="0,10,0,0">
            <Button Content="Files Lookup" Margin="0,0,10,0"/>
            <Button Content="Payment Error" Margin="0,0,10,0"/>
            <Button Content="Carrier Maintenance" Margin="0,0,10,0"/>
            <Button Content="Payment File" Margin="0,0,10,0" />
        </StackPanel>
        <ScrollViewer>
            <Frame x:Name="MainFrame" NavigationUIVisibility="Hidden" ></Frame>
        </ScrollViewer>               
    </StackPanel>

【问题讨论】:

  • 您放入(垂直)StackPanel 的任何内容都不会垂直调整大小。 StackPanel 只是根据其子元素的需要进行扩展。将您的 Frame 放入 Grid 或 DockPanel。除此之外,设置 StackPanel 的 CanVerticallyScroll 和 CanHorizo​​ntallyScroll 属性没有任何效果。阅读各自文档页面上的备注。
  • 我编辑了你的问题。首先,我从标题中删除了强制标签 - 请参阅 here 为什么。然后,我将您的示例代码更改为 minimal(请参阅minimal reproducible example)。您的示例不应包含任何与您询问的内容无关的代码。
  • 感谢@Clemens 提供的信息,我在探索选项时读到了自己的信息,但我的数据网格不在堆栈面板中,所以我认为这不是问题所在。我确实尝试了此代码的一个版本,其中我删除了堆栈面板及其所有内容,但没有任何区别。
  • @Clemens,我现在明白你对堆栈面板的意思了,主窗口上的那个就是你所指的我想的。所以忽略我之前的评论。

标签: c# wpf xaml layout datagrid


【解决方案1】:

摆脱那个DockPanelGrid 是一个更灵活的控件容器,您根本不需要将容器打包到容器中。仅此一项就可以解决问题。

最好的做法是根本不使用DockPanels。绝不。使用DockPanels 可以实现的一切都可以通过Grids 实现(需要更多的编码,但它为您提供更灵活的解决方案和更好的代码可维护性)。

同时摆脱VerticalContentAlignment(在您描述的情况下不需要)并且您不需要将VerticalAlignment(也不是HorizontalAlignment)定义为Stretch,因为它是该属性的默认值。

编辑: 我没有注意到您的代码的第二个示例。我之前写的所有内容仍然适用并且会使您的代码更好,但我认为您的问题在于将您的 Page 嵌套在您的主容器中(Window 或其他任何内容)。

尝试替换:

<StackPanel CanVerticallyScroll="True" CanHorizontallyScroll="True">
        <!-- Navigation -->
        <StackPanel Orientation="Horizontal" Margin="0,10,0,0">
            <Button Content="Files Lookup" Margin="0,0,10,0"/>
            <Button Content="Payment Error" Margin="0,0,10,0"/>
            <Button Content="Carrier Maintenance" Margin="0,0,10,0"/>
            <Button Content="Payment File" Margin="0,0,10,0" />
        </StackPanel>
        <ScrollViewer>
            <Frame x:Name="MainFrame" NavigationUIVisibility="Hidden" ></Frame>
        </ScrollViewer>               
    </StackPanel>

收件人:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <StackPanel Grid.Row="0"
                Orientation="Horizontal" 
                Margin="0,10,0,0">
        <StackPanel.Resources>
            <Style TargetType="{x:Type Button}">
                <Setter Property="Margin" Value="0,0,10,0" />
            </Style>
        </StackPanel.Resources>

        <Button Content="Files Lookup"/>
        <Button Content="Payment Error"/>
        <Button Content="Carrier Maintenance"/>
        <Button Content="Payment File"/>
    </StackPanel>

    <Frame x:Name="MainFrame" 
            Grid.Row="1"
            NavigationUIVisibility="Hidden" />
</Grid>

我还简化了您在 Buttons 上的样式,建议您将 Page 更改为 UserControl

【讨论】:

  • 今天有机会我会试一试,然后告诉你进展如何。我曾怀疑它实际上可能来自框架。谢谢指点。
  • 这很有效,感谢您的见解和建议,我正在学习 WPF,所以学习一些最佳实践是件好事。
  • 很高兴我能帮上忙 :)
猜你喜欢
  • 2017-01-12
  • 2017-10-27
  • 1970-01-01
  • 1970-01-01
  • 2017-11-26
  • 2012-10-22
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多