السماح مربع نص إلى أن يكون حجمها ولكن ليس لتنمو على إدخال المستخدم

StackOverflow https://stackoverflow.com/questions/604952

  •  03-07-2019
  •  | 
  •  

سؤال

ولدي مربع نص تعريفها داخل نافذة مثل ذلك:

<Window x:Class="NS.MainWindow"
    ...
    SizeToContent="WidthAndHeight">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100" />
            <ColumnDefinition MinWidth="200" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition MinHeight="50" />
        </Grid.RowDefinitions>
        <TextBlock Grid.Column="0" Grid.Row="0">Description:</TextBlock>

        <TextBox Grid.Column="1" Grid.Row="0" TextWrapping="WrapWithOverflow" />
    </Grid>
</Window>

والمشكلة هي أنه عندما يكتب المستخدم في مربع نص توسعها إلى اليمين منذ تم تعيين فقط MinWidth. ما أريد حقا هو النص إلى التفاف إلى السطر التالي. يمكنني الحصول عليه للقيام بذلك إذا قمت بتغيير MinWidth على العمود ليكون العرض بدلا من ذلك. ولكن إذا كنت تفعل ذلك، ثم مربع نص لم يعد تغيير حجم عند تغيير حجم النافذة.

هل هناك طريقة أستطيع أن يكون على حد سواء؟ (أي تغيير فقط على تغيير حجم النافذة، وإلا التفاف)

هل كانت مفيدة؟

المحلول

والسبب كنت تواجه هذا السلوك لأن قمت بتعيين على الملكية SizeToContent النافذة - يمكنك الذي يخول أساسا نافذة لتغيير نفسها على أساس حجم من محتواه المطلوبة. حتى أثناء الكتابة في المزيد من الأشياء، يقول النص I بحاجة إلى مساحة أكبر، وينمو نافذة على أسس طوعية. أن النص الخاص بك لا تنمو إذا لم يكن لتعيين الخاصية SizeToContent.

وهكذا أقول تفقد SizeToContent اضع الملكية واستخدام شبكة تتناسب التحجيم. أنا هنا أقول جعل العمود رقم 2 مرتين عرض العمود رقم 1. الافتراضي "تمدد" قيمة HorizontalAlignment وVerticalAlignment عن الشبكة ينبغي أن تكفل التحكم الخاصة بك بشكل صحيح على تغيير حجم تغيير حجم النافذة.

<Window ...
    Title="MyWindow" WindowStyle="ToolWindow" ResizeMode="CanResizeWithGrip"
        MinWidth="300" Width="300" Height="80">
    <Grid x:Name="myGrid">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*" MinWidth="100"/>
            <ColumnDefinition Width="2*" MinWidth="200" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition MinHeight="50" />
        </Grid.RowDefinitions>

        <TextBlock Grid.Column="0" Grid.Row="0">Description:</TextBlock>
        <TextBox Grid.Column="1" Grid.Row="0" TextWrapping="WrapWithOverflow"/>
    </Grid>

إذا كنت مجرد إضافة واضع الملكية SizeToContent إلى التعليمات البرمجية المتكررة أعلاه ... كنت أرى بعض السلوك غريب حيث ينمو مربع النص في البداية مع محتوى النص .. ولكن إذا قمت بتغيير حجم نافذة واحدة .. والنص سوف تتوقف عن النمو . غريب ... لا يمكن أن يفسر هذا السلوك.
HTH

نصائح أخرى

ولا يبدو مربع نص WPF لديهم هذا الخيار مدمج.

لحل هذه المشكلة، يمكنك استخدام مربع نص مخصص تقارير المطلوبة (0، 0) الحجم. انها الإختراق القبيح، لكنه يعمل.

في ملف MainWindow.xaml.cs الخاص بك:

namespace NS
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        ...
    }

    // Ugly HACK because the regular TextBox doesn't allow autoresize to fit the parent but NOT autoresize when the text doesn't fit.
    public class TextBoxThatDoesntResizeWithText : TextBox
    {
        protected override Size MeasureOverride(Size constraint)
        {
            return new Size(0, 0);
        }
    }
}

وبعد ذلك، في ملف MainWindow.xaml الخاص بك:

<Window x:Class="NS.MainWindow"
    ...
    xmlns:local="clr-namespace:NS"
    SizeToContent="WidthAndHeight">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100" />
            <ColumnDefinition MinWidth="200" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition MinHeight="50" />
        </Grid.RowDefinitions>
        <TextBlock Grid.Column="0" Grid.Row="0">Description:</TextBlock>

        <local:TextBoxThatDoesntResizeWithText Grid.Column="1" Grid.Row="0" TextWrapping="WrapWithOverflow" />
    </Grid>
</Window>

وتغيير ColumnDefinition الثانية أن يكون العرض = "*".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top