Hello everyone,

Have you ever tried using the following BiDirectional (Disclaimer: The content linked here is not from Microsoft: http://en.wikipedia.org/wiki/Bi-directional_text http://unicode.org/reports/tr9/) control characters in WPF?

  • LRM (U+200E, Left-To-Right Mark)
  • LRE (U+202A, Left-To-Right Embedding)
  • LRO (U+202D, Left-To-Right Override)
  • PDF (U+202C, Pop Directional Formatting)

If the answer is yes, you will have noticed that WPF is completely ignoring them. (That is: It is ignoring all except for the LRM mark, which only works when the Language is set to "en-US"!)
Silverlight, on the other hand, does regard them and renders the affected text correctly.

Here is a comparison, first in WPF and then in Silverlight:

Windows Presentation Foundation Silverlight

 

I used exactly the same code for both examples. (Please note that I replaced the real BiDi control characters with bold text (e.g. [LRM]), to avoid confusion and compatibility issues.)

<StackPanel FlowDirection="RightToLeft" Language="fa-IR">
    <StackPanel Margin="10">
        <TextBlock  FlowDirection="LeftToRight">LRM</TextBlock>
        <TextBlock>[LRM]0 [LRM]1 [LRM]2 [LRM]3 [LRM]4 [LRM]5 [LRM]6 [LRM]7 [LRM]8 [LRM]9</TextBlock>
    </StackPanel>
    <StackPanel Margin="10">
        <TextBlock FlowDirection="LeftToRight">LRE & PDF</TextBlock>
        <TextBlock>[arabic text][LRE]?0 1 2 3 4 5 6 7 8 9[PDF][arabic text]</TextBlock>
    </StackPanel>
    <StackPanel Margin="10">
        <TextBlock FlowDirection="LeftToRight">LRO</TextBlock>
        <TextBlock>[LRO]0 1 2 3 4 5 6 7 8 9</TextBlock>
    </StackPanel>
</StackPanel>

 

Note how WPF does change the way it treats the LRM character when you set the Language attribute to en-US:

Windows Presentation Foundation

 

However curious this may seem: This is actually not a bug, but desired behavior!

The reason for the difference is that WPF offers a different, higher-level way of implementing bidirectional text, to enable the implementation of RichText controls. (See here for a detailed guide on BiDi in WPF: http://msdn.microsoft.com/en-us/library/aa350685.aspx

The correct implementation (in WPF) for the example above would look like this:

<StackPanel FlowDirection="RightToLeft" Language="fa-IR">
    <StackPanel Margin="10">
        <TextBlock  FlowDirection="LeftToRight">LRM</TextBlock>
        <TextBlock><Span FlowDirection="LeftToRight">0 1 2 3 4 5 6 7 8 9</Span></TextBlock>
    </StackPanel>
    <StackPanel Margin="10">
        <TextBlock FlowDirection="LeftToRight">LRE & PDF</TextBlock>
        <TextBlock>[arabic text]<Run FlowDirection="LeftToRight">0 1 2 3 4 5 6 7 8 9</Run>[arabic text]</TextBlock>
    </StackPanel>
    <StackPanel Margin="10">
        <TextBlock FlowDirection="LeftToRight">LRO</TextBlock>
        <TextBlock><Run FlowDirection="LeftToRight">0 1 2 3 4 5 6 7 8 9</Run></TextBlock>
    </StackPanel>
</StackPanel>

 

I hope this was helpful!

Cheers,
Helge Mahrt