2011-09-30 8 views
2

OnRenderメソッドをオーバーライドするカスタムTextBoxがあります。残念ながら、グリッドに143-145個以上のテキストボックスを追加すると、OnRenderが正しく動作しません。OnRenderメソッドは144個以上のコントロールでは機能しません

これは、wpfデザイナーのような160個のテキストボックスを持つウィンドウです。各TextBoxは、OnRenderメソッドでボーダーブラシを赤に設定します。テキストボックスの最後の列については、OnRenderはもう動作しません。

render test example http://s3.postimage.org/id6jvq09n/render_Test_Example.png

問題は、同じことが、実行時に起こる、WPFデザイナにバインドされていません。面白いことに、デザイナー内のあるコンポーネントを削除したり、レンダリングされたら実行時に削除したりすると、他のすべてのコントロールが突然動作します。

コード例:

MytextBox.cs
RenderTestPanel.xaml
RenderTestPanel.xaml.cs

+2

本当に多くのテキストボックスを表示する必要はありますか? TextBlocksを使用してみて、ユーザーがセルを編集することを選択した場合にのみTextBoxを表示してください。 TextBlocksははるかに軽量です。 –

+0

Chibacityのコメントに加えて、スタイルを使って 'BorderBrush'を赤色に設定してみませんか?また、何回も呼び出される「OnRender」の代わりに、コンストラクタでブラシを赤に設定します。 – Rachel

+1

@chibacityはい、多くのテキストボックスを表示する必要があります。古いシステムのマップをc#パネルに変換しています。これらの古いマップには、たとえば10x15の修正可能なテキストフィールドのグリッドが含まれています。彼らはテキストフィールドで作られたテーブルのようです。 – Markus

答えて

0

あなたのアプローチはchibacityによって提案されたものでなければなりません。このタイプの動作は標準であり、WPFに付属のDataGridTextColumnでも使用されます。 MSDNから:コメントの中で他の多くのユーザーによって示唆されているように

DataGridTextColumn creates a TextBlock element in the non-editing mode and a TextBox element in the editing mode.

また、あなたはコントロールの外観を調整しないオーバーライドOnRender必要があります。 WPFでは、コントロールの外観を変更するには、コントロールのStyleおよび/またはTemplateを調整します。

<Style TargetType="TextBox"> 
    <Setter Property="BorderBrush" Value="Red" /> 
</Style> 

あなたが唯一の「派生し、オーバーライド」あなたがコントロールの機能および/または目的を拡張しているとき、何があなたの例ではありません必要があります:あなたのOnRenderオーバーライドとまったく同じ外観の変更で次のスタイル結果それはあなたがやっていることを示唆しています。

また、RenderTestPanel.xamlは、WPFによって提供されるデータグリッドを作成することを意味します。すぐに使用することを強くお勧めしますDataGridDataGridTextColumnのスタイリングとあなたは(おそらく)より少ないコードで、完全にXAMLであなたの目標を達成するでしょう。

+0

DataGridは使用できません。私は、既存のコンソールアプリケーションをC#に変換しています。これらのアプリケーションにはデータグリッド/テーブルがないため、開発者はテキストフィールド配列を使用してテーブルを作成していました。私はテキストボックス/テキストフィールドを使用する必要があります。 上記のコメントで説明したように、境界線が常に赤ではないため、OnRender内に境界線の色を設定しました。 wpfデザイナーの中で、ユーザーはデザインモードとランタイムモードを切り替えることができます。デザインモードでは、読み取り専用フィールドは赤色の境界線を持ち、変更可能なフィールドは緑色の境界線を持っています。 – Markus

+0

実行時モードでは、読み取り専用フィールドには境界線がなく、変更可能なフィールドにはわずかな境界線が表示されます。これはOnRenderなしでも可能ですが、境界線以上のものがあります。 OnRenderを使わずにテキストフィールド全体を埋めるアンダーラインを描くにはどうすればよいですか?これはスタイルで行うことができますか?また、デザインやランタイムビューの外観が異なる他の属性もあります。どのようにスタイルでこれを行うには?レイチェルはトリガーを提案しましたが、私が仕事に戻ると私が調べなければならないことがあります。 – Markus