WPF:调整ScrollViewer中数据网格的宽度

时间:2013-11-21 10:54:08

标签: c# wpf xaml

我有ScrollViewer显示页面内容的位置。里面我有一个DataGrid,但是当我把DataGrid放在ScrollViewer里面时,列的宽度就丢失了。所以我在这里恳求h ttp://stackoverflow.com/questions/17875765/wpf-scrollviewer-around-datagrid-affects-column-width 我需要将父级的宽度绑定到我的DataGrid,这没关系,但问题是什么。 当窗口的宽度增加时,DataGrid的宽度也增加,但是当窗口的宽度减小时,DataGrid的宽度不会改变。我想要的是当宽度改变DataGrid的宽度时也是如此。

这是示例XAML:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
    <!--Page Content-->
        <Grid x:Name="grid">
            <DataGrid Width="{Binding ElementName=grid, Path=ActualWidth}">
                <DataGrid.Columns>
                    <DataGridTextColumn Width="*" Header="Header 1"  />
                    <DataGridTextColumn Width="*" Header="Header 2" /> 
                    <DataGridTextColumn Width="*" Header="Header 3" /> 
                    <DataGridTextColumn Width="*" Header="Header 4" />
                    <DataGridTextColumn Width="*" Header="Header 5" />
                    <DataGridTextColumn Width="*" Header="Header 6" />
                    <DataGridTextColumn Width="*" Header="Header 7" /> 
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </ScrollViewer>
</Window>

编辑: 现在我的MainWindow看起来像:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        xmlns:my="clr-namespace:WpfApplication1"
        x:Name="window1">
    <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
        <my:MyGrid />
    </ScrollViewer>
</Window>

和我的控制:

<UserControl x:Class="WpfApplication1.MyGrid"
             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" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <DataGrid Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=ActualWidth}">
            <DataGrid.Columns>
                <DataGridTextColumn Width="*" Header="Header 1"  />
                <DataGridTextColumn Width="*" Header="Header 2" />
                <DataGridTextColumn Width="*" Header="Header 3" />
                <DataGridTextColumn Width="*" Header="Header 4" />
                <DataGridTextColumn Width="*" Header="Header 5" />
                <DataGridTextColumn Width="*" Header="Header 6" />
                <DataGridTextColumn Width="*" Header="Header 7" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</UserControl>

3 个答案:

答案 0 :(得分:4)

尝试这种方法:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        x:Name="window1">
    <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
    <!--Page Content-->
            <DataGrid Width="{Binding ElementName=window1, Path=ActualWidth}">
                <DataGrid.Columns>
                    <DataGridTextColumn Width="*" Header="Header 1"  />
                    <DataGridTextColumn Width="*" Header="Header 2" /> 
                    <DataGridTextColumn Width="*" Header="Header 3" /> 
                    <DataGridTextColumn Width="*" Header="Header 4" />
                    <DataGridTextColumn Width="*" Header="Header 5" />
                    <DataGridTextColumn Width="*" Header="Header 6" />
                    <DataGridTextColumn Width="*" Header="Header 7" /> 
                </DataGrid.Columns>
            </DataGrid>
    </ScrollViewer>
</Window>

这会更适合你吗?

答案 1 :(得分:0)

上面的解决方案几乎对我有用,除了有额外的滚动条(DataGrid中的内部滚动条和ScrollViewer中的外部滚动条)。之前的内部因为Window.ActualWidth和ActualHeight有点太大而被隐藏了。由于Window的外边界,DataGrid的大小需要比Window的大小少一点。转换器可用于从宽度减去25,从高度减去42。

我的工作解决方案最终成为基于代码的。对不起,我发现每个人都在xaml工作。但我会发布它,以防其他人好奇如何在代码中做同样的事情......

class FindResultsGrid : Window
{
    public FindResultsGrid(List<FindResultLine> list)
    {
        var dg = new DataGrid() 
        { 
            AutoGenerateColumns = false, 
            Height = 450, // starting size, will be dynamic based on window...
            Width = 900,
            SelectionMode= DataGridSelectionMode.Single 
        };
        this.Width = dg.Width + 25;
        this.Height = dg.Height + 42;

        dg.AddColumn("Item", "ItemName", width: 151);
        dg.AddColumn("Line #", "lineNbr", width: 51);
        dg.AddColumn("Text", "lineText");

        dg.SetBinding(DataGrid.WidthProperty, new Binding("ActualWidth") { Source = this, Converter=new WidthConversion() });
        dg.SetBinding(DataGrid.HeightProperty, new Binding("ActualHeight") { Source = this, Converter=new HeightConversion() });

        this.Content = dg;

        dg.ItemsSource = list;
    }
}
class WidthConversion : IValueConverter
{
    object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return ((double)value) - 25.0;
    }
    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); }
}
class HeightConversion : IValueConverter
{
    object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return ((double)value) - 42;
    }
    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); }
}


public static class MyExtensions
{
    public static DataGridTextColumn AddColumn(this DataGrid dg, string header,
        string propertyPath = null,
        double width = Double.NaN,
        BindingMode way = BindingMode.OneWay,
        bool canUserSort = true)
    {
        if (propertyPath == null)
            propertyPath = header;
        var binding = new System.Windows.Data.Binding(propertyPath);
        binding.Mode = way;
        var col = new DataGridTextColumn()
        {
            Header = header,
            Binding = binding,
            Width = Double.IsNaN(width) ? DataGridLength.Auto : new DataGridLength(width),
            CanUserSort = canUserSort
        };
        dg.Columns.Add(col);
        return col;
    }

答案 2 :(得分:0)

试试这个: 使用datagrid和scrollviewer时,我也遇到了同样的问题。 将ScrollViewer的Horizo​​ntalScrollBarVisibility属性设置为“Disabled”。它在宽度增加时以及在减小宽度时起作用。