2012-03-06 149 views
3

我正在使用adorner在我的文本框中顯示水印。但是當我將FlowDirection的窗口設置爲RightToLeft時,adorner(這是textblock)中的文本是反向的!WPF中的BUG? Adorner中的TextBlock在FlowDirection是RightToLeft時顯示逆文本

這是一個錯誤,或者我應該改變一些東西嗎?

enter image description here

,這裏是裝飾器的全碼:

namespace Hezareh.Modules.Accounting 
{ 
    using System.Windows; 
    using System.Windows.Controls; 
    using System.Windows.Data; 
    using System.Windows.Documents; 
    using System.Windows.Media; 


    internal class WatermarkAdorner : Adorner 
    { 
     #region Private Fields 

     private readonly ContentPresenter contentPresenter; 

     #endregion 

     #region Constructor 

     public WatermarkAdorner(UIElement adornedElement, object watermark) : 
      base(adornedElement) 
     { 
      this.IsHitTestVisible = false; 
      this.contentPresenter = new ContentPresenter(); 
      this.contentPresenter.Content = watermark; 
      this.contentPresenter.Opacity = 0.5; 
      this.contentPresenter.Margin = new Thickness(Control.Margin.Left + Control.Padding.Left, Control.Margin.Top + Control.Padding.Top, 0, 0); 
      if (this.Control is ItemsControl && !(this.Control is ComboBox)) 
      { 
       this.contentPresenter.VerticalAlignment = VerticalAlignment.Center; 
       this.contentPresenter.HorizontalAlignment = HorizontalAlignment.Center; 
      } 

      // Hide the control adorner when the adorned element is hidden 
      Binding binding = new Binding("IsVisible"); 
      binding.Source = adornedElement; 
      binding.Converter = new BooleanToVisibilityConverter(); 
      this.SetBinding(VisibilityProperty, binding); 
     } 

     #endregion 

     #region Protected Properties 

     protected override int VisualChildrenCount 
     { 
      get { return 1; } 
     } 

     #endregion 

     #region Private Properties 

     private Control Control 
     { 
      get { return (Control)this.AdornedElement; } 
     } 

     #endregion 

     #region Protected Overrides 

     protected override Visual GetVisualChild(int index) 
     { 
      return this.contentPresenter; 
     } 

     protected override Size MeasureOverride(Size constraint) 
     { 
      // Here's the secret to getting the adorner to cover the whole control 
      this.contentPresenter.Measure(Control.RenderSize); 
      return Control.RenderSize; 
     } 

     protected override Size ArrangeOverride(Size finalSize) 
     { 
      this.contentPresenter.Arrange(new Rect(finalSize)); 
      return finalSize; 
     } 

     #endregion 
    } 

} 

,我使用它:

 <toolkit:AutoCompleteBox Margin="5" Text="" Name="searchCategoriesTextBox"> 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="TextChanged"> 
        <i:InvokeCommandAction Command="{Binding SearchCommand}" /> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
      <local:WatermarkService.Watermark> 
       <TextBlock TextAlignment="Left" Text="جستجو" FontFamily="Tahoma" Margin="3, -3, 3, 0" /> 
      </local:WatermarkService.Watermark> 
     </toolkit:AutoCompleteBox> 

在此先感謝 :)

+0

你是說它將它反轉兩次,或者你不希望水印反轉?對我來說它看起來是正確的......你在你的代碼中發佈了一些文本,然後它設置了方向RightToLeft(它反轉了它)。 – 2012-03-06 21:20:02

+0

文字不應該被顛倒! FlowDirection只是反向控制窗口中的對齊,僅此而已!我不希望水印反轉 – Jalal 2012-03-06 21:26:14

+0

那麼,看看Adorner.cs源代碼,有一個關於「Bug 1383424」的評論。我無法理解,如果這是一個已知的錯誤或修復該錯誤...如果它是一個錯誤,嘗試明確地設置'TextBlock'上的FlowDirection到'LeftToRight',看看是否有效? – 2012-03-06 21:57:50

回答

2

那麼,最後我發現了另一個解決方案來解決這個問題。我用RenderTransofrm鏡像內部裝飾器像這樣控制:在控制的中心

<local:WatermarkService.Watermark> 
     <TextBlock Name="watermarkTextBox" 
        Text="{x:Static resources:Resources.SearchCodingTreeView}" 
        RenderTransformOrigin="0.5,0.5" TextAlignment="Right"> 
     <TextBlock.RenderTransform> 
      <ScaleTransform ScaleX="-1" /> 
     </TextBlock.RenderTransform> 
     </TextBlock> 
    </local:WatermarkService.Watermark> 

RenderTransformOrigin="0.5,0.5"放樞軸和ScaleX="-1"倒裝它水平。

0

我認爲我有在我執行操作時在MSDN上看到了Adorner的一些錯誤問題ome對裝飾者的研究(我從來沒有用過,因爲他們不適合我的需求)。

我無法找到討論裝飾問題的鏈接,但我很確定它在那裏。

+0

mmm,如果它是一個錯誤,所以我應該使用TextBlock的圖像狀態。這是糟糕的想法,但只有一個 – Jalal 2012-03-06 21:27:45

+0

我不是100%地肯定這個確切的錯誤,但即時通訊相當肯定1年前我讀了一些東西abouf問題與裝飾器,我相信有大約從右至左的一些問題。所以這可能是它。 – squelos 2012-03-06 23:10:05

+0

我提出它作爲一個錯誤的位置:http://connect.microsoft.com/VisualStudio/feedback/details/729341/textblock-inside-adorner-display-inverse-text-when-flowdirection-is-righttoleft#details – Jalal 2012-04-03 18:48:57