Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF:在ScrollViewer内调整datagrid的宽度_C#_Wpf_Xaml - Fatal编程技术网

C# WPF:在ScrollViewer内调整datagrid的宽度

C# WPF:在ScrollViewer内调整datagrid的宽度,c#,wpf,xaml,C#,Wpf,Xaml,我有ScrollViewer,其中显示页面内容。在内部,我有一个DataGrid,但当我将DataGrid放入ScrollViewer时,列的宽度就丢失了。所以我在这里读了h 我需要将父节点的宽度绑定到我的数据网格,这没关系,但问题是什么。 当窗口宽度增加时,DataGrid的宽度也会增加,但当窗口宽度减少时,DataGrid的宽度不会改变。我想要的是当数据网格的宽度也改变时 这是示例XAML: <Window x:Class="WpfApplication1.MainWindow"

我有ScrollViewer,其中显示页面内容。在内部,我有一个DataGrid,但当我将DataGrid放入ScrollViewer时,列的宽度就丢失了。所以我在这里读了h 我需要将父节点的宽度绑定到我的数据网格,这没关系,但问题是什么。 当窗口宽度增加时,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>
编辑: 现在,我的主窗口看起来像:

<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>
尝试以下方法:

<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>
这更适合你吗?

试试这种方法:

<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>

这更适合您吗?

上述解决方案几乎适用于我,只是有额外的滚动条—内部的来自DataGrid,外部的来自ScrollViewer。因为Window.ActualWidth和ActualHeight有点太大,所以内部的部分以前就被隐藏了。由于窗口的外部边界,DataGrid的大小需要稍微小于窗口的大小。可以使用转换器从宽度中减去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;
    }

上面的解决方案几乎适合我,除了有额外的滚动条——内部的来自DataGrid,外部的来自ScrollViewer。因为Window.ActualWidth和ActualHeight有点太大,所以内部的部分以前就被隐藏了。由于窗口的外部边界,DataGrid的大小需要稍微小于窗口的大小。可以使用转换器从宽度中减去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;
    }
试试这个: 在使用datagrid和scrollviewer时,我也遇到了同样的问题。 将ScrollViewer的HorizontalScrollBarVisibility属性设置为“Disabled”。它在宽度增加和减小时都有效

试试这个: 在使用datagrid和scrollviewer时,我也遇到了同样的问题。
将ScrollViewer的HorizontalScrollBarVisibility属性设置为“Disabled”。它在宽度增加和减小时都有效

好的,它按照我想要的方式工作,但是如果我在UserControl中呈现DataGrid呢?UserControl中的Width={Binding ElementName=ShellView,Path=ActualWidth}对我不起作用。很高兴它能起作用。请随意投票选出有帮助的答案,或者选择一个作为答案。您必须向我演示如何使用该用户控件。用户控件的xaml看起来怎么样?有点复杂,因为我使用的是我正在学习的Caliburn.Micro;。在我的例子中,我尝试获取window1或ShellView时显示了我的UserControl及其属性。您可以将绑定更改为:Width={binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type UserControl}},Path=ActualWidth}。让控件找到UserControl类型的第一个父级是一个小技巧。您将拥有一个自定义usercontrol,但它将从usercontrol本身继承,并且可以工作。我希望usercontrol类型的第一个父级就是您希望使用的父级。在我的例子中,我需要将x:type usercontrol更改为x:type Window。无论如何,如果我运行示例项目,即使整个内容可见,滚动条也会始终显示。你能检查一下我编辑过的示例吗?好的,它按照我想要的方式工作,但是如果我在UserControl中呈现了DataGrid呢?UserControl中的Width={Binding ElementName=ShellView,Path=ActualWidth}对我不起作用。很高兴它能起作用。请随意投票选出有帮助的答案,或者选择一个作为答案。您必须向我演示如何使用该用户控件。用户控件的xaml看起来怎么样?有点复杂,因为我使用的是我正在学习的Caliburn.Micro;。在我的例子中,我尝试获取window1或ShellView时显示了我的UserControl及其属性。您可以将绑定更改为:Width={binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type UserControl}},Path=ActualWidth}。让控件找到UserControl类型的第一个父级是一个小技巧。您将拥有一个自定义usercontrol,但它将从usercontrol本身继承,并且可以工作。我希望usercontrol类型的第一个父级就是您希望使用的父级。在我的例子中,我需要将x:type usercontrol更改为x:type Window。无论如何,如果我运行示例项目,即使整个内容可见,滚动条也会始终显示。你能检查一下我编辑过的样品吗。