Silverlight-如何为可选文本创建内容控制器

时间:2011-06-22 21:45:51

标签: silverlight ivalueconverter

所有。我的项目中有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("&", "&amp;");
        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,这些都因渲染时解析错误而全部失败。

我不确定这是否可行,因为我突出显示文本并需要选择它。我欢迎任何建议或想法。

谢谢,

2 个答案:

答案 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("&", "&amp;");
        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("&", "&amp;");
        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中减少一点格式化效果很好。