تعيين عنصر تحكم WPF للتوسع لملء المساحة المتاحة، وليس أكثر

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

سؤال

كيف يمكنني إعداد عنصر تحكم WPF لملء المساحة المتوفرة في حاوية الوالدين، ولكن لا توسيع الوالد؟

يصف المقتطف التالي التخطيط الذي أحاوله. أود Grid إلى تمتد لاستيعاب Expander, وأود أن ListBox فقط لملء Grid. وبعد انا اريد ال ListBoxشريط التمرير لتظهر عندما Grid صغير جدا لإظهار كل ListBoxItemس.

<ScrollViewer>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition />
        </Grid.RowDefinitions>
        <ListBox Grid.Row="0" Grid.Column="0" />
        <Expander Grid.Row="0" Grid.Column="1" Header="Expander" />
    </Grid>
</ScrollViewer>

حاليا ما يحدث هو أن Grid تمتد لتناسب كامل ListBox, ، والخارجي ScrollViewerيظهر شريط التمرير العمودي. أريد فقط أن يظهر شريط التمرير الخارجي عند Expander يصبح كبيرا جدا لتناسب الشاشة.

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

المحلول

لحل نفس المشكلة، كتبت فئة حاوية خاصة:

class FrugalContainer : Decorator
{
    protected override Size MeasureOverride(Size availableSize)
    {
        return new Size(0, 0);
    }

    protected override Size ArrangeOverride(Size arrangeSize)
    {
        // get it all
        Child.Measure(arrangeSize);
        Child.Arrange(new Rect(arrangeSize));
        return Child.RenderSize;
    }
}

تحيط Listbox الخاص بك عن طريق الحاوية وارتفاع مربع القائمة سيكون هو نفسه من المتوسع.

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition />
    </Grid.RowDefinitions>
    <FrugalContainer Grid.Row="0" Grid.Column="0" >
        <ListBox />
    </FrugalContainer>
    <Expander Grid.Row="0" Grid.Column="1" Header="Expander" />
</Grid>

لاحظ أنني أزل Width="Auto" من تعريف العمود لأن frugalcontainer سيكون صغيرا كما يمكن. لذلك لا يمكنك تعيين عرض أو ارتفاع خلية الشبكة الأصل إلى السيارات.

إذا كنت بحاجة إلى التقييم، أعد كتابة الحاوية:

class FrugalHeightContainer : Decorator
{
    protected override Size MeasureOverride(Size availableSize)
    {
        Child.Measure(availableSize);
        return new Size(Child.DesiredSize.Width, 0);
    }

    protected override Size ArrangeOverride(Size arrangeSize)
    {
        Child.Measure(arrangeSize);
        Child.Arrange(new Rect(arrangeSize));
        return Child.RenderSize;
    }
}

نصائح أخرى

ما هي نقطة ScrollViewerب فقط دع ScrollViewer في ال ListBox يبدو القالب بشكل طبيعي عندما تتوفر مساحة صغيرة جدا.

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition />
    </Grid.RowDefinitions>
    <ListBox Grid.Row="0" Grid.Column="0" />
    <Expander Grid.Row="0" Grid.Column="1" Header="Expander" />
</Grid>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top