Silverlight - Как создать контроллер контента для выбираемого текста - PullRequest
1 голос
/ 23 июня 2011

все. В моем проекте есть 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. Вы также можете увидеть другие очистки, такие как удаление фрагмента тега и амперсанда.

Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно иметь возможность выбирать текст из элемента управления во время выполнения. Хотя TextBox обычно используется, когда вам нужно выбрать текст из пользовательского интерфейса, он не поддерживает класс Run, поэтому я не могу передать форматирование выделения в UIelement. Я также пытался использовать RichTextBox, но получил сообщение об ошибке разбора xaml, в котором говорится, что элемент управления не может быть создан.

Я видел одну ссылку на stackoverflow и silvelright.net с похожей проблемой, которую пользователь предложил применить стиль к текстовому блоку. Однако, поскольку это отображается в ContentControl, стиль не может быть установлен.

До сих пор я пытался использовать ViewScroller, Textbox и RichTextBox, которые все потерпели неудачу из-за ошибок синтаксического анализа при рендеринге.

Я даже не уверен, выполнимо ли это, учитывая, что я выделяю текст, и мне тоже нужно его выделить. Я бы приветствовал любые предложения или идеи.

Спасибо,

Ответы [ 2 ]

0 голосов
/ 23 июня 2011

Благодарю Энтони за помощь в прохождении этого.Проблема с моей стороны была связана с тегами абзаца.Хотя я вставил их изначально, они были в неправильном месте.

Ниже приведен обновленный код

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

За исключением небольшого форматирования в интерфейсе, это прекрасно работает.

0 голосов
/ 23 июня 2011

Вы хотите показать форматированный текст, который также можно выбрать.Правильный контроль для этого - 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();
    }
}

BTW, dropВаш Mode=TwoWay на привязке не нужен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...