سؤال

أنا أستخدم ListView لعرض العناصر في قائمة. يمكن للمستخدم تحديد العناصر بنفسه ، أو استخدام بعض "مفاتيح التحديد" لتحديد العناصر ذات سمات محددة.

للتحقق من العناصر التي أستخدمها شيئًا كهذا:

for(int i;i<MyListView.Items.Count;++i)
{
    if( /*... Check if the items should be selected ...*/ )
        (MyListView.ItemContainerGenerator.ContainerFromIndex(i) as ListViewItem).IsSelected = true;
}

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

وكيفية القيام بعنصر خارج "حقل العرض"؟ أعتقد أنه يجب أن يكون ممكنا.

شكرا على أي مساعدة ، ماركس

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

المحلول

كما ذكرت ، أعتقد أن المشكلة هي المحاكاة الافتراضية لعناصر ListView. بشكل افتراضي ، استخدم ListView (و ListBox) VirtualizingStackPanel كما العناصر الخاصة بهم spanel لتحسين الأداء. يمكن قراءة تفسير موجز لكيفية عمله هنا.

يمكنك استبدال لجنة أخرى ، ولكن. في هذه الحالة ، حاول استخدام StackPanel العادي. إذا كان لديك الكثير من العناصر الموجودة في ListView ، خاصة إذا كانت عناصر معقدة ، فقد يعاني الأداء قليلاً.

<ListView>
    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel/>
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
</ListView>

تعديل

يمكنك أيضًا محاولة الحل الموصوف في هذا السؤال المشابه, ، اعتمادا على النموذج الخاص بك. ومع ذلك ، ربما لن ينجح هذا من أجلك.

نصائح أخرى

عند التعامل مع عناصر تحكم العناصر الافتراضية ، فإن بديلًا لتعطيل المحاكاة الافتراضية (وهو في الواقع ميزة مفيدة في بعض الأحيان ، حتى لو كان يتداخل مع التشغيل الصحيح لأجزاء أخرى من واجهة برمجة التطبيقات) ، هو العثور على VirtualizingPanel وأخبرها صراحة للتمرير.

علي سبيل المثال:

void ScrollToIndex(ListBox listBox, int index)
{
    VirtualizingPanel panel = FindVisualChild<VirtualizingPanel>(listBox);

    panel.BringIndexIntoViewPublic(index);
}

static T FindVisualChild<T>(DependencyObject o) where T : class
{
    T result = o as T;

    if (result != null)
    {
        return result;
    }

    int childCount = VisualTreeHelper.GetChildrenCount(o);

    for (int i = 0; i < childCount; i++)
    {
        result = FindVisualChild<T>(VisualTreeHelper.GetChild(o, i));

        if (result != null)
        {
            return result;
        }
    }

    return null;
}

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

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