簡體   English   中英

在dataGrid RowDetail wpf中顯示HTML

[英]Display HTML in dataGrid RowDetail wpf

我希望在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>";

現在我想知道如何在textblock中顯示我的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;");
}

}

但沒有成功顯示。 它顯示是這樣的

像這樣

我該如何解決?

在WPF中顯示HTML文檔的唯一方法是使用它的WebBrowser控件。 如果你的網格太大,那么它是非常不推薦的。 它是Edge(IE)瀏覽器中的內置版,消耗大量內存。

但是,如果您想使用它,請參閱此內容

- 編輯 -

好吧,現在這是您正面臨的編碼問題。 是否可以控制您正在顯示的Html內容? 如果是的話,你應該把它放在你的html頭中:

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

如果沒有,您必須在load completed事件中手動設置編碼:

<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();
}

暫無
暫無

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

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