تقييد عرض StackPanel إلى أصغر عنصر تابع
-
22-08-2019 - |
سؤال
وكيف يمكنني تقييد عرض لبرنامج الأغذية العالمي StackPanel
عمودي على العنصر الأكثر ضيقا التي يحتوي عليها. يجب ألا يكون عرض على StackPanel
وأكبر من عرض أي عنصر طفل آخر.
المحلول
ومما يؤسف له أن <م> IValueConverter م> ونهج لا تعمل دائما. إذا تم إضافة الأطفال إلى <م> StackPanel م> ثابت، على سبيل المثال، جمع الطفل سيكون خاليا في ذلك الوقت التجليد (حتى اكتشفت). أبسط حل هو إنشاء لجنة مخصصة:
public class ConstrainedStackPanel : StackPanel
{
public ConstrainedStackPanel()
{
}
protected override Size MeasureOverride(Size constraint)
{
foreach (var item in this.Children)
{
// FrameworkElement has the Width property we care about.
FrameworkElement element = item as FrameworkElement;
if (element != null)
constraint.Width = Math.Min(element.Width, constraint.Width);
}
return base.MeasureOverride(constraint);
}
protected override Size ArrangeOverride(Size arrangeSize)
{
foreach (var item in this.Children)
{
// FrameworkElement has the Width property we care about.
FrameworkElement element = item as FrameworkElement;
if (element != null)
arrangeSize.Width = Math.Min(element.Width, arrangeSize.Width);
}
return base.ArrangeOverride(arrangeSize);
}
}
ويمكنك استخدام لوحة كما يتضح من XAML التالي:
<StackPanel Margin="5">
<TextBlock Text="StackPanel:" FontWeight="Bold" />
<StackPanel x:Name="panelA">
<Button Width="100" Content="100" />
<Button Width="200" Content="200" />
<Button Width="300" Content="300" />
<Button Width="400" Content="400" />
</StackPanel>
<TextBlock Text="ConstrainedStackPanel:" FontWeight="Bold" Margin="0,10,0,0" />
<l:ConstrainedStackPanel x:Name="panelB">
<Button Width="100" Content="100" />
<Button Width="200" Content="200" />
<Button Width="300" Content="300" />
<Button Width="400" Content="400" />
</l:ConstrainedStackPanel>
</StackPanel>
والتي سوف تجعل شيء كما يلي:
وآمل أن يساعد هذا.
نصائح أخرى
ولقد حاولت الربط إلى الملكية ActualWidth، حتى خلق محول لتعويض قيمة، وهذا يعمل بشكل ممتاز مع استثناء واحد: كما قمت بتوسيع حجم الحاوية، يتم تحديث العرض بشكل صحيح، ولكن عندما لجعل الحاوية أصغر، وعرض المحتوى الفعلي يحصل على أصغر، ولكن "عرض الصفحة" في أي scrollviewers لن. أنا متأكد من أن هناك طريقة للتغلب على ذلك، ولكن لم أجد ذلك.
وأنت لا تستطيع ذلك. وهناك StackPanel
موجه عموديا تخصيص دائما بقدر العرض كما طلب أبنائها.
وأنت تريد ان تكون أفضل حالا كتابة لوحة مخصصة لتحقيق السلوك المطلوب.