Изображение Richtextbox с переплетом не работает - PullRequest
1 голос
/ 29 ноября 2011

Перейти Отредактировано

Поскольку свойство Xaml RichTextbox не является свойством зависимости, я создал настраиваемый RichTextbox, где я могу взаимодействовать с его свойством xaml:

<local:RichTextUserControl RtfXaml="{Binding Path=Text, Converter={StaticResource RichTextBoxContentConverter}}" />

и я связываю следующий текст со свойством xaml, и он работает нормально:

<Section xml:space=\"preserve\" HasTrailingParagraphBreakOnPaste=\"False\" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">
   <Paragraph FontSize=\"20\" FontFamily=\"Segoe WP\" Foreground=\"#FFFFFFFF\" FontWeight=\"Normal\" FontStyle=\"Normal\" FontStretch=\"Normal\" TextAlignment=\"Left\">
      <Run Text=\"Some text without formatting\" />
      <Italic>Some italic text</Italic> 
      <Underline>I am UnderLined</Underline>
   </Paragraph>
</Section>

Я связываюсь с ним через конвертер, где я ищу смайлики (например, :);): D и так далее ...) и заменяя их изображениями, и если я вставляю следующий код где-то между текстом абзаца, он вылетает:

<InlineUIContainer>
    <Image Source="ApplicationIcon.png"/>
</InlineUIContainer>

(Это исключение только в том случае, еслипереплет)

Отредактировано :

Итак, я обнаружил, что это плохой подход, и я начал реализовывать его следующим образом:

<RichTextBox Tag="{Binding Path=MessageText}" TextWrapping="Wrap" Loaded="loaded"/>

        private void loaded(object sender, RoutedEventArgs e)
        {
                var richTextBox= sender as RichTextBox;
                Object o = XamlReader.Load(string.Format(XamlTemplate, richTextBox.Tag.ToString()));
                var section = o as Section;
                if (section  != null)
                {
                    richTextBox.Blocks.Clear();
                    var tempBlocks = section.Blocks.ToList();
                    section.Blocks.Clear();
                    foreach (Block block in tempBlocks)
                        richTextBox.Blocks.Add(block);
        }

private const string XamlTemplate = "<Section xml:space=\"preserve\" HasTrailingParagraphBreakOnPaste=\"False\" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"><Paragraph FontSize=\"20\" FontFamily=\"Segoe WP\" Foreground=\"#FFFFFFFF\" FontWeight=\"Normal\" FontStyle=\"Normal\" FontStretch=\"Normal\" TextAlignment=\"Left\"><Run Text=\"{0}\" /><Image Source=\"ApplicationIcon.png\" Width=\"15\" Height=\"15\"/></InlineUIContainer> </Paragraph></Section>";

Поэтому я анализирую Xaml для загруженного события текстовых полей, с текстом и строкой.XamlTemplate - это жестко закодированный текст с шаблоном смайлика.

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

Но когда я изменяю элементы списка на фиксированный размер, он работает нормально, но мне нужно динамически менять размеры элементов, есть идеи?

Ответы [ 2 ]

1 голос
/ 30 октября 2012

Попробуйте с этим кодом.

    private Regex rxForbidden = new Regex(@"[<;]", RegexOptions.IgnoreCase);
    string[] stringArray;

    private void richTextbox_Loaded(object sender, RoutedEventArgs e)
    {
         var richTextBox= sender as RichTextBox;
         string t = richTextBox.Tag.ToString();
         Paragraph myParagraph = new Paragraph();

         if (rxForbidden.IsMatch(t))
         {
             s = rxForbidden.Split(t);
             richTextBox.Blocks.Add(myParagraph);

             for (int i = 0; i < s.Count(); i++)
             {

                 if (s[i] != null && s[i] != "")
                 {
                     Run txt = new Run();
                     txt.Text = s[i];
                     myParagraph.Inlines.Add(txt);

                 }
                 else
                 {
                     Image MyImage = new Image();
                     MyImage.Source = new BitmapImage(new Uri("/RichTextBoxText;component/smiley_72x72.png", UriKind.Relative));
                     MyImage.Height = 30;
                     MyImage.Width = 30;
                     InlineUIContainer MyUI = new InlineUIContainer();
                     MyUI.Child = MyImage;
                     myParagraph.Inlines.Add(MyUI);
                 }
             }
             richTextBox.Blocks.Add(myParagraph);
         }
0 голосов
/ 01 декабря 2011

Я думаю, что ваш URI изображения недействителен.Это должно быть что-то вроде:

<InlineUIContainer>
    <Image Source="/YourApplication;component/ApplicationIcon.png"/>
</InlineUIContainer>
...