يؤدي WPF/C# Textwrapping في عارض التمرير إلى تأخير تغيير حجم النافذة

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

سؤال

هاي.

لقد حصلت على ListBox مع عارض التمرير فيه.يحتوي كل عنصر (40++ عنصرًا) في مربع القائمة على كتلة نصية وصورة صغيرة.عندما أقوم بتغيير حجم النافذة، يكون تغيير الحجم متأخرًا جدًا.إذا قمت بتعيين رؤية كتلة النص للعناصر على "مطوية"، فسيكون تغيير الحجم أمرًا جيدًا.كان الأسلوب الأول الذي اتبعته هو تعيين إمكانية رؤية كل عنصر غير معروض في عارض التمرير على "مطوى"، لكن لم أتمكن من العثور على مؤشر عندما يكون العنصر مرئيًا للمستخدم.

هل لدى أي شخص فكرة لجعل عملية تغيير الحجم أقل تأخرًا، ربما بعض التحكم الآخر بدلاً من كتلة النص؟شكرا لك على مساعدتك.

هل كانت مفيدة؟

المحلول 2

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

لا يعرض العناصر غير المرئية مقارنةً بـ StackPanel العادي، الذي يعرض جميع العناصر طوال الوقت، بغض النظر عما إذا كانت مرئية للمستخدم أم لا.

يعمل بشكل جيد جدا بالنسبة لي.

نصائح أخرى

وهذا يحدد بعد ما إذا كان العنصر في لحظة معينة الإزاحة مرئية أم لا:

public bool IsItemVisible(ListBox listBox, int index)
{
    if (listBox.Items.Count != 0)
    {
        VirtualizingStackPanel vsp = (VirtualizingStackPanel)VisualTreeHelper.GetParent(listBox.ItemContainerGenerator.ContainerFromIndex(0));
        int FirstVisibleItem = (int)vsp.VerticalOffset, VisibleItemCount = (int)vsp.ViewportHeight;
        return index >= FirstVisibleItem && index <= FirstVisibleItem + VisibleItemCount;
    }

    return false;
}

ويمكنك استخدامه مثل هذا:

private void Button_Click(object sender, RoutedEventArgs e)
{
    for (int i = listbox1.Items.Count - 1; i >= 0; i--)
        if (!IsItemVisible(listbox1, i))
            ((ListBoxItem)listbox1.Items[i]).Visibility = Visibility.Collapsed;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top