2010-07-20 41 views
2

我正在嘗試使用WrapPanel和兩個TextBlocks將星號(*)附加到某些文本的左側,允許文本換行並強制文本右對齊。我已經成功地完成了創建一個WrapPanel,並將FlowDirection設置爲RightToLeft並添加我的文本,然後添加星號。但是,如果我使用的文本恰好在行的末尾有任何非字母數字字符,它會被莫名地強制到行的前面。我覺得這種行爲很奇怪。我認爲它必須是WPF中的錯誤,而不是預期的行爲。使用WPF WrapPanel環繞和右對齊文本 - WPF Bug?

例與文本=普通文本(其它文本):

Expected: 
* Normal Text (Other 
       Text) 
Actual: 
* Normal Text (Other 
       (Text 

隨意使用下面的示例代碼重現問題的自己。只需將它放在Height和Width = 100的窗口中,然後在TextBox中輸入「Normal Text(Other Text)」。或者,將「高度」和「寬度」設置爲您喜歡的任何內容,並編寫足夠的文本以強制文本包裝,然後在最後添加標點符號。

示例代碼:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition /> 
     <RowDefinition /> 
    </Grid.RowDefinitions> 
    <TextBox Name="input" /> 
    <WrapPanel Grid.Row="2" FlowDirection="RightToLeft"> 
     <TextBlock Text="{Binding ElementName=input, Path=Text}" TextWrapping="Wrap"/> 
     <TextBlock Text="*" Margin="0,0,3,0"/> 
    </WrapPanel> 
</Grid> 

所以,我的問題(一個或多個)。

  • 這是一個錯誤,或者這是打算?
  • 如果這是一個錯誤,我應該以某種方式將它提交給微軟嗎?怎麼樣?

自從開始這篇文章後,我決定將兩個TextBlocks放在兩列網格中。將包含TextBlock的非星號配置爲使用正確的TextAlignment,無論如何,我都滿足了我的所有要求。不過,我發現這是一個有趣的問題。

回答

3

試試這個:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition /> 
     <RowDefinition /> 
    </Grid.RowDefinitions> 
    <TextBox Name="input" /> 
    <WrapPanel Grid.Row="2" HorizontalAlignment="Right" > 
     <TextBlock Text="*" Margin="0,0,3,0"/> 
     <TextBlock Text="{Binding ElementName=input, Path=Text}" TextWrapping="Wrap"/> 

    </WrapPanel> 
</Grid> 

的FlowDirection是用於支持被讀取從右到左的語言。由於我不知道這樣的語言的規則,我不會假裝理解爲什麼你看到你是什麼,或者它是一個錯誤。這就是說我知道改變FlowDirection並不是正確對齊左邊到右邊語言的正確方法,你應該使用Horizo​​ntalAlignment來代替。

+0

很棒!像我的RightToLeft FlowDirection這樣複雜的邏輯經常出現這種情況,有一種更簡單的方法來做到這一點。我比我描述的網格更喜歡它。 是否值得我的時間向微軟報告這種奇怪的行爲? – Drew 2010-07-20 15:22:34

+1

@Drew看起來像是預期的行爲。正如我所說,我實際上並不知道這件事,但有一點谷歌搜索發現這個鏈接:http://www.i18nguy.com/markup/right-to-left.html – 2010-07-20 16:14:58

+0

我不能說我真的理解將語言從左向右改爲從右向左的規則,但我被賣出這是意圖行爲。做得好。 – Drew 2010-07-20 18:12:57

3

在.NET 4中(以供將來參考您通過Connect site提交Bug微軟)(WPF4)運行的綁定,所以你可以嘗試像這樣:

<TextBlock TextAlignment="Right" TextWrapping="Wrap"> 
    <Run Text="*" /><Run Text="{Binding ElementName=Input, Path=Text}" /> 
</TextBlock> 

兩個運行元素位於同一行,因爲標籤邊界之間的任何類型的空白都將導致兩次運行之間出現空間。 (就像HTML一樣)。