تعيين عنصر تحكم WPF للتوسع لملء المساحة المتاحة، وليس أكثر
-
19-09-2019 - |
سؤال
كيف يمكنني إعداد عنصر تحكم 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>