C# WPF:在ScrollViewer内调整datagrid的宽度
我有ScrollViewer,其中显示页面内容。在内部,我有一个DataGrid,但当我将DataGrid放入ScrollViewer时,列的宽度就丢失了。所以我在这里读了h 我需要将父节点的宽度绑定到我的数据网格,这没关系,但问题是什么。 当窗口宽度增加时,DataGrid的宽度也会增加,但当窗口宽度减少时,DataGrid的宽度不会改变。我想要的是当数据网格的宽度也改变时 这是示例XAML:C# WPF:在ScrollViewer内调整datagrid的宽度,c#,wpf,xaml,C#,Wpf,Xaml,我有ScrollViewer,其中显示页面内容。在内部,我有一个DataGrid,但当我将DataGrid放入ScrollViewer时,列的宽度就丢失了。所以我在这里读了h 我需要将父节点的宽度绑定到我的数据网格,这没关系,但问题是什么。 当窗口宽度增加时,DataGrid的宽度也会增加,但当窗口宽度减少时,DataGrid的宽度不会改变。我想要的是当数据网格的宽度也改变时 这是示例XAML: <Window x:Class="WpfApplication1.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">
<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。无论如何,如果我运行示例项目,即使整个内容可见,滚动条也会始终显示。你能检查一下我编辑过的样品吗。