Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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 DataGrid的内部视图宽度?_C#_Wpf_Datagrid - Fatal编程技术网

C# 如何获取WPF DataGrid的内部视图宽度?

C# 如何获取WPF DataGrid的内部视图宽度?,c#,wpf,datagrid,C#,Wpf,Datagrid,假设您有宽度为100像素的DataGrid(标准),但是您有如此宽的列(以及如此多的列),以至于您必须水平滚动DataGrid(整个DataGrid,而不是单个列)才能读取内容 +--------+ |very lon| |<#=====>| +--------+ +----------+ |很长| || +--------+ 我希望你明白了。好的,正如我所说的,DataGrid的宽度是100像素,但是如何获得DataGrid的视图宽度呢?——显然它比DataGrid大 编辑1

假设您有宽度为100像素的DataGrid(标准),但是您有如此宽的列(以及如此多的列),以至于您必须水平滚动DataGrid(整个DataGrid,而不是单个列)才能读取内容

+--------+ 
|very lon|
|<#=====>|
+--------+
+----------+
|很长|
||
+--------+
我希望你明白了。好的,正如我所说的,DataGrid的宽度是100像素,但是如何获得DataGrid的视图宽度呢?——显然它比DataGrid大

编辑1
我遍历了DataGrid的可视化树以获得它的ScrollViewer。接下来我读了extendwidth——但是这个值有点太小了。另一方面,如果我添加DataGrid的RowHeaderActualWidth,总和就太大了。因此,必须有另一个因素(或者完全更好、更可靠的方式来读取DataGrid视图的内部宽度)。

我目前没有4.0可用,但我想您可以这样做:

private Double GetGridWidth(DataGrid grid)
{
    Double width = 0.0;
    foreach (DataGridColumn column in myDataGrid.Columns)
    {
        width += column.ActualWidth;
    }

    return width;
}
或者,使用LINQ:

private Double GetGridWidth(DataGrid grid)
{
    return grid.Columns.Sum(col => col.ActualWidth);
}

我目前没有4.0可用,但我想你可以这样做:

private Double GetGridWidth(DataGrid grid)
{
    Double width = 0.0;
    foreach (DataGridColumn column in myDataGrid.Columns)
    {
        width += column.ActualWidth;
    }

    return width;
}
或者,使用LINQ:

private Double GetGridWidth(DataGrid grid)
{
    return grid.Columns.Sum(col => col.ActualWidth);
}

我不知道现在回答是否太晚了,但就一般知识而言,你可以用

//in your class declaration
DataGrid gridInstance;

//in your method
Type type = typeof(DataGrid);
PropertyInfo pInfo = type.GetProperty("CellsPanelActualWidth", BindingFlags.NonPublic | BindingFlags.Instance);
double actualWpfWidth = (double)pInfo.GetValue(gridInstance, null);

我不知道现在回答是否太晚了,但就一般知识而言,你可以用

//in your class declaration
DataGrid gridInstance;

//in your method
Type type = typeof(DataGrid);
PropertyInfo pInfo = type.GetProperty("CellsPanelActualWidth", BindingFlags.NonPublic | BindingFlags.Instance);
double actualWpfWidth = (double)pInfo.GetValue(gridInstance, null);

在Xaml中,您可以直接使用,例如

Width="{Binding ElementName=DatagridName, Path=CellsPanelActualWidth}" 

在Xaml中,您可以直接使用,例如

Width="{Binding ElementName=DatagridName, Path=CellsPanelActualWidth}" 

几乎——我可以做到这一点,但差别很小(因为网格线、填充和天知道还有什么),我需要准确的数字,WPF直接使用的数字,而不是“反向工程”。请参阅我的相关问题--如何计算DataGrid所需的宽度:。您是对的-这将为您提供一个近似值。我想您可以获取网格的模板(请参阅),以查看是否有线索。或者,您可以从DataGrid派生一个类,并处理MeasureOverride和ArrangeOverride(或一个或多个其他布局函数),以了解其中的神奇之处。我承认我对DataGrid不太了解(希望有人能给你一个更好的答案),但这是两种常用的方法。我必须专注于更简单的方法,因为这应该只是一个调整DataGrid大小的工具——它已经非常可怕了,它变得多么复杂。编辑:我认为我现在使用ScrollViewer的解决方案有点接近(不完美),但是仍然缺少一些部分。这确实会很复杂-任何时候发生变化(数据、用户大小等),都需要重新计算。您还需要考虑数据网格之外的事情(例如,可能影响所有文本块的样式),等等。它是否需要如此精确?如果是这样,您将需要(至少)查看模板。上面的解决方案可能会给您一个“足够接近”的值,您可以为分隔符宽度(乘以columns.Count-1)和填充等添加一个“模糊因子”。这取决于您绝对需要的精确程度。如果你允许用户调整大小,答案可能是“不太好”。好吧,当我看到iPhone应用程序截图(大多数截图)时,我感到羡慕——因为所有的东西都非常匹配。非常不幸的是,我们周围都是半生不熟的产品——几乎可以工作,几乎抛光,几乎可靠。我已经厌倦了这一点——我认为我们对当前的形势和做事更快的趋势,不注重细节——我使用Excel,但我并不欣赏它。我无法修复它,但我肯定可以改进我的应用程序。这正是我正在做的——因此这个问题。而且,做一些有风格的事情感觉很棒;)几乎——我可以做到这一点,但差别很小(因为网格线、填充和天知道还有什么),我需要准确的数字,WPF直接使用的数字,而不是“反向工程”。请参阅我的相关问题--如何计算DataGrid所需的宽度:。您是对的-这将为您提供一个近似值。我想您可以获取网格的模板(请参阅),以查看是否有线索。或者,您可以从DataGrid派生一个类,并处理MeasureOverride和ArrangeOverride(或一个或多个其他布局函数),以了解其中的神奇之处。我承认我对DataGrid不太了解(希望有人能给你一个更好的答案),但这是两种常用的方法。我必须专注于更简单的方法,因为这应该只是一个调整DataGrid大小的工具——它已经非常可怕了,它变得多么复杂。编辑:我认为我现在使用ScrollViewer的解决方案有点接近(不完美),但是仍然缺少一些部分。这确实会很复杂-任何时候发生变化(数据、用户大小等),都需要重新计算。您还需要考虑数据网格之外的事情(例如,可能影响所有文本块的样式),等等。它是否需要如此精确?如果是这样,您将需要(至少)查看模板。上面的解决方案可能会给您一个“足够接近”的值,您可以为分隔符宽度(乘以columns.Count-1)和填充等添加一个“模糊因子”。这取决于您绝对需要的精确程度。如果你允许用户调整大小,答案可能是“不太好”。好吧,当我看到iPhone应用程序截图(大多数截图)时,我感到羡慕——因为所有的东西都非常匹配。非常不幸的是,我们周围都是半生不熟的产品——几乎可以工作,几乎抛光,几乎可靠。我已经厌倦了这一点——我认为我们对当前的形势和做事更快的趋势,不注重细节——我使用Excel,但我并不欣赏它。我无法修复它,但我肯定可以改进我的应用程序。这正是我正在做的——因此这个问题。而且,做一些有风格的事情感觉很棒;)