2009-07-07 13 views
0

winformsアプリケーションのすべてのテキストを置き換える必要があります。それは古いアプリケーションであり、 "メンテナンス"にあります。アプリケーションは.NET v1.1以降で書かれていたため、レイアウトコントロールは使用していません。異なる長さのラベルに対応する方法 - 動的レイアウト

私が問題にするのは、文字列がデフォルトの文字列より長い場合にUIを処理する必要があるということです。しかし、私はリスクのためにコードに多くの変更を加えることは望まない。

過去に、フォームにパネルを追加し、現在のコントロールをドラッグするなどの簡単な変更が、イベントのフックアップなどを失っていることが判明しました。WinFormsデザイナーがコードを移動する方法により、 DIFFを使用してこの種の問題を発見するのは非常に難しいです。可能であれば、コントロールツリーへの変更を避けたい。

私は、フォーム(またはコントロールツリー)の残りの部分を変更せずにフォームに追加できるレイアウトマネージャーを探しています。

その他のオプションはこちらで確認してください。

(弦を交換する人々がコントロール自体を再配置するためのスキルセットを持っていない。ラベルは、顧客ごとに異なる値を持っている必要があり得るような、それはまた、メンテナンスの悪夢だろう)

(回答


)「は有用ではない、私はあなただった場合、私はここから起動しないでしょう」、と言う誰もがコントロールツリーの外部にあるレイアウトマネージャを知っていますか?たとえば、フォームをポイントすると、レイアウトマネージャのすべてのコントロールを子要素にする必要なく、コントロールのレイアウトが引き継がれます。


see also this thread on the msdn Forums

+2

"以前は、フォームにパネルを追加し、現在のコントロールをドラッグするなどの単純な変更が、イベントのフックアップなどを失っていることがわかりました。" - あなたは、カット/ペーストしましたか?ドラッグはイベントハンドラサブスクリプションを中断してはならないでしょうが、カット/ペーストは間違いなくそれを引き起こします。 –

答えて

1

私はレイアウトマネージャーの経験があまりなく、私は実際にUIデザイナーではないので、私は返信に躊躇していますが、他の誰もそうではないように見えます。

唯一の問題は、デザイナーがカットアンドペースト(つまり、サイズ変更を信頼すること)を信頼しない場合は、手動でその部分を実行できることです。

何を(私はデザイナーを信用していないではないので、私は時々、このようにそれを行うことが容易である見つけるため)、私が過去に行っていることである。

(C#のを仮定して、新しいを追加します既存のフォームへのパネル)

1)私は(通常は閉じます)

3)通常のデザイナーで(フォームにパネルを追加します)

2)ソース管理でバックアップを持っていることを確認してくださいデザイナーを開き、コード(xxx.csまたはxxx.designer.cs)を開き、すべてのトップレベルコントロールをフォームに追加し、それらをすべてパネルの外に移動してパネルに追加します。

すなわちあなたは(うまくいけば、より意味のある名前を持つ)のようないくつかで始まる

this.form1.Controls.Add(this.label1); 
this.form1.Controls.Add(this.textBox1); 
etc. 
this.form1.Controls.Add(this.panel1); 

と this.form1.Controlsのような構文のものを使用すること

this.panel1.Controls.Add(this.label1); 
this.panel1.Controls.Add(this.textBox1); 
etc 

this.form1.Controls.Add(this.panel1); 

新しいフォームで終わります。 AddRange(new System.Windows.Forms.Control [] {this.label1、 this.TextBox1、
など this.panel1});

でも、プリンシパルは同じです。

4)もう一度バックアップしてください。 (これは私がソース管理パッケージを持っていて、他の人には見えないように一時的/私的/個人的なバックアップをすることができる場所です)。コントロールはそこにあります。

6)必要に応じてレイアウトを修正してください。

また、試したことはありませんが、イベントフックアップライン(つまり+ =文字が含まれているもの)を比較するためにBeyond Compare(http://www.scootersoftware.com参照)を設定できない場合は非常に驚くでしょう。いずれかが失われている場合はそれを見つけるのはずっと簡単です。

+0

ありがとう、これは非常に役に立ちます。 –

1

残念ながら、私はそのようなレイアウトマネージャーを知っていません。しかし、私はいくつかの最小限の(しかし、安全、私は思う)コードの変更を含む提案があります。私はあなたが問題を抱えているのはLabelsだと思っていますが、コンセプトを他のWinFormオブジェクトにも拡張することができます。私はまた、すべてのテキストが元々デザイナーで設定されていると仮定します。

最初ににラベルを継承するクラスを作成します。 SuperLabel今は何もしません。

、検索&

新しいSystem.Windows.Forms.Label(のすべてのインスタンスを置き換えます)。

新しいSuperLabel()と

これは非常に安全な変更です。もちろん、あなたが行くようにバックアップなどを取る必要がありますが、あなたのデザイナーとアプリケーションは、この交換の前と同じように100%動作するはずです。結局のところ、今のところSuperLabelは単なるラベルです。

最後に、以下の擬似コードのようにいくつかのイベントにフックアップ:

 
public class SuperLabel : Label 
{ 
    public SuperLabel() 
    { 
     this.ParentChanged += new EventHandler(SuperLabel_ParentChanged); 
    } 

    void SuperLabel_ParentChanged(object sender, EventArgs e) 
    { 
     // Here you have the Text property, the Size property etc available 
     string newText = GetNewTextFromSomeDictionary(Text); 
     int lengthOfOriginalText = CalculateLengthOfOriginalText(); 
     int lengthOfNewText = CalculateLengthOfNewText(); 
     if (lengthOfNewText > lengthOfOriginalText) 
      newText = CreateNewShorterTextSomehow(newText, lengthOfOriginalText); 
     Text = newText; 
    } 

    // TODO: Implement the methods in the pseudo code here ... 
} 

を見ての通り、これはあなたが非常に安全かつただ一つの場所にコードの変更を行うことができます。このソリューションでは、新しいテキストはすべて、たとえばXMLファイルなどのキー値辞書に追加されます。これにより、文字列を置き換える人々がコードから離れてしまうので、デザイナーの変更を避けることができ、長すぎる文字列を処理できます。

希望すると便利です。

+0

興味深い理想的なので、+1、しかし、私は新しい長い文字列のためのスペースを作成する必要があります、それらを短くしないでください。私は新しいガマンの使用がラベルの半分しか見ることに満足できないとは思わない。 FormクラスのカスタムサブクラスのOnLoad()オーバーライドの辞書から、ラベル(および他のコントロール)のテキストを読み取って設定しています。私はちょうど完全なコントロールツリーを歩いて、同じことがユーザーが言語を変更するときに行われます。 –

+0

ああ、そうです。私は少し問題を誤解した。私はあなたを助けることができない恐れ... – Halvard

0

.Net Forms Resizeは、ウェブサイトに記載されています。

が簡単にコード

の1行ですでに に設計するためのフォームを実装することができます私が知っているenought詳細にそれを見ていない、ほとんどとき、解像度の変更コントロールのスケーリングについてのようです。

関連する問題