我有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>
答案 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的HorizontalScrollBarVisibility属性设置为“Disabled”。它在宽度增加时以及在减小宽度时起作用。