Пользовательский HTML TextBlock в DataGrid - PullRequest
2 голосов
/ 13 марта 2012

Я хотел бы отобразить вид расширенного текста в (только для чтения) DataGrid.Он должен включать базовые стили (полужирный, курсив) и гиперссылки, то есть ячейка сетки должна принимать что-то вроде:

<a>Here</a> and <a>also here</a> you can find <b>stuff<b>
и отображать его так, как если бы он был html.Конечно, данные поступают из базы данных, поэтому все должно быть привязано.

После попытки исправить соответствующий шаблон или стиль я отказался и попытался создать пользовательский элемент управления.Управление было довольно простым:

public class SmartTextBlock : TextBlock
{
    public static readonly DependencyProperty HtmlProperty = DependencyProperty.Register("Html", typeof(string), typeof(SmartTextBlock), new UIPropertyMetadata(null, new PropertyChangedCallback(OnHtmlChanged)));

    public string Html
    {
        get { return GetValue(HtmlProperty) as string; }
        set { SetValue(HtmlProperty, value); }
    }

    static void OnHtmlChanged(DependencyObject target, DependencyPropertyChangedEventArgs e) {
        SmartTextBlock control = target as SmartTextBlock;
        control.createParts(e.NewValue as string);
    }

    void createParts(string text) {
        Inlines.Clear();
        /* parse text and add some Inlines */
    }
}

Все прошло хорошо, и управление хорошо отображается.Он был плавно добавлен в сетку как:

<DataGridTemplateColumn Width="*" Header="Line">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <controls:SmartTextBlock Html="{Binding Path=Html}" TextWrapping="Wrap" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

Проблема в том, что я пытаюсь изменить размер или прокрутить сетку.Затем все окно начинает мигать и приложение зависает!Это происходит не каждый раз, но если вы попытаетесь достаточно долго, это начнется наверняка.

Есть идеи, что может быть причиной этого, какую очевидную ошибку я упускаю из виду?

1 Ответ

0 голосов
/ 20 марта 2012

Мне наконец удалось решить проблему.Кажется, это происходит из самой DataGrid !!

DataGrid имел HeadersVisibility="Column", и когда я установил RowHeaderWidth="0", проблема исчезла.

Не знаю, была ли это основной причиной, но она определенно ее решила.

...