(readonly)DataGridに一種のリッチテキストを表示したいと思います。基本的なスタイル(太字、斜体)とハイパーリンクが含まれている必要があります。つまり、グリッドセルは DataGridのカスタムHtml TextBlock
<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>
グリッドのサイズを変更しようとすると問題が発生します。その後、ウィンドウ全体が点滅し、アプリケーションがハングアップします。これは毎回起こるわけではありませんが、あなたが十分長く試してみると確かに始まります。
何が原因である可能性がありますか?明らかに間違っていますか?
as advice - 自分で作成したメソッドにブレークポイントを設定し、サイズ変更してどのメソッドが呼び出されたかを確認してください。 – stukselbax
私はいくつかの睡眠を取った後、いくつかのアイデアを持っていました。最初は、幅を「幅」=「*」から幅=「220」に変更することでした。良いニュースは、それが(レンダリングでの無限ループ)やぶら下がりがなくなったことです。だから、DataGridの内部レイアウトロジックを備えたものでなければなりません。 さらに、DataGridにはHeadersVisibility = "Column"がありますが、いくつかの行(ランダムに)が青から行ヘッダーを取得します。私の問題は、DataGridの欠陥が(貧弱な)理解から生じているようです。 ListViewで置き換えようとします。 – BranS