【问题标题】:how to add emoticons(smileys) into WPF richtext box如何将表情符号(笑脸)添加到 WPF 富文本框中
【发布时间】:2011-04-10 03:19:06
【问题描述】:

我有一个带有输入文本框和输出富文本框的 WPF IM 聊天窗口。我想在富文本框中呈现输入文本。当用户在带有一些文本的文本块中输入像 :) 这样的笑脸符号时,我想用预定义的笑脸图像替换该文本笑脸并在富文本框中呈现。它与 gtalk 聊天窗口行为非常相似。

我该怎么做? 在此先感谢:-)

【问题讨论】:

    标签: wpf richtextbox emoticons


    【解决方案1】:

    你可以在下面使用这个表情功能:

        #region add emotion to RichTextBox function
    
        private Dictionary<string, string> _mappings = new Dictionary<string, string>();
    
        private string GetEmoticonText(string text)
        {
            string match = string.Empty;
            int lowestPosition = text.Length;
    
            foreach (KeyValuePair<string, string> pair in _mappings)
            {
                if (text.Contains(pair.Key))
                {
                    int newPosition = text.IndexOf(pair.Key);
                    if (newPosition < lowestPosition)
                    {
                        match = pair.Key;
                        lowestPosition = newPosition;
                    }
                }
            }
    
            return match;
    
        }
        // And also function which add smiles in richtextbox, here is it:
    
        private void Emoticons(string msg,Paragraph para )
        {
            //try
            //{
    
    
           // Paragraph para = new Paragraph { LineHeight = 1 };
    
            Run r = new Run(msg);
    
            para.Inlines.Add(r);
    
            string emoticonText = GetEmoticonText(r.Text);
    
            //if paragraph does not contains smile only add plain text to richtextbox rtb2
            if (string.IsNullOrEmpty(emoticonText))
            {
                rtbConversation.Document.Blocks.Add(para);
            }
            else
            {
                while (!string.IsNullOrEmpty(emoticonText))
                {
    
                    TextPointer tp = r.ContentStart;
    
                    // keep moving the cursor until we find the emoticon text
                    while (!tp.GetTextInRun(LogicalDirection.Forward).StartsWith(emoticonText))
    
                        tp = tp.GetNextInsertionPosition(LogicalDirection.Forward);
    
                    // select all of the emoticon text
                    var tr = new TextRange(tp, tp.GetPositionAtOffset(emoticonText.Length)) { Text = string.Empty };
    
                    //relative path to image smile file
                    string path = _mappings[emoticonText];
    
                    Image image = new Image
                    {
                        Source =
                            new BitmapImage(new System.Uri(Environment.CurrentDirectory+path,
                                                    UriKind.RelativeOrAbsolute)),
                        Width = Height = 25,
                    };
    
                    //insert smile
                    new InlineUIContainer(image, tp);
    
                    if (para != null)
                    {
                        var endRun = para.Inlines.LastInline as Run;
    
                        if (endRun == null)
                        {
                            break;
                        }
                        else
                        {
                            emoticonText = GetEmoticonText(endRun.Text);
                        }
    
                    }
    
                }
                rtbConversation.Document.Blocks.Add(para);
    
            }
        }
    
    // ///
       private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            _mappings.Add(@"s-]", "/Images/smiley/silly.png");
            _mappings.Add(@":-|", "/Images/smiley/angry.png");
        }
    
        //Call function to use
         private void SendMessage(object sender,RoutedEventArgs e)
        {
    
            Paragraph paragraph = new Paragraph();
            paragraph.LineHeight = 1;
    
            Run name = new Run();
            name.Text =rtbMessage.Text+ " : ";
            name.Foreground = new SolidColorBrush(Colors.Red);
            paragraph.Inlines.Add(new Bold(name));
            //paragraph.Inlines.Add(new Run(name.text));
            rtbConversation.Document.Blocks.Add(paragraph);
            Emoticons(name.Text, paragraph);
            rtbConversation.ScrollToEnd();
    
        }
    

    【讨论】:

    • 感谢您的帮助。我已经在去年使用与此类似的代码解决了这个问题。这是一个很好的解决方案。谢谢ppp!
    【解决方案2】:

    应该是这样的

    使用内嵌图像显示文本

    使用文件隐藏代码你可以做同样的事情

        //Create a new RichTextBox.
        RichTextBox MyRTB = new RichTextBox();
    
        // Create a Run of plain text and image.
        Run myRun = new Run();
        myRun.Text = "Displaying text with inline image";
        Image MyImage = new Image();
        MyImage.Source = new BitmapImage(new Uri("flower.jpg", UriKind.RelativeOrAbsolute));
        MyImage.Height = 50;
        MyImage.Width = 50;
        InlineUIContainer MyUI = new InlineUIContainer();
        MyUI.Child = MyImage;
    
        // Create a paragraph and add the paragraph to the RichTextBox.
        Paragraph myParagraph = new Paragraph();
        MyRTB.Blocks.Add(myParagraph);
    
        // Add the Run and image to it.
        myParagraph.Inlines.Add(myRun);
        myParagraph.Inlines.Add(MyUI);
    
        //Add the RichTextBox to the StackPanel.
        MySP.Children.Add(MyRTB);
    

    【讨论】:

    • 这非常接近答案。但我会将“ppp”答案标记为正确,因为它有完整的代码。无论如何感谢您的帮助。
    【解决方案3】:

    这并不容易。一般方法是监视富文本框输入,找到所有表情符号并用图像替换它们:将您发现微笑的Run 分解为SpanRunsImages。例如

      <RichTextBox>
        <FlowDocument>
         <Paragraph>
          <!-- Before -->
          <Run>Hello :) world!</Run>
          <!-- After -->
          <Span>
             <Run Text="Hello"/>
             <Image Width="16" Source="http://kolobok.us/smiles/light_skin/smile.gif"/>
             <Run Text=" world"/>
           </Span>
         </Paragraph>
        </FlowDocument>
     </RichTextBox>
    

    希望这会有所帮助。

    【讨论】:

    • 好的,在聊天窗口中,我们也应该附加以前的聊天。那么我该如何使用代码来做到这一点?不是 xaml。
    猜你喜欢
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多