WPF页面 - >画布 - > TabControl-> TabItem->网格 - > DataGrid不显示垂直滚动条

时间:2017-04-13 19:23:56

标签: c# wpf xaml datagrid scrollbar

好吧,我也遇到过“垂直滚动条未显示”问题,建议的解决方案不起作用或在这种情况下不适用。

希望不是一个,而是两个数据网格并排显示,每个数据网格都有一个应用程序自己的数据源,它将正确响应用户调整大小,这意味着网格将按预期扩展和收缩。网格应该“锚定”并相应地渲染(哦,我多么想念WinForms的日子和实际的,简单的锚定!)。

第一个网格通常会显示不足的行来触发垂直滚动条,这没关系。

第二个datagrids的内容基于第一个数据网格的选定行,这意味着当用户在第一个数据网格(第0列)中选择一行时,将执行SQL语句,结果显示在其他数据网格中(第1列中的一个)。

如果第二个网格的内容大于显示的大小,则会继续呈现(视线外)推送页面容器项目(底部的状态栏,代码中未显示)一边继续渲染应用程序边界(不可见,但网格的行为就像它有无限的显示空间)。

我没有得到的是带有垂直滚动条的漂亮的分页网格。

我正在使用MVVMLight作为工具包,相应的ViewModel按设计工作。数据不是问题,只是渲染。

我很确定解决方案非常简单,我只是没有xaml经验(我是这个的新手)来弄明白。我已经尝试将网格封装在各种其他容器中(DockPanel,StackPanel,方向=水平等),但似乎无法正确。我甚至尝试将行高绑定到制表符控制实际高度 - 失败。

所以...对教程解释的一点帮助将不胜感激!

以下是该页面的完整xaml(除了我删除了无关的标签页):

    <Page x:Class="GetSchemaExplorerMsSqlSvr.DbMetaDataPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:GetSchemaExplorerMsSqlSvr"
      xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
      xmlns:command="http://www.galasoft.ch/mvvmlight"
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="500"
      Height="Auto"
            Width="Auto"
      Title="DbMetaDataPage"
            x:Name="pgDbMetaDataPage"
      Background="{StaticResource YellowBackground}"
      DataContext="{Binding MainWindowVM, Source={StaticResource Locator}}"
      >
  <Canvas>
    <TabControl x:Name="tcDbMetaData" Height="Auto"  Width="Auto">
            <TabItem x:Name="tiDbMetaData" Header="Get Schema" VerticalAlignment="Stretch">
                <Grid Margin="1,1,1,1">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition/>
                    </Grid.RowDefinitions>
                    <DataGrid
                        Grid.Column="0"
                        x:Name="dgDbMetaData"
                        ItemsSource="{Binding Path=GetSchemaMetaData, Mode=OneWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" 
                        IsReadOnly="True"
                        SelectedItem="{Binding Path=SelectedMetaDataItem, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"
                    />
                    <DataGrid
                        Grid.Column="1"
                        ItemsSource="{Binding Path=MetaDataCollectionInfo, Mode=OneWay}" 
                        IsReadOnly="True"
                        VerticalScrollBarVisibility="Auto"
                    />
                </Grid>
            </TabItem>
    </TabControl>
  </Canvas>
</Page>

2 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为您将TabControl设置为画布的子项。它用于设置其子元素的绝对定位。由于您不需要设置绝对位置,因此您应该删除您的Canvas并将您的Page的内容直接设置为TabControl。

来自MSDN:

  

Canvas的子元素总是按照他们想要的大小给出。因此,垂直对齐和水平对齐在画布内无效。

https://msdn.microsoft.com/en-us/library/system.windows.controls.canvas%28v=vs.110%29.aspx

您的代码将是:

<Page...>
    <TabControl ...>
        <TabItem ...>
           <Grid ...>
               <DataGrid Grid.Column="0".../>
               <DataGrid Grid.Column="1" .../>
           </Grid>
        </TabItem>
     </TabControl>
</Page>

答案 1 :(得分:0)

正如上面所指出的,删除Canvas元素解决了这个问题。为了便于参考,下面发布了改变后的xaml。结果不是很好,但是现在我正在寻找功能,这就是诀窍。

<Page x:Class="GetSchemaExplorerMsSqlSvr.DbMetaDataPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:GetSchemaExplorerMsSqlSvr"
      xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
      xmlns:command="http://www.galasoft.ch/mvvmlight"
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="500"
      Height="Auto"
            Width="Auto"
      Title="DbMetaDataPage"
            x:Name="pgDbMetaDataPage"
      Background="{StaticResource YellowBackground}"
      DataContext="{Binding MainWindowVM, Source={StaticResource Locator}}"
      >
    <TabControl x:Name="tcDbMetaData" Height="Auto"  Width="Auto">
        <TabItem x:Name="tiDbMetaData" Header="Get Schema" VerticalAlignment="Stretch">
            <DockPanel VerticalAlignment="Stretch" HorizontalAlignment="Stretch">

                <Grid DockPanel.Dock="Top" Background="{StaticResource YellowBackground}">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition/>
                        <RowDefinition MaxHeight="40"/>
                    </Grid.RowDefinitions>
                    <DataGrid
                        Grid.Row="0"
                        Grid.Column="0"
                        x:Name="dgDbMetaData"
                        ItemsSource="{Binding Path=GetSchemaMetaData, Mode=OneWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" 
                        IsReadOnly="True"
                        SelectedItem="{Binding Path=SelectedMetaDataItem, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"
                    />
                    <DataGrid
                        Grid.Row="0"
                        Grid.Column="1"
                        ItemsSource="{Binding Path=MetaDataCollectionInfo, Mode=OneWay}" 
                        IsReadOnly="True"
                        VerticalScrollBarVisibility="Auto"
                    />
                    <Button Grid.Column="0" Grid.Row="1" MaxHeight="30" Margin="5, 5, 5, 5" Content="Fetch MetaData"/>
                </Grid>
            </DockPanel>
        </TabItem>
        <TabItem Header="Tables">
            <Grid Background="#FFE5E5E5"/>
        </TabItem>
        <TabItem Header="Views">
            <Grid Background="#FFE5E5E5"/>
        </TabItem>
        <TabItem Header="Stored Procedures">
            <Grid Background="#FFE5E5E5"/>
        </TabItem>
        <TabItem Header="Functions">
            <Grid Background="#FFE5E5E5"/>
        </TabItem>
    </TabControl>

</Page>