我希望在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 ?? " ");
}
}
但未成功显示。它显示就像这样
我该如何解决?
答案 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();
}