سؤال

وكيف يمكنني تقييد عرض لبرنامج الأغذية العالمي 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 موجه عموديا تخصيص دائما بقدر العرض كما طلب أبنائها.

وأنت تريد ان تكون أفضل حالا كتابة لوحة مخصصة لتحقيق السلوك المطلوب.

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