![](/img/trans.png)
[英]Passing DataGrid to ContentControl over RowDetail not working as expected
[英]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 ?? " ");
}
}
但沒有成功顯示。 它顯示是這樣的
我該如何解決?
在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.