【问题标题】:WPF DataGrid wrapped by Grid won't scroll horizontally由 Grid 包裹的 WPF DataGrid 不会水平滚动
【发布时间】:2016-04-12 02:43:25
【问题描述】:

当窗口太小而无法显示所有列时,我试图让我的 DataGrid 水平滚动。我正在使用网格来控制元素的定位。有人可以解释为什么没有出现滚动条以及如何修复它吗?如果可能的话,我更喜欢仅使用 XAML 的解决方案。

这是我的完整代码。随意批评你看到的任何奇怪的东西,因为我是 WPF 的新手。

<Window x:Class="FBLAM.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:FBLAM"
    mc:Ignorable="d"
    Title="MainWindow" Width="800" Height="600">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Menu Grid.Row="0" Grid.Column="0" IsMainMenu="True" Height="20" VerticalAlignment="Top">
        Menu Goes Here
    </Menu>
    <Grid Grid.Row="1" Grid.Column="0" HorizontalAlignment="Center" Background="#FFF0F0F0">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <StackPanel Grid.Column="1" Grid.Row="0" Orientation="Horizontal" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
            <Button Content="Button1" HorizontalAlignment="Left" Padding="10,2" VerticalAlignment="Center"/>
            <Button Content="Button2" HorizontalAlignment="Left" Padding="10,2" VerticalAlignment="Center" Margin="10,0,0,0"/>
        </StackPanel>
        <DataGrid 
              Grid.Column="1" 
              Grid.Row="1" 
              x:Name="MemberData" 
              AutoGenerateColumns="False" 
              IsReadOnly="False" 
              CanUserResizeColumns="True" 
              CanUserAddRows="True" 
              CanUserSortColumns="True" 
              ItemsSource="{Binding}" 
              SelectionMode="Single" 
              HeadersVisibility="Column" 
              HorizontalContentAlignment="Stretch" 
              VerticalContentAlignment="Stretch" 
              BorderThickness="0" 
              Margin="0" 
              GridLinesVisibility="Horizontal"
              ScrollViewer.CanContentScroll="True" 
              ScrollViewer.HorizontalScrollBarVisibility="Visible">
            <DataGrid.Columns>
                <DataGridTextColumn Header="ID" Binding="{Binding Id}" />
                <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}" />
                <DataGridTextColumn Header="Last Name" Binding="{Binding LastName}" />
                <DataGridTextColumn Header="School" Binding="{Binding School}" />
                <DataGridTextColumn Header="State" Binding="{Binding State}" />
                <DataGridHyperlinkColumn Header="Email" Binding="{Binding Email}" />
                <DataGridTextColumn Header="Year Joined" Binding="{Binding YearJoined}" />
                <DataGridTextColumn Header="Grade" Binding="{Binding Grade}" />
                <DataGridCheckBoxColumn Header="Active" Binding="{Binding Active}" />
                <DataGridTextColumn Header="Amount Owed" Binding="{Binding AmountOwed, StringFormat=C}" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Grid>

【问题讨论】:

    标签: c# wpf xaml gridview datagrid


    【解决方案1】:

    为什么ColumnDefinition 绑定到DataGridActualWidth?删除它。此外,将ScrollViewer 属性移动到DataGrid 本身。

    <Window x:Class="MyProject.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:MyProject"
            mc:Ignorable="d"
            Title="MainWindow" Width="800" Height="600">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>
            <Menu Grid.Row="0" IsMainMenu="True" Height="20" VerticalAlignment="Top">
                //menu items
            </Menu>
            <Grid Grid.Row="1" HorizontalAlignment="Stretch" Background="#FFF0F0F0">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <StackPanel Grid.Column="1" Grid.Row="0" Orientation="Horizontal" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
                    <Button Content="Button1" HorizontalAlignment="Left" Padding="10,2" VerticalAlignment="Center"/>
                    <Button Content="Button2" HorizontalAlignment="Left" Padding="10,2" VerticalAlignment="Center" Margin="10,0,0,0"/>
                </StackPanel>
                <DataGrid Grid.Column="1" 
                          Grid.Row="1" 
                          AutoGenerateColumns="False" 
                          IsReadOnly="False" 
                          CanUserResizeColumns="True" 
                          CanUserAddRows="True" 
                          CanUserSortColumns="True" 
                          ItemsSource="{Binding}" 
                          SelectionMode="Single" 
                          HeadersVisibility="Column" 
                          HorizontalContentAlignment="Stretch" 
                          VerticalContentAlignment="Stretch" 
                          BorderThickness="0" 
                          Margin="0" 
                          GridLinesVisibility="Horizontal"
                          ScrollViewer.CanContentScroll="True" 
                          ScrollViewer.HorizontalScrollBarVisibility="Visible" >
                    <DataGrid.Columns>
                        //10 columns here
                    </DataGrid.Columns>
                </DataGrid>
            </Grid>
        </Grid>
    </Window>
    

    【讨论】:

    • 非常感谢您的帮助!但它并没有完全解决问题。至少滚动条现在出现了。我有那个绑定的东西,因为当我调整窗口大小时它以某种方式阻止我的数据网格离开屏幕,但它似乎掩盖了我遇到的问题而不是解决它。当我删除它时,数据网格保持在窗口的中心,但不会固定在窗口的两侧,因此滚动条不会“抓住”窗口的边缘。基本上,滚动条不知道我的窗口有多大,只是表现得类似于“溢出:隐藏”。
    • 您是否发布了完整的 XAML,以便我可以尝试复制它?
    • 我已经剪掉了这些列,但我会根据你的要求添加这些列。更新了
    • 不用担心用数据源填充数据网格,只要你能看到标题就可以测试水平滚动条。
    【解决方案2】:

    经过一番搜索,我终于找到了导致问题的原因以及解决方法。

    这里:https://social.msdn.microsoft.com/Forums/sqlserver/en-US/e6750a6a-fc94-496e-9a94-10e48831a4d2/simply-want-auto-width-on-control-but-to-have-a-horizontal-scrollbar-if-parent-is-too-narrow?forum=wpf

    我只需要在整个 Grid 周围放置一个 ScrollViewer。讲简单!

    非常感谢 @d.mondada 让我走上了正确的道路。

    【讨论】:

    • 这可能有效,但从技术上讲,您将拥有两个 ScrollViewer(一个隐藏)。这是因为 DataGrid 有自己的内置 ScrollViewer 作为其模板的一部分。
    • @d.moncada 是的,但是从我目前所读到的内容来看,将数据网格放在宽度自动的网格列中会有效地禁用内置在数据网格中的水平滚动。宽度自动意味着该列将尽可能宽,以便不滚动,这就是我在窗口大于数据网格时寻找的行为,但不是当数据网格大于窗口时.如果您找到一种方法来防止自动扩展大于窗口,请告诉我。
    猜你喜欢
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2012-09-16
    相关资源
    最近更新 更多