【问题标题】:Resizing Issues with DataGrid containing wrapping TextBlocks包含包装 TextBlocks 的 DataGrid 的大小调整问题
【发布时间】:2012-09-10 11:25:13
【问题描述】:

.NET 4.0 DataGrid 有一个非常令人不安的问题。我有比例模板列,其中包含启用了 textWrapping 的 TextBlock。

问题是,DataGrid 的高度在加载时不正确(它的大小就像文本块都被最大包装一样。)并且在调整大小时不会更新它们的大小。这似乎是一个布局问题(MeasureOverride 和 ArrangeOverride 似乎在未解决比例大小时被调用,并且之后没有被调用......)但我无法解决它。

这是显示问题的简化代码:

MainWindow.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="700" Width="525">
<StackPanel Width="500">
    <Button Content="Add DataGrid" Click="Button_Click" />
    <ItemsControl x:Name="itemsControl">
        <ItemsControl.ItemContainerStyle>
            <Style>
                <Setter Property="Control.Margin" Value="5" />
            </Style>
        </ItemsControl.ItemContainerStyle>
    </ItemsControl>
</StackPanel>

MainWindow.xaml.cs

using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Media;

namespace WpfApplication1
{
public partial class MainWindow : System.Windows.Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        itemsControl.Items.Add(CreateDataGrid()); 
    }

    private DataGrid CreateDataGrid()
    {
        var dataGrid = new DataGrid() { HeadersVisibility = DataGridHeadersVisibility.Column };
        dataGrid.MaxWidth = 500;
        dataGrid.Background = Brushes.LightSteelBlue;
        dataGrid.Columns.Add(GetDataGridTemplateColumn("Label", "Auto"));
        dataGrid.Columns.Add(GetDataGridTemplateColumn("Value", "*"));
        dataGrid.Items.Add(new Entry() { Label = "Text Example 1", Value = "Some wrapped text" });
        dataGrid.Items.Add(new Entry() { Label = "Text Example 2", Value = "Some wrapped text" });
        return dataGrid;
    }

    private DataGridTemplateColumn GetDataGridTemplateColumn(string bindingPath, string columnWidth)
    {
        DataGridTemplateColumn result = new DataGridTemplateColumn() { Width = (DataGridLength)(converter.ConvertFrom(columnWidth))};
        FrameworkElementFactory cellTemplateframeworkElementFactory = new FrameworkElementFactory(typeof(TextBox));
        cellTemplateframeworkElementFactory.SetValue(TextBox.NameProperty, "cellContentControl");
        cellTemplateframeworkElementFactory.SetValue(TextBox.TextProperty, new Binding(bindingPath));
        cellTemplateframeworkElementFactory.SetValue(TextBox.TextWrappingProperty, TextWrapping.Wrap);
        result.CellTemplate = new DataTemplate() { VisualTree = cellTemplateframeworkElementFactory };
        return result;
    }

    private static DataGridLengthConverter converter = new DataGridLengthConverter();
}

public class Entry
{
    public string Label { get; set; }
    public string Value { get; set; }
}

}

【问题讨论】:

    标签: c# wpf layout datagrid


    【解决方案1】:

    我终于想出了一个相当肮脏的解决方案,但至少它有效:我通过计算自己的正确值来手动更新网格的高度,同时考虑到行高度、网格填充、网格边框和 ColumnHeaderRow 高度.我需要在 OnPropertyChanged(用于填充和网格边框)、DataGridColumn.SizeChanged、DataGridColumn.RowUnloaded、ColumnHeaderPresenter.SizeChanged 和其他一些上更新它。

    唯一的问题是它可以与默认的 DataGrid ControlTemplate 一起正常工作,但如果模板要更改网格渲染,它将不再正确。

    【讨论】:

      【解决方案2】:

      终于找到了解决方案:在 DataGrid 上将 CanContentScroll 设置为 false 解决了这个问题。

      <Setter Property="ScrollViewer.CanContentScroll" Value="False" />
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多