RichTextBox How To!

Hi,

I have searched the net and the documentation that shipped with Beta 2 and have not found any results or information that was able to aid me.  Hopefully there are some RichTextBox experts that could please help me with the following things:

  1. How can I make the RichTextBox single line   (this was possible in Win32, and no, changing the control template to a textbox does not work!  Because then it essentially is a textbox!)
  2. Why is it so difficult to control drag/drop operations in both the textbox and RichTextBox   I would like to control over what is dropped onto the textbox, for instance if images is dropped or texted I would like to be able to
  3. Is it possible when doing a drag/drop operation, I detect my own data type, and then insert an InlineUIContainer exactly where the CaretPosition was when I dropped the data in to the RichTextBox

I know this is a lengthy request, but if I can achieve this, I would be very happy.

Thank you,

Jaco

 



Answer this question

RichTextBox How To!

  • Dmitriy Vasyura - MSFT

    Thanks again, but I have tried it that way but I get an Exception stating that the object is frozen, so the data cannot be modified. Any idea how to go around that


  • zinggm

    oops forgot about the first question :) ... you could do the following

    private void PasteEvent(object sender, DataObjectPastingEventArgs e)

    {

    e.FormatToApply = DataFormats.Text;

    string d = e.DataObject.GetData(DataFormats.Text,true) as string;

    d = d.Replace("\r\n", " ");

    e.DataObject.SetData(DataFormats.Text, d, true);

    }


  • Naximus

    issue 1 is a bug. Thanks for pointing out  that a newline is pasted even after setting AcceptsReturn=false.
  • TheSavage4

    Yes but it doesn't add it at the position that the drag event triggers, e.g if you drag text, you can drag it and a lighter cursor appears showing where the text wil be dropped. Dropping a UIElement inserts it where the "real" cursor is.


  • Dmarq

    Thank you very much! It works!

    If I could get answers to 2 more questions then I am settled.

    1.  I know you said it was a bug, but for now, is there a workaround that I can remove newline characters from text that will be dropped I have tried setting the e.DataObject but it seems the object is frozen for text data.

    2.  When adding the XAML like the example you  have just shown me, is it possible to have a Canvas as the top element

    Thank you very much for you're time,

    Jaco


  • Ranbla

    within the span you can have a canvas.. that should work.
  • Gorav

    Thank you for all you're help so far. So the bug-fix wil probably only be available in the next release of WinFX Or wil there be a hot-fix available

    "richTextBox.CaretPosition.Paragraph.Inlines.Add(uic);" is exactly what I did. (even tried InlineContainer(element, textPointer) )

    But it seems to insert it at the last position of the cursor, not at the semi-transparent cursor which appears when dragging into the control.


  • Myoest1

    That works until you paste data that contains a line break. Then the whole thing is busted. But because you cannot stop the text from being dropped, I actually have to parse the string by removing the spaces, removing the text that was dropped, and adding the parsed text. And this is really unsatisfactory.


  • Venkatesh Mookkan

    this should do the trick.

    rtb.AddHandler(DataObject.PastingEvent, new DataObjectPastingEventHandler(PasteEvent), true);

    private void PasteEvent(object sender, DataObjectPastingEventArgs e)

    {

    string [] dataFormats = e.DataObject.GetFormats();

    foreach (String str in dataFormats)

    {

    if (str == DataFormats.Xaml)

    {

    string data = "<Span xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xml:space=\"preserve\" xml:lang=\"en-us\"><InlineUIContainer><TextBox/></InlineUIContainer></Span>";

    e.DataObject.SetData(DataFormats.Xaml, data, true);

    }

    }

    }


  • fellobo

    did you try setting AcceptsReturn=false

  • Virtue

    If there is no content then the InlineUIContainer would be added as a BlockUIContainer - that explans the whole line behavior.


  • youju01

    If there is no content in the RichTextBox, the first span takes up the whole line and does not display the Canvas inside, but if there is already at least a character present, the Canvas is added with the right width.  Any idea why   

    That said, is there any way to disable the default shortcut keys for enabling formatting in a RichTextBox, e.g Ctrl+b triggers bold, Ctrl+i triggers italics, etc.

    Will there be a fix for the error associated with the AcceptsReturn=false property

    Thank you very much,

    Jaco

     


  • Dataplex Systems Maz

    you can use the DataObjectPastingEventHandler to determine the format you want to paste

    HTH


  • dhirajdewani

    you can get the caretposition and from that we can add our UIElements. I was able to drag and drop my custom UIElement , I used

    richTextBox.CaretPosition.Paragraph.Inlines.Add(uic);



  • RichTextBox How To!