Автозапуск WinForms RichTextBox к его содержимому - PullRequest
9 голосов
/ 09 апреля 2009

Кто-нибудь знает, как я могу динамически изменить размер элемента управления RichTextBox к его содержимому?

Ответы [ 7 ]

8 голосов
/ 17 мая 2013

Полагаю, я слишком опоздал, но взгляните на это

Это всего две строки кода:

private void rtb_ContentsResized(object sender, ContentsResizedEventArgs e)
{
    (RichTextBox)sender.Height = e.NewRectangle.Height + 5;
}
7 голосов
/ 18 марта 2013

Снова предполагая, что фиксированный шрифт, вы могли бы сделать что-то вроде:

using (Graphics g = CreateGraphics())
{
    richTextBox.Height = (int)g.MeasureString(richTextBox.Text,
        richTextBox.Font, richTextBox.Width).Height;
}
4 голосов
/ 09 апреля 2009

Это своего рода боль - с C # RichTextBox часто сложно работать. Вы пытаетесь изменить размер поля настолько, чтобы оно содержало содержимое без полосы прокрутки?

Если RichTextBox имеет постоянный шрифт, вы можете использовать TextRenderer.MeasureText, чтобы просто измерить необходимый размер и передать ширину поля в качестве ограничения.

Событие ContentsResized дает вам ContentsResizedEventsArgs, который дает вам NewRectangle, который сообщает вам, насколько велика текстовая область. Но он срабатывает только при изменении текста, что не так полезно, если вы просто хотите измерить существующий richtextbox (хотя вы, вероятно, могли бы просто сделать что-то хакерское, например, установить текст самого поля, вызывая это событие).

Есть также несколько вызовов API Win32, например EM_GETLINECOUNT (http://ryanfarley.com/blog/archive/2004/04/07/511.aspx), и т. Д.

3 голосов
/ 29 октября 2015

см. ссылку

вы просто используете ContentsResized Событие такое же:

private void rtb_ContentsResized(object sender, ContentsResizedEventArgs e)
{
      ((RichTextBox)sender).Height = e.NewRectangle.Height + 5;
}
2 голосов
/ 07 июля 2012

Действительно дешевое решение (которое потенциально чревато проблемами) состоит в том, чтобы одновременно заполнить метку автоподбора текстом того же шрифта и размера, а затем просто скопировать ширину метки в ширину RTB.

Итак, вот так:

RichTextBox rtb = new RichTextBox();
rtb.Text = "this is some text";
rtb.Font = new Font("Franklin Gothic Medium Cond", 10, FontStyle.Regular);

Label fittingLabel = new Label();
fittingLabel.Text = rtb.Text;
fittingLabel.Font = rtb.Font;
fittingLabel.AutoSize = true;

//Not sure if it's necessary to add the label to the form for it to autosize...
fittingLabel.Location = new Point(-1000,-1000);
this.Controls.Add(fittingLabel);

rtb.Width = fittingLabel.Width;

this.Controls.Remove(fittingLabel);
0 голосов
/ 24 апреля 2015

Намного проще использовать GetPreferredSize , как описано в этом ответе. Тогда вам не нужно ждать события ContentsResized.

0 голосов
/ 23 февраля 2012

Я нашел решение для проблем с высотой текстового поля .. Я изменил его для общего использования ..

Создайте следующие структуры в вашем приложении ....

[StructLayout(LayoutKind.Sequential)]
    public struct RECT {
        public Int32 left;
        public Int32 top;
        public Int32 right;
        public Int32 bottom;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct SCROLLBARINFO {
        public Int32 cbSize;
        public RECT rcScrollBar;
        public Int32 dxyLineButton;
        public Int32 xyThumbTop;
        public Int32 xyThumbBottom;
        public Int32 reserved;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
        public Int32[] rgstate;
    }

Создайте следующие закрытые переменные в своем классе для формы (где бы вам ни понадобилось вычислить высоту расширенного текста)

private UInt32 SB_VERT = 1;
        private UInt32 OBJID_VSCROLL = 0xFFFFFFFB;

        [DllImport("user32.dll")]
        private static extern
            Int32 GetScrollRange(IntPtr hWnd, UInt32 nBar, out Int32 lpMinPos, out Int32 lpMaxPos);

        [DllImport("user32.dll")]
        private static extern
            Int32 GetScrollBarInfo(IntPtr hWnd, UInt32 idObject, ref SCROLLBARINFO psbi);

Добавьте следующий метод в ваш класс для формы

private int CalculateRichTextHeight(string richText) {
            int height = 0;
            RichTextBox richTextBox = new RichTextBox();
            richTextBox.Rtf = richText;
            richTextBox.Height = this.Bounds.Height;
            richTextBox.Width = this.Bounds.Width;
            richTextBox.WordWrap = false;
            int nHeight = 0;
            int nMin = 0, nMax = 0;

            SCROLLBARINFO psbi = new SCROLLBARINFO();
            psbi.cbSize = Marshal.SizeOf(psbi);

            richTextBox.Height = 10;
            richTextBox.ScrollBars = RichTextBoxScrollBars.Vertical;

            int nResult = GetScrollBarInfo(richTextBox.Handle, OBJID_VSCROLL, ref psbi);
            if (psbi.rgstate[0] == 0) {
                GetScrollRange(richTextBox.Handle, SB_VERT, out nMin, out nMax);
                height = (nMax - nMin);
            }

            return height;
        }

Возможно, вам придется изменить вышеуказанный метод, чтобы он работал в соответствии с вашими требованиями ... Обязательно отправьте строку Rtf в качестве параметра для метода, а не обычного текста, а также убедитесь, что в методе присвоены доступная ширина и высота переменной Richtextbox ...

Вы можете играть с WordWrap в зависимости от ваших требований ...

...