2017-01-15 12 views
1

私はRichTextboxを使用してdataGridのrowDetailsを表示します。ただし、スタイルは表示されません。そのため、削除してTextBlockを使用します。私のXAMLコードは次のとおりです。DataGridにHTMLを表示するRowDetail wpf

<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> 

KalaTozihat .ITへの結合のTextBlockは、以下のように入力します。

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コードを表示することができます方法を知ってほしいです。

編集

私が代わりの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> 

て、コメントを追加し、このコードは

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

}

をmypage.csするのではなく、正常表示されません。これはこのように表示されます

like this

どうすれば修正できますか?

+0

このコードは何ですか? 'KalaClass.KalaTozihat string' – Khoshtarkib

+0

私はKalalClassにDataGridをバインドしています。 KalaTozihatはKalaClassのフィールドです。この文字列は私のテーブルを示すHtmlコードです。 – zfarzaneh

答えて

0

WPFでHTMLドキュメントを表示する唯一の方法は、コントロールのWebBrowserを使用することです。あなたのグリッドが大きすぎる場合は特に勧められません。これは、Edge(IE)ブラウザのビルドであり、多くのメモリを消費します。

ただし、使用する場合は、thisを参照してください。

--Edit--

すべての権利、今、これはあなたが直面している問題をコード化しています。あなたが表示しているHtmlコンテンツを制御できますか?はい、あなたのHTMLのheadでこれを置く必要がある場合:

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

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

、コードで:

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

ない場合は、ロード完了イベントに手動でエンコーディングを設定するようになりました

+0

私はそれを使用しましたが、正常に表示されません。 – zfarzaneh

+0

それはどういう意味ですか? Htmlをチェックし、他のブラウザで開きます。正しく動作する場合は、ドキュメントの内容を正しく設定していません。投稿したリンクの回答を確認してください。 – Emad

+0

私の質問plzを更新しました。 @Emad – zfarzaneh

関連する問題