簡體   English   中英

如何以編程方式設置WPF DataGrid TextTrimming屬性

[英]How To Set WPF DataGrid TextTrimming Property Programmatically

我有一些WPF DataGrid ,它們在C#代碼中的樣式非常好,如下所示。 TextAlignmentTextWrappingToolTip都可以正常工作。 但是,我無法顯示省略號TextTrimming 你能告訴我我在做什么錯嗎?

public static void FormatGrid(ref DataGrid oDataGrid, List<ColumnFormat> oColumnFormats)
{
    oDataGrid.CanUserResizeColumns = true;
    SetHighlightBrush(ref oDataGrid, oUser);
    oDataGrid.Background = GetBackgroundBrush(oUser);
    oDataGrid.Foreground = GetBrushForeground(oUser, ColorType.Medium);

    for (int iColumn = 0; iColumn < oDataGrid.Columns.Count; iColumn++)
    {
        DataGridColumn oColumn = oDataGrid.Columns[iColumn];
        ColumnFormat oColumnFormat = GetColumnFormat(oColumn);
        if (oColumn.Visibility == Visibility.Visible)
        {
            if (oColumnFormat != null)
            {
              oColumn.CellStyle = GetCellStyle(oColumnFormat.ColumnName);
            }
        }
    }
}

private static Style GetCellStyle(string sToolTipPath)
{
    Style oCellStyle = new Style(typeof(DataGridCell));
    SetterBaseCollection oSetters = GetStyleSetters(sToolTipPath);
    foreach (Setter oSetter in oSetters)
    {
        oCellStyle.Setters.Add(oSetter);
    }
    return oCellStyle;
}

private static SetterBaseCollection GetStyleSetters(string sToolTipPath)
{
    SetterBaseCollection oSetters = new SetterBaseCollection();
    Setter oTextAlignment = new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Left);
    oSetters.Add(oTextAlignment);
    Setter oTextWrapping = new Setter(TextBlock.TextWrappingProperty, TextWrapping.NoWrap);
    oSetters.Add(oTextWrapping);
    Setter oTextTrimming = new Setter(TextBlock.TextTrimmingProperty, TextTrimming.CharacterEllipsis);
    oSetters.Add(oTextTrimming);
    Setter oToolTip = new Setter(TextBlock.ToolTipProperty, new Binding(sToolTipPath));
    oSetters.Add(oToolTip);
    return oSetters;
}

我無法確切地告訴您問題的原因是什么,除了出於任何XYZ原因,TextTrimming似乎都是特例。 即使嘗試通過XAML進行設置,它也可以在我的自定義DataGrid CellStyle中工作:

<Setter Property="TextBlock.Foreground" Value="Red"/>

雖然這不是:

<Setter Property="TextBlock.TextTrimming" Value="CharacterEllipsis"/>

長話短說,我有一個類似的問題,可能是您通過CodeBehind進行適應的解決方案。 它要求覆蓋DataGrid的AutoGeneratingColumn事件,然后使用自定義列在元素生成時設置TextTrimming屬性。 奇跡般有效。 這是一些應該使您入門的快速偽代碼(在VB中,我很抱歉!):

    Private Sub CustomDataGrid_AutoGeneratingColumn(sender As Object, e As DataGridAutoGeneratingColumnEventArgs) Handles Me.AutoGeneratingColumn
        e.Cancel = True
        Dim binding As New Binding
        Dim textColumn = TryCast(e.Column, DataGridTextColumn)
        If textColumn IsNot Nothing Then
            binding = textColumn.Binding
            binding.TargetNullValue = "-"
        End If
        Columns.Add(New CustomColumn() With {.Header = e.Column.Header, .Binding = binding})
    End Sub

...

Public Class CustomColumn
Protected Overrides Function GenerateElement(cell As DataGridCell, dataItem As Object) As FrameworkElement
    Dim block As New TextBlock()
    Dim column As CustomColumn = DirectCast(cell.Column, CustomColumn)
    Dim binding As Binding = DirectCast(column.Binding, Binding)
    If binding IsNot Nothing Then
        Dim cellBinding As New Binding(binding.Path.Path)
        cellBinding.Source = dataItem
        cellBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
        cellBinding.ValidatesOnDataErrors = True
        cellBinding.ValidatesOnExceptions = True
        cellBinding.NotifyOnValidationError = True
        cellBinding.ValidatesOnNotifyDataErrors = True
        cellBinding.Mode = BindingMode.OneWay
        block.SetBinding(TextBlock.TextProperty, cellBinding)
        block.TextTrimming = TextTrimming.CharacterEllipsis
    End If

    Return block
End Function
End Class

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM