DataFrid宽度上的WPF全宽DataGridColumn

时间:2015-10-01 09:55:29

标签: c# wpf datagrid

我有{strong> WPF WindowDataGrid内有Grid,如下所示:

<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" SizeToContent="WidthAndHeight" WindowStyle="ToolWindow" ResizeMode="NoResize">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>

        <TextBlock FontSize="20">Some header with some pretty longish text</TextBlock>

        <DataGrid Grid.Row="1" Height="200">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Column1" Width="*"/>
            </DataGrid.Columns>
        </DataGrid>

    </Grid>
</Window>

我希望DataGrid的宽度至少是TextBlock的宽度,在这种情况下,因为Grid的{​​{1}} }的宽度设置为ColumnDefinition

但不知何故,Auto DataGrid的宽度最小(甚至无法调整大小),而我希望它的宽度可以填充。目前它看起来像这样:
enter image description here

请注意,该窗口必须为ColumnToolWindow设置为SizeToContent

6 个答案:

答案 0 :(得分:3)

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
</Grid>
  • (明星)占用任何剩余空间
  

修正:固定大小的逻辑单位(1/96英寸)

自动:占用控件所需的空间

  
    

Star():占用尽可能多的空间(在填充所有自动和固定大小的列之后),按比例划分所有星形大小的列。所以3 / 5 *表示与30 * / 50 *相同。请记住,如果网格大小是根据其内容计算的,则星号大小不起作用。

  

答案 1 :(得分:2)

摆脱

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>

或者将“宽度”设置为*而不是“自动”。

答案 2 :(得分:1)

我能想出的唯一解决方法是使用DataGrid&#39; {DataGrid加载 <DataGrid Grid.Row="1" Height="200" x:Name="MyDg" Loaded="MyDg_OnLoaded"> <DataGrid.Columns> <DataGridTextColumn x:Name="MyDgtc" Header="Column1"/> </DataGrid.Columns> </DataGrid> 时,从后面的代码中手动设置列的宽度{3}}属性:

  private void MyDg_OnLoaded(object sender, RoutedEventArgs e)
  {
        MyDgtc.Width = MyDg.ActualWidth;
  }

处理程序:

lower = int(input("Enter lower range: "))
upper = int(input("Enter upper range: "))
print("Prime numbers between", lower, "and", upper, "are:")

def get_primes():
    for num in range(lower, upper + 1):
        if num > 1:
            for i in range(2, num):
                if (num % i) == 0:
                        break
            else:
                yield num

print ', '.join([str(n) for n in get_primes()])

我也很感兴趣为什么会发生这种情况,一旦我找到了什么,我会更新我的答案。

答案 3 :(得分:1)

<TextBlock Name="Fred" FontSize="20" Text="Some header with pretty longish test" HorizontalAlignment="Left"></TextBlock>
    <DataGrid Grid.Row="1" Height="200" MinColumnWidth="{Binding ElementName=Fred, Path=ActualWidth}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Column1"></DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>

使用数据绑定来获取文本块的实际宽度(我称之为'fred')并使用它来设置数据网格的mincolumnwidth。

答案 4 :(得分:1)

这在运行时有效,但似乎没有(总是)出现在设计器中。

  1. 在一些包装器中包围DataGrid(另一个Grid很好)
  2. 使用相对源或元素名称将DataGrid绑定到包装器的ActualWidth:

    一个。 Width="{Binding Path=ActualWidth, ElementName=WrapperGrid}"

    Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Grid}}"

  3. 如果您没有SizeToContent="WidthAndHeight"选项,则会出现在设计师中:

    enter image description here

    但是,无论你运行它后,宽度都是正确的:

    使用SizeToContent="WidthAndHeight"

    enter image description here

    没有SizeToContent="WidthAndHeight"

    enter image description here

    以下完整代码:

    <Window x:Class="WpfApp1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApp1"
            mc:Ignorable="d"
            Title="MainWindow"
            SizeToContent="WidthAndHeight"
            WindowStyle="ToolWindow"
            ResizeMode="NoResize">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition
                    Width="Auto" />
            </Grid.ColumnDefinitions>
    
            <Grid.RowDefinitions>
                <RowDefinition
                    Height="Auto" />
                <RowDefinition
                    Height="Auto" />
            </Grid.RowDefinitions>
    
            <TextBlock
                x:Name="Tb1"
                FontSize="20">Some header with some pretty longish text</TextBlock>
    
            <Grid
                Grid.Row="1"
                Grid.Column="0">
    
                <DataGrid
                    Grid.Row="1"
                    Height="200"
                    Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Grid}}"
                    AutoGenerateColumns="False">
                    <DataGrid.Columns>
                        <DataGridTextColumn
                            Header="Column1"
                            Width="*" />
                    </DataGrid.Columns>
                </DataGrid>
            </Grid>
    
        </Grid>
    </Window>
    

答案 5 :(得分:0)

首先抱歉我的英文

在这里,你需要什么。

你的问题在于线路占用空间的定义,正如其他人已经告知你如果离开“自动”它会占用必要的宽度来装箱你的内容而没有别的,如果你留下*它将占用所有剩余空间

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>

你的窗口:

<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"  
        WindowStyle="ToolWindow" 
        ResizeMode="NoResize" >
    <Grid>
        <!-- not necessary but you can set it -->
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <!-- your rows -->
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!-- first row -->
        <Grid Row="0">
             <TextBlock FontSize="20" Text="Some header with some pretty longish text"/>
        </Grid>

        <!-- second line, your datagrid, I have changed to fit all available space -->
        <Grid Row="1">
            <DataGrid Grid.Row="1">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Column1" Width="*" />
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Grid>
</Window>