كيف يمكنني الحصول على شريط تمرير عمودي في ListBox الخاص بي؟
-
19-08-2019 - |
سؤال
في المثال أدناه، لدي 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>