2012-05-12 5 views
2

私はそうのようにWPFでTextBoxを持っている:長いラインマーカーを使用してWPF TextBoxを強化しますか?

enter image description here

今、私は達成するために必要なものを明確にし、素敵な長いラインマーカーを持つことである:このようになりますが、特別な

<TextBox Height="48" /> 

ナッシングだから、基本的には私が描きたい

enter image description here

位置50のラインマーカー。固定幅フォントを使用して、これを簡単にして、位置を簡単に計算できるようにします。

今のところ、入力を制限したくないのですが、50文字の制限に達したときに視覚的な接着剤を付けたいと思っています。

事項は困難にするために、私はのように次の行/列(72文字)が高くなるようにこの制限を必要とする:

enter image description here

同じ位置を共有するラインマーカー(行2 - N )は、複数ではなく1つの行になる可能性があります。

私は他の提案も受け付けていますが、ユーザーに限界を超えようとしていることをきれいに伝えている限り、私はそれを涼しくしています。

注:「あなたはx個の文字が残っています」というテキストは表示されません。スペースは限られており、私はそれを視覚的にしたい。

アップデート:ツールチップを追加することができれば本当に感謝します。マーカーをホバーするとその目的がユーザーに伝わるようにしてください。

+0

の背後にあるコード。私はこれが解決策ではないことを知っていますが、それは可能な代替手段です...ああ、あなたはWPFでWinFormsコントロールを使用することができます、私は信じています... – caesay

答えて

3

あなたが視覚的にテキストボックスを飾りたいので、まず私の頭に浮かぶのは、Adnornerという名前です。

私はテキストボックスを飾る方法を示す簡単なデモを書いています。線の描画部分は簡単ですが、微妙な部分は線の描画場所を把握することです。私は私の例では線の位置をコード化した。私はテキストの高さを調べるために何らかのテキストを測定しなければならないと考えていました。ここで

enter image description here

XAMLです:

<Window x:Class="WpfApplication4.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" > 
     <AdornerDecorator> 
      <TextBox TextWrapping="Wrap" AcceptsReturn="True" x:Name="myTextBox" Width="200px" Height="200px">hello</TextBox> 
     </AdornerDecorator> 
    </Grid> 
</Window> 

、あなたは簡単にリサイズのTextBoxのドローイベントをオーバーライドすることによってそれを行うことができ

using System.Windows; 
using System.Windows.Documents; 
using System.Windows.Media; 

namespace WpfApplication4 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      AdornerLayer myAdornerLayer = AdornerLayer.GetAdornerLayer(myTextBox); 
      myAdornerLayer.Add(new LineAdorner(myTextBox)); 
     } 

     // Adorners must subclass the abstract base class Adorner. 

     #region Nested type: LineAdorner 

     public class LineAdorner : Adorner 
     { 
      // Be sure to call the base class constructor. 
      public LineAdorner(UIElement adornedElement) 
       : base(adornedElement) 
      { 
      } 

      // A common way to implement an adorner's rendering behavior is to override the OnRender 
      // method, which is called by the layout system as part of a rendering pass. 
      protected override void OnRender(DrawingContext drawingContext) 
      { 
       var adornedElementRect = new Rect(AdornedElement.DesiredSize); 

       var renderPen = new Pen(new SolidColorBrush(Colors.Red), 1.5); 

       // Draw lines. 
       drawingContext.DrawLine(renderPen, 
             new Point(adornedElementRect.TopLeft.X + 75, adornedElementRect.TopLeft.Y), 
             new Point(adornedElementRect.TopLeft.X + 75, adornedElementRect.TopLeft.Y + 20)); 
       drawingContext.DrawLine(renderPen, 
             new Point(adornedElementRect.TopLeft.X + 120, adornedElementRect.TopLeft.Y + 20), 
             new Point(adornedElementRect.TopLeft.X + 120, adornedElementRect.TopLeft.Y + 40)); 
       drawingContext.DrawLine(renderPen, 
             new Point(adornedElementRect.TopLeft.X + 120, adornedElementRect.TopLeft.Y + 40), 
             new Point(adornedElementRect.TopLeft.X + 120, adornedElementRect.TopLeft.Y + 60)); 
      } 
     } 

     #endregion 
    } 
} 
+0

私は行を追加し続ける場合、どのようにライン? – Tower

+0

それに応じてOnRenderのオーバーライドを実装します。線の描画方法に関する情報を保持するデータ構造体を宣言し、それをAdornerクラスのメンバ変数としてインスタンス化することができます。次に、テキストボックスのテキストが変更されたら、このデータ構造を更新します。OnRenderは、データ構造体のメンバーの内容に従って描画します。 –

+0

あなたは、何かについてユーザーに知らせるために、線のマークをホバーするとき、ツールチップを表示することはどういうわけか考えていますか? – Tower

関連する問題