كيف يمكنني الحصول على شريط تمرير عمودي في ListBox الخاص بي؟

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

سؤال

في المثال أدناه، لدي ListBox يحتوي على العشرات من أسماء الخطوط.

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

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

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

<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>
هل كانت مفيدة؟

المحلول

والمشكلة مع الحل الخاص بك هو أنك تضع شريط تمرير حول مربع القائمة حيث تريد على الارجح لوضعها داخل مربع القائمة.

إذا كنت تريد فرض التمرير في مربع القائمة، استخدم ScrollBar.VerticalScrollBarVisibility المرفقة الممتلكات.

<ListBox 
    ItemsSource="{Binding}" 
    ScrollViewer.VerticalScrollBarVisibility="Visible">
</ListBox>

وتعيين هذه القيمة إلى السيارات سوف المنبثقة شريط التمرير على أساس حسب الحاجة.

نصائح أخرى

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

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

في حالة لوحة المضيف StackPanel العمودي وتريد VerticalScrollBar يجب عليك تعيين الارتفاع على 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 - ثم سيظهر شريط التمرير العمودي تلقائيا في أي وقت هناك كثيرة جدا عناصر القائمة لتناسب في السيطرة عليها.

وأضفت "الطول" لبلدي مربع القائمة وأضافت شريط التمرير بشكل رائع.

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

في حالتي عدد العناصر في ListBox الحيوية لذلك أنا لا أريد أن استخدم خاصية الطول. كنت MaxHeight بدلا من ذلك وأنه يعمل بشكل جيد. يظهر شريط التمرير عندما يملأ الفضاء لقد خصصت لذلك.

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

XAML ListBox Scroller - Windows 10(UWP)

<Style TargetType="ListBox">
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Visible"/>
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Visible"/>
</Style>

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