[Wpf] كيف يمكنني الحصول على شريط التمرير الرأسي في مربع القوائم الخاص بي؟


Answers

يحتوي ListBox بالفعل على ScrollViewer . بشكل افتراضي، يظهر ScrollBar عندما يكون هناك محتوى أكثر من المساحة. ولكن بعض الحاويات تغيير حجم نفسها لاستيعاب محتوياتها (على سبيل المثال StackPanel )، لذلك هناك أبدا "المزيد من المحتوى من الفضاء". في مثل هذه الحالات، يتم إعطاء ListBox دائما مساحة كبيرة كما هو مطلوب للمحتوى.

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

في حالة لوحة المضيف العمودية StackPanel وتريد StackPanel يجب تعيين الارتفاع على ListBox نفسه. بالنسبة لأنواع أخرى من الحاويات، على سبيل المثال Grid ، يمكن تقييد ListBox من قبل الحاوية. على سبيل المثال، يمكنك تغيير الشفرة الأصلية لتبدو كما يلي:

<Grid Name="grid1">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="2*"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <ListBox Grid.Row="0" Name="lstFonts" Margin="3"
                 ItemsSource="{x:Static Fonts.SystemFontFamilies}"/>
    </Grid>
</Grid>

لاحظ أنه ليس فقط الحاوية الفورية التي هي مهمة. في المثال الخاص بك، الحاوية الفورية هي Grid ، ولكن لأن هذه Grid هي التي تحتوي على StackPanel ، يتم توسيع StackPanel الخارجي لاستيعاب الطفل مباشرة Grid ، بحيث يمكن أن توسيع هذا الطفل لاستيعاب طفلها ( ListBox ).

إذا كنت تقيد الارتفاع في أي لحظة - عن طريق تحديد ارتفاع ListBox ، عن طريق ضبط ارتفاع Grid الداخلية، أو ببساطة عن طريق جعل الحاوية الخارجية Grid - ثم شريط التمرير الرأسي سوف تظهر تلقائيا في أي وقت هناك الكثير جدا عناصر القائمة لتناسب في السيطرة.

Question

في المثال أدناه لدي قائمة ليستبوكس مع عشرات من أسماء الخطوط في ذلك.

كنت قد فكرت أنه سيكون تلقائيا شريط التمرير العمودي على ذلك بحيث يمكنك تحديد أي خط، وليس فقط الأولى منها في القائمة، لكنها لا.

لذلك أضفت "سكرولفيور" ويضع "منطقة شريط التمرير" على اليمين ولكن لا يوجد شريط التمرير في منطقة شريط التمرير بحيث يمكنك التمرير (!).

لماذا لا يكون شريط تمرير تلقائي وكيف يمكنني إجباره على الحصول على شريط تمرير؟

<StackPanel Name="stack1">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="2*"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <ScrollViewer>
            <ListBox Grid.Row="0" Name="lstFonts" Margin="3"  ItemsSource="{x:Static Fonts.SystemFontFamilies}"/>
        </ScrollViewer>
    </Grid>
</StackPanel>



تتم إضافة شريط التمرير إلى مربع القائمة تلقائيا ما لم يتم تعيين مستوى الرؤية على "مخفي". كلما حجم قائمة البنود يتجاوز واحد، والتي يمكن أن تظهر داخل مربع قائمة مربع قائمة الرأسي أو الأفقي يمكن أن ينظر إليه خلال وقت التشغيل.




كنت تواجه نفس المشكلة، كان لي مربع تحرير وسرد متبوعا بقائمة ليستبوكس في ستاكبانيل شريط التمرير ل ليستبوكس لم تظهر. حلت هذا عن طريق وضع اثنين في دوكبانيل بدلا من ذلك. I تعيين مربع تحرير وسرد DockPanel.Dock = "أعلى" والسماح لل ليستبوكس ملء المساحة المتبقية.