在dataGrid RowDetail wpf中显示HTML

时间:2017-01-15 14:02:50

标签: c# html wpf xaml datagrid

我希望在dataGrid的rowDetails中使用html代码显示表。首先我使用了RichTextbox。但是它没有显示我的样式。所以我删除它并使用TextBlock。我的XAML代码是:

<Controls:MetroWindow.Resources>
<DataTemplate x:Key="RowDetailTemplate">
        <Grid x:Name="RowDetailGrid"
              Width="470"
              Height="Auto"
              Margin="5">
             <Border HorizontalAlignment="Left"
                    VerticalAlignment="Top"
                    CornerRadius="5">
                <Grid>
                    <TextBlock 
                        Margin="10"
                        HorizontalAlignment="Left"
                        Text="{Binding KalaTozihat}"
                        TextWrapping="WrapWithOverflow" />

                </Grid>
            </Border>
        </Grid>
</DataTemplate>

TextBlock绑定到 KalaTozihat 。填写如下:

KalaClass.KalaTozihat string s = @"<html><head><style>@font - face {font - family: myFirstFont;src: url(SegoeWP.ttf);}table {border - collapse: collapse;width: 100 %;}th, td {padding: 8px;text - align: right;border: 1px solid   #7B68EE;}.t1{width: 30 %;}th{background - color:#B0C4DE;color:#000080;font - size: 20px;font - family: myFirstFont;}tr: nth - child(even){background - color: #f2f2f2}</style ></head><body><h2> جزئیات </h2><table><tr><th> مقدار </th ><th> خصوصیت </th></tr>" +
"<tr><td>" + item.k_Name + "</td><td class=\"t1\"><strong>:نام</strong></td></tr>" +
"<tr><td >" + item.k_Tedad + "</td><td class=\"t1\"><strong>:تعداد</strong></td></tr>" +
"<tr><td >" + item.k_price.ToString() + "</td><td class=\"t1\"><strong>:قیمت واحد</strong></td></tr>" +
"<tr><td >" + item.k_Product_code + "</td><td class=\"t1\"><strong>:Product code</strong></td></tr>" +
"<tr><td >" + item.k_Signal_loss.ToString() + "</td><td class=\"t1\"><strong>:Signal loss</strong></td></tr>" +
"<tr><td >" + item.k_Current.ToString() + "</td><td class=\"t1\"><strong>:Current</strong></td></tr>" +
"<tr><td >" + item.k_Frequency + "</td><td class=\"t1\"><strong>:Frequency</strong></td></tr>" +
"<tr><td >" + item.k_Input_Voltage + "</td><td class=\"t1\"><strong>:Input Voltage</strong></td></tr>" +
"<tr><td >" + item.k_Output_Voltage + "</td><td class=\"t1\"><strong>:Output Voltage</strong></td></tr>" +
"<tr><td >" + item.k_Matching + "</td><td class=\"t1\"><strong>:Matching</strong></td></tr>" +
"<tr><td >" + item.k_info + "</td><td class=\"t1\"><strong>:توضیحات</strong></td></tr></table></body></html>";

现在我想知道如何在文本块中显示我的HTML代码。

修改

我使用webBrowser而不是TextBlock。如下所示:

<Controls:MetroWindow.Resources>
<DataTemplate x:Key="RowDetailTemplate">
        <Grid x:Name="RowDetailGrid"
              Width="470"
              Height="Auto"
              Margin="5">
             <Border HorizontalAlignment="Left"
                    VerticalAlignment="Top"
                    CornerRadius="5">
                <Grid>
                   <WebBrowser local:BrowserBehavior.Html="{Binding KalaTozihat}" />

                </Grid>
            </Border>
        </Grid>
</DataTemplate>

并将此代码添加到mypage.cs

public class BrowserBehavior
  {
      public static readonly DependencyProperty HtmlProperty = DependencyProperty.RegisterAttached(
         "Html",
         typeof(string),
          typeof(BrowserBehavior),
         new FrameworkPropertyMetadata(OnHtmlChanged));

[AttachedPropertyBrowsableForType(typeof(WebBrowser))]
public static string GetHtml(WebBrowser d)
{
    return (string)d.GetValue(HtmlProperty);
}

public static void SetHtml(WebBrowser d, string value)
{
    d.SetValue(HtmlProperty, value);
}

static void OnHtmlChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
    WebBrowser webBrowser = dependencyObject as WebBrowser;
    if (webBrowser != null)
        webBrowser.NavigateToString(e.NewValue as string ?? "&nbsp;");
}

}

但未成功显示。它显示就像这样

like this

我该如何解决?

1 个答案:

答案 0 :(得分:0)

在WPF中显示HTML文档的唯一方法是使用它的WebBrowser控件。如果你的网格太大,那么它是非常不被推荐的。它是Edge(IE)浏览器中的内置版,消耗大量内存。

如果您想使用它,请参阅this

<强> - 编辑 -

好的,现在这是您正面临的编码问题。是否可以控制您正在显示的Html内容?如果是的话,你应该把它放在你的html头中:

<head>
  <meta charset="UTF-8">
</head>

如果没有,您必须在load completed event中手动设置编码:

<Grid>
    <WebBrowser local:BrowserBehavior.Html="{Binding KalaTozihat}" LoadCompleted="WebBrowser_LoadCompleted"/>
</Grid>

在代码背后:

private void WebBrowser_LoadCompleted(object sender, NavigationEventArgs e)
{
    var webBrowser = sender as WebBrowser;
    if(webBrowser == null) {
        return;
    }
    var doc = (IHTMLDocument2)webBrowser.Document;           

    doc.charset = "utf-8";
    webBrowser.Refresh();
}