سؤال

وأنا بناء التطبيق برنامج الأغذية العالمي باستخدام MVVM. لدي viewModels للتوظيف تحميل كسول مثل أدناه:

public class AssignmentsViewModel
{

    List<AssignmentViewModel> _Assignments;
    public List<AssignmentViewModel> Assignments
    {
        get
        {
            if (_Assignments == null)
                _Assignments = new List<AssignmentViewModel>(Data.GetAssignments());
            return _Assignments;
        }
        set { _Assignments = value; }
    }
}
public class AssignmentViewModel
{
    List<NoteViewModel> _Notes;
    public List<NoteViewModel> Notes
    {
        get
        {
            if (_Notes == null)
                _Notes = new List<NoteViewModel>(Data.GetNotes());
            return _Notes;
        }
        set { _Notes = value; }
    }
}

وومشاهدة ديه AssignmentViewModels في ListView وملاحظات في مربع القائمة مع datatemplate.

وعندما عرض أحد AssignmentViewModels التي لديها 160 وحدات يستغرق 1000 مللي ثانية ليتم تحميلها. اعتقد انها كانت بسبب خاصية ملاحظات الاستيلاء من جدول قاعدة البيانات مع 1.5million الصفوف. راجعت وأنها لم تكن الا 60ms لتعبئة قائمة الملاحظات. لذلك أنا التخمين أنه هو ربط البيانات من تحميل المواد 160 إلى مربع القائمة. ولكن هذا لا ينبغي أن يكون عليه الحال لأن مربعات سرد المحاكاة الافتراضية مضمونها (أنا متطفل عليها والتحقق من أن هذه البنود هي في stackpanel Virtualizing).

وهكذا أنا في حيرة، وأنا لا أعرف كيف لمعرفة ما يجري اضافية 940 مللي ثانية.

وماذا يمكنني أن أفعل لتتبع هذا إلى أسفل؟ الأداء هو مفتاح الحل، وأنا لا أعرف كيف لتحسينه.

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

المحلول

وبدون ما يدري واجهة المستخدم هو مثل هناك احتمال أن شيئا من واجهة المستخدم يتباطأ وكأنه استخدام كبير من BitmapEffects.

وأيضا، قد ترغب في التحول قائمتك على لObservableCollection، كما يمكن أن تكون ملزمة لأسرع بكثير ثم قائمة على .

وهناك أيضا بعض التنميط الأداء التي يمكن أن تساعد لك.

نصائح أخرى

ويمكن أن نرى XAML لديك؟

إذا كان لديك مربع القائمة الخاصة بك داخل stackpanel (أو السيطرة مماثلة) سوف مربع القائمة لا المحاكاة الافتراضية به إدخالات.

وهذا سوف المحاكاة الافتراضية:

<Grid>
  <Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
    <RowDefinition Height="*" />
  </Grid.RowDefinitions>

  <Label Grid.Row=0>Your label here</Label>
  <ListBox Grid.Row=1 Your properties here... />

</Grid>

وليس هذا بما يلي:

<StackPanel>
  <Label>Your label here</Label>
  <ListBox Your properties here... />
</StackPanel>

داخل stackpanel مربع القائمة سيجعل إلى أقصى ارتفاع لها وتعتمد على stackpanel التمرير. (لا virtualizing)

وداخل الشبكة مربع القائمة سوف تقدم لارتفاع الصف الشبكة واستخدام scrollviewer تلقاء نفسها. (Virtualizing)

ويمكنك أيضا أن مجرد مجموعة الطول أو خصائص MaxHeight في مربع القائمة بدلا من وضعه داخل الشبكة، ولكن إذا كان لديك باستخدام stackpanel أظن تريد autosizing من نوع ما.

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

هل حاولت الأداء الإقتصادي الأداء اختبار ث / س تحميل كسول؟

وأيضا، كيف معقدة هي بك DataTemplates / المشاهدات لالبنود الخاصة بك؟ حاول تشغيل اختبار ث / تمثيلات TextBlock بسيطة للتأكد من أنها ليست الطريقة معقدة هي وجهات نظركم.

وأود أن نلقي نظرة أخرى على SQL وتأكد من أن مجموعتك هو ملء. سوف L2S لا ملء الواقع حتى تعداد النتيجة.

private IEnumerable<Thing> Method1()
{
    return _db.Things.Where(t => t.ID > 500);
}
private void Method2()
{
    var things = Method1(); // here, 'things' doesn't really contain anything
                            // even though you've already done the db fetch
    foreach (var thing in things) // 'things' gets populated here.
    {
        // do something
    }
}

ومثلا: اتصل .ToList() مباشرة بعد إرجاع البيانات. سترى الكثير من النشاط في الطبقة البيانات التي ربما لم يحدث حتى عملك أو UI طبقة.

وأنا أحسب من ذلك. كان لي textblock التي تحتاج textwrapping لأنها كبيرة جدا في بعض الأحيان. أنا وضعت صراحة عرض عليه (بحيث التفاف) داخل datatemplate ولسبب ما الذي يسبب VirtualizingStackPanel داخل مربع القائمة لتحقيق كافة العناصر الموجودة في القائمة. I إعادة صياغة لأنها تناسب في الشبكة مثل ذلك ..

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="3*" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Grid Grid.Column="0">
       ....
    </Grid>
    <ListBox Grid.Column="1" ItemsSource="{Binding}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" >
       ...//DataTemplate
    </ListBox>
</Grid>

وتسبب هذا في مربع القائمة لتحميل بسرعة. شكرا لكم على إجاباتك أحضروا لي على الطريق الصحيح.

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