سؤال

في WPF USERCONTROL ، يجب أن أقوم بالاتصال بـ WebService. أقوم بإجراء هذه المكالمة على موضوع منفصل ، لكنني أريد إبلاغ المستخدم بأن المكالمة قد تستغرق بعض الوقت.

يقوم WebMethod بإرجاع مجموعة من الكائنات وأربطها بـ Listbox في UC الخاص بي. حتى الآن ، جيد جدًا ... هذا الجزء يعمل بشكل جيد. لكن، أرغب في عرض شريط تقدم (أو رسوم متحركة من أي نوع ...) أثناء المكالمة. ستكون هذه الرسوم المتحركة في الأعلى وتتركز في التحكم في القائمة.

حاولت المزين ويعمل جزئياً. ومع ذلك ، لا بد لي من رسم جميع عناصر التحكم في التجاوز المحمي Void onrender (DrawingContext DrawingContext) ... أريد ببساطة إضافة عنصر تحكم لبضع ثوان ...

أي شخص لديه فكرة عن كيفية تحقيق ذلك؟

شكرًا!

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

المحلول

لا تذهب مع المزين - ما أقوم به هو وجود عناصر تحكم منفصلة للحاويات (عادة الشبكات) التي تشغل نفس مساحة الشاشة. أحدهما هو تحكم "التقدم" ، والآخر هو تحكم "المحتوى الخاص بي". لقد حددت رؤية التحكم في التقدم في الانهيار ورؤية التحكم في المحتوى إلى مرئي بشكل افتراضي.

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

أنا عمومًا أجعل التحكم في التقدم غير محدد. هنا مثال؛ في هذا ، لديّ UserControl منفصل يسمى ProgressGrid الذي يحتوي على شريط التقدم الخاص بي.

    <Grid x:Name="layoutRoot">
        <Grid x:Name="contentGrid" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Visible">
             <!-- snip -->
        </Grid>

        <controls:ProgressGrid x:Name="progressGrid" Text="Signing in, please wait..." Visibility="Collapsed"/>
    </Grid>

وفي الكود وراء ، مجرد شيء بسيط مثل هذا:

    private void SignInCommand_Executed(object sender, ExecutedRoutedEventArgs e)
    {
        contentGrid.Visibility = Visibility.Collapsed;
        progressGrid.Visibility = Visibility.Visible;
    }

نصائح أخرى

هناك خدعة يمكنك استخدامها مع قماش الارتفاع الصفر الذي قد يعمل. يذهب كتاب WPF الخاص بـ Chris Anderson بالتفصيل حول هذا ولماذا يعمل ، لكنه يسير على هذا النحو.

  • إنشاء stackpanel
  • أضف قماشًا مع ارتفاع = "0" وفهرس z عالي إلى لوحة المكدس
  • أضف عنصر تحكم المستخدم إلى لوحة المكدس.

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

فيما يلي مثال بسيط يستخدم مربع نص. إنها ليست مثالية ولكنها تظهر الفكرة. يعرض النقر فوق الزر مربع النص الموجود فوق inkcanvas

<DockPanel LastChildFill="True">
    <Button DockPanel.Dock="Top" Name="showButton" Click="showProgress">show</Button>
    <StackPanel DockPanel.Dock="Bottom">
        <Canvas Name="zeroHeight" Height="0"/>
        <InkCanvas Name="inky">
        </InkCanvas>
    </StackPanel>
</DockPanel>


private void showProgress(object sender, RoutedEventArgs e)
{
    TextBox box = new TextBox();
    box.Text = "on top";
    StackPanel.SetZIndex(zeroHeight, 8);
    zeroHeight.Children.Add(box);
    box.Width = 30;
    box.Height = 30;
    Canvas.SetLeft(box, 10);
    Canvas.SetTop(box, 10);
    Canvas.SetZIndex(box, 10);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top