コントロールの幅によって表示される文字列を決定する -- c# フィールド と winforms フィールド 関連 問題

Deciding what string to display depending on width of control












0
vote

問題

日本語

SplitterPanelにリストボックスを持っています。 MeasureItem()とDrawItem()メソッドをオーバーライデンスしました。

ListBox.widthによっては、 "Dance Toni ..."のように、文字列全体または短縮版のどちらかを返します。

私はそれを閲覧し、私の問題に関係する2つの質問を見つけました。問題の1つはテキストの幅を測定しています。これは、DrawItem()でe.graphics.measureString()で行っています。

概要 - リストボックスの幅、および文字列の幅をピクセル単位である。文字列がリストボックスの幅より短い場合は、文字列を全体として表示します。しかし、それが長い場合は、リストボックスの幅内に収まるであろう "helloすべての..."のようなバージョンを返したいと思います。

これまで私は持っています:

<事前> <コード> private string FitText(string s) { int width = (TextRenderer.MeasureText(s, titleFont)).Width; if (width <= mailList.Width) { return s; } else if (width > mailList.Width) { // What goes here? } }

私はそれが単純な数学だけであることを確信していますが、それでもそれを理解することはできません。

英語

I have a Listbox in a SplitterPanel. I have overriden it's MeasureItem() and DrawItem() methods.

What I want to do is, depending on Listbox.Width, return either the entire string or a shortened version of it, like "Dance toni...".

I've browsed SO and found two questions that pertain to my problem. One of the problems is measuring the width of the text, which I am doing with e.Graphics.MeasureString() in DrawItem().

Summary - I have the width of a listbox, and the width, in pixels, of a string. If the string is shorter than the width of a listbox, I want to display the string in entirety. However, if it's longer, I would like to return a version like "Hello every..." that would fit in within the width of the listbox.

So far I have:

        private string FitText(string s)     {         int width = (TextRenderer.MeasureText(s, titleFont)).Width;         if (width <= mailList.Width)         {             return s;         }         else if (width > mailList.Width)         {             // What goes here?         }     } 

I'm pretty sure it's just simple math, but I still can't figure it out.

</div
     
 
 

回答リスト

1
 
vote
vote
ベストアンサー
 

あなたが適合するかどうかをチェックする必要があると思います。そうでなければ、それ以外の場合はコードを変更してループを実行して、1文字のサイズを測定し続けると省略されるまで、それ以上の文字が残っていて、それ以外の場合は省略されています。

<事前> <コード> string EllipsisString = "..."; // you could also just set this as the unicode ellipsis char if that displays properly private string FitText(string s) { bool WidthFound = true; string TestString = s; string StringToReturn = s; int width = (TextRenderer.MeasureText(s, titleFont)).Width; if (width > mailList.Width) { WidthFound = false; for (int i=1; i < s.Length; ++i) { TestString = s.Substring(0, s.Length - i) + EllipsisString; width = (TextRenderer.MeasureText(TestString, titleFont)).Width; if (width <= mailList.Width) { StringToReturn = TestString; WidthFound = true; break; } } } if (WidthFound) return StringToReturn; else return EllipsisString; }

[編集:数値が多すぎる]

 

i think you would need check if it fits, if so, return the whole string, otherwise modify your code to run a loop that keeps measuring the size of s minus one more character and plus the ellipsis, until it fits or until there are no more characters left, and then return that, or just the ellipsis otherwise.

string EllipsisString = "..."; // you could also just set this as the unicode ellipsis char if that displays properly  private string FitText(string s) {     bool WidthFound = true;     string TestString = s;     string StringToReturn = s;      int width = (TextRenderer.MeasureText(s, titleFont)).Width;      if (width > mailList.Width)     {         WidthFound = false;          for (int i=1; i < s.Length; ++i)         {            TestString = s.Substring(0, s.Length - i) + EllipsisString;            width = (TextRenderer.MeasureText(TestString, titleFont)).Width;             if (width <= mailList.Width)            {               StringToReturn = TestString;               WidthFound = true;               break;            }         }     }      if (WidthFound)         return StringToReturn;     else         return EllipsisString; } 

[edits: too many to name]

</div
 
 
         
         
1
 
vote

これは私が使う疑似コードです...

1)いくつかの形式で文字列を短くする(最後の文字/ wordを削除する)
2)<コード> width に対する長さを再テストする 3)NOT
の場合、有効な繰り返しの挿入 4)文字列が短すぎる場合、デフォルトフォーム

<事前> <コード> String s = "A long string that you're trying to fit into the button." while (width > mailList.Width) { s = s.SubString(0,s.lastIndexOf(" ")-1); //Change this to whatever you'd want to shorten the string by width = (TextRenderer.MeasureText(s, titleFont)).Width; if (width < 5) { //Some value indicating it's too short s = "Button..."; break; } } return s;
 

Here's the pseudocode I'd use...

1) Shorten the string in some form (remove the last character/word)
2) Retest the length against width
3) Insert of valid repeat if not
4) If string is too short use some default form

String s = "A long string that you're trying to fit into the button." while (width > mailList.Width) {    s = s.SubString(0,s.lastIndexOf(" ")-1); //Change this to whatever you'd want to shorten the string by   width = (TextRenderer.MeasureText(s, titleFont)).Width;    if (width < 5) { //Some value indicating it's too short     s = "Button...";     break;   } }  return s; 
</div
 
 
     
     
1
 
vote

http://msdn.microsoft。 COM / EN-US /ライブラリ/ AA904308%28V = VS.71%29.ASPX

<事前> <コード> conditionally thread-safe0
 

http://msdn.microsoft.com/en-us/library/aa904308%28v=vs.71%29.aspx

    string ts = s;     while((TextRenderer.MeasureText(ts, titleFont)).Width > mailList.Width + (TextRenderer.MeasureText("...", titleFont)).Width) { ts = ts.SubString(0,ts.Length-1); } return ts + "..." 
</div
 
 
       
       

関連する質問

54  WinForms ComboBoxデータバインディングGotcha  ( Winforms combobox data binding gotcha ) 
次のようなことをしているとします <事前> <コード> List<string> myitems = new List<string> { "Item 1", "Item 2", "Item 3" }; ComboBox box = ...

3  WinForms ListBoxでの画像サムネイル  ( Image thumbnail in a winforms listbox ) 
リストボックス内のサムネイルをWindowsフォームアプリケーションで表示しようとしています。私は読み、あらゆる種類の提案を見ていますが、私は最も単純なものを探しています。これが私がしようとしていることの詳細です。 画像のサムネイルとその隣のテキストを表示し...

12  WPFのTreeViewのレベルは?  ( The level of a treeview in wpf ) 
winforms アプリケーションでは、 treeview のレベルは 9988777662 wpf ?の対応するコマンドは何ですか? ...

0  TabControlでSelectedIndexChangedイベントから例外がスローされたら、タブページをプログラムで変更することはできません。  ( Cannot programmatically change tab pages once exception is thrown from selectedi ) 
これはC#、WinFormの質問です。 TABControlコントロールを持ち、2つのナビゲーションボタンを使用してタブページを切り替えます。ボタンの[イベント]の[表示]タブページを変更するには、TabControl.SelectedIndex = Iを使...

1  Formsが開かれたときに、Visual Studio Designerの移動制御とグリッド列の追加  ( Visual studio designer moving controls and adding grid columns when form is open ) 
特定の形式のコントロールを開くことを試みる(右側および/または下部にアンカーを持つもの)シフトされ、私のグリッドはそれらのデータソースから自動的にすべての列を取り戻します(列)以前に取り外した。 InitializeComponentメソッドの後に「良い」デ...

2  C#の動的制御  ( Dynamic control in c sharp ) 
TextBoxesとCheckBoxを使用して4 x 3行列の種類を作成したいです。要素がCheckBoxまたはTextBoxのどちらがデータベース内の値によって異なります.Iは動的になりたいです。始める最善の方法は何ですか? <事前> <コード> _or...

38  C#WinFormsアプリケーションでフラッシュコンテンツを表示する  ( Displaying flash content in a c sharp winforms application ) 
c# winformsアプリケーションで Flash コンテンツを表示する最善の方法は何ですか?イメージとフラッシュコンテンツを表示できるようになるユーザーコントロール(現在の<コード> PictureBox と同様)を作成します。 ディスク上のファイルで...

606  クロススレッド操作が無効:それが作成されたスレッド以外のスレッドからアクセスされたコントロール  ( Cross thread operation not valid control accessed from a thread other than the ) 
シナリオがあります。 (Windows Forms、C#、.NET) 何らかのユーザーコントロールをホストする主なフォームがあります。 ユーザーコントロールは、 UserControl_Load メソッドを直接呼び出すと、UIがロードメソッドの実行の間に無応...

0  C#ユーザーが終了すると機能を実行します  ( C sharp run function when user exits ) 
ユーザーがアプリケーションを存在するときにC#で関数を呼び出す方法はありますか? Visual C#2008 Express Editionを使用しています。 ありがとう。 ...

66  WinFormsアプリで集中管理を見つけるのに好ましい方法は何ですか?  ( What is the preferred way to find focused control in winforms app ) 
現在、winformsでユーザー(キーボード)入力を受けているコントロールを見つけるのに好ましい/最も簡単な方法は何ですか? これまでのところ私は次のようになりました: <事前> <コード> public static Control FindFocusedC...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有