所有。我的项目中有ContentControl绑定到一个返回带有HTML语法的字符串的属性。
控制Xaml
<ContentControl Height="48"
Margin="100,56,223,0"
VerticalAlignment="Top"
Content="{Binding HitContext,
Converter={StaticResource FormatConverter},
Mode=TwoWay}"
Foreground="White" />
你会注意到我在这个控件上有一个Converter属性。本质上,我在返回时评估字符串并删除html并将其替换为xaml以突出显示返回中的关键字。
这是格式转换器代码:
public class HighlightConverter : IValueConverter
{
///<summary>
///Converter class used to evaluate and highlight context string results
///</summary>
///
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string str = value.ToString();
str = str.Replace("&", "&");
str = str.Replace("<fragment>", " ");
str = str.Replace("</fragment>", " ");
str = str.Replace("<hilight>", "<Run Foreground=\"Gold\" FontWeight=\"ExtraBold\" FontSize=\"13\">");
str = str.Replace("</hilight>", "</Run>");
return XamlReader.Load("<TextBlock xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" TextWrapping=\"Wrap\" >" + str + "</TextBlock>");
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
到目前为止这个工作正常。字符串在视图中呈现,并且具有标记“hilight”的单词被转换为在控件内呈现出突出显示的单词作为xaml语法。您还可以看到其他清理,例如删除片段标记和&符号。
我遇到的问题是我需要能够在运行时从控件中选择文本。虽然当您需要从UI中选择文本时通常使用TextBox,但它不支持Run类,因此我无法将高亮格式传递给UIelement。我也尝试使用RichTextBox但是我收到了一个xaml解析错误,指出无法创建控件。
我确实在stackoverflow和silvelright.net上看到了一个类似问题,用户建议在文本块中应用样式。但是,由于这是在ContentControl中呈现的,因此无法设置样式。
到目前为止,我已尝试使用ViewScroller,Textbox和RichTextBox,这些都因渲染时解析错误而全部失败。
我不确定这是否可行,因为我突出显示文本并需要选择它。我欢迎任何建议或想法。
谢谢,
答案 0 :(得分:0)
您想要显示一些也可选择的格式化文本。对此的正确控制是RichTextBox
。我怀疑在您最初尝试使用RichTextBox
时,您未能将最终内容字符串包含在<Paragraph>..</Paragraph>
元素中。 RichTextBox
包含Block
元素集合,例如Paragraph
,其中每个元素都包含文本运行。
您的代码的以下代码可用: -
public class HighlightConverter : IValueConverter
{
///<summary>
///Converter class used to evaluate and highlight context string results
///</summary>
///
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string str = value.ToString();
str = str.Replace("&", "&");
str = str.Replace("<fragment>", " ");
str = str.Replace("</fragment>", " ");
str = str.Replace("<hilight>", "<Run Foreground=\"Gold\" FontWeight=\"ExtraBold\" FontSize=\"13\">");
str = str.Replace("</hilight>", "</Run>");
str = "<RichTextBox xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"><Paragraph>"
+ str
+ "</Paragraph></RichTextBox>";
return XamlReader.Load(str);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
顺便说一下,将Mode=TwoWay
放在绑定上,没有必要。
答案 1 :(得分:0)
感谢安东尼帮我解决这个问题。我这个问题实际上与段落标签有关。虽然我最初插入它们,但我把它们放在了错误的位置。
下面列出的是更新后的代码
public class HighlightConverter : IValueConverter
{
///<summary>
///Converter class used to evaluate and highlight context string results
///</summary>
///
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string str = value.ToString();
str = str.Replace("&", "&");
str = str.Replace("<fragment>", "<Paragraph>");
str = str.Replace("</fragment>", "</Paragraph>");
str = str.Replace("<hilight>", "<Run Foreground=\"Gold\" FontWeight=\"ExtraBold\" FontSize=\"13\">");
str = str.Replace("</hilight>", "</Run>");
return XamlReader.Load("<RichTextBox xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" TextWrapping=\"Wrap\" >" + str + "</RichTextBox>");
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
在UI中减少一点格式化效果很好。