WPF

2008-12-01 11 views
8

में किसी नियंत्रण के शीर्ष पर प्रगति पट्टी कैसे प्रदर्शित करें WPF UserControl में, मुझे किसी वेब सेवा पर कॉल करना होगा। मैं इस कॉल को एक अलग थ्रेड पर बना रहा हूं लेकिन मैं उपयोगकर्ता को सूचित करना चाहता हूं कि कॉल में कुछ समय लग सकता है।WPF

वेबमाउडर मुझे वस्तुओं का संग्रह देता है और मैं इसे अपने यूसी में लिस्टबॉक्स में जोड़ता हूं। अब तक, बहुत अच्छा ... यह हिस्सा वास्तव में अच्छा काम करता है। हालांकि, मैं कॉल के दौरान एक प्रगति पट्टी (या किसी भी प्रकार की एनीमेशन ...) प्रदर्शित करना चाहता हूं। यह एनीमेशन शीर्ष पर होगा और ListBox नियंत्रण में केंद्रित होगा।

मैंने एडॉर्नर की कोशिश की और यह आंशिक रूप से काम करता है। हालांकि, मुझे संरक्षित ओवरराइड शून्य ऑनरेंडर (ड्रॉइंग कॉन्टेक्स्ट ड्राइंग कॉन्टेक्स्ट) में सभी नियंत्रणों को आकर्षित करना है ... मैं बस कुछ सेकंड के लिए नियंत्रण जोड़ना चाहता हूं ...

किसी को भी यह पता है कि मैं इसे कैसे प्राप्त कर सकता हूं?

धन्यवाद!

उत्तर

9

एडोर्नर के साथ मत जाओ - मेरे पास दो अलग कंटेनर नियंत्रण (आमतौर पर ग्रिड) होते हैं जो स्क्रीन के उसी क्षेत्र पर कब्जा करते हैं। एक मेरा "प्रगति" नियंत्रण है, और दूसरा मेरा "सामग्री" नियंत्रण है। मैंने प्रगति नियंत्रण की दृश्यता को संकुचित करने और सामग्री नियंत्रण की दृश्यता डिफ़ॉल्ट रूप से दृश्यमान पर सेट की है।

यदि आपने इसे इस तरह से स्थापित किया है, तो जब आप webservice को एसिंक्रोनस कॉल शुरू करते हैं तो आप प्रगति नियंत्रण को दृश्यमान बना सकते हैं और सामग्री नियंत्रण ढह गया है। जब webservice समाप्त होता है, तो इसे UI को अद्यतन करने के लिए Dispatcher.BeginInvoke का उपयोग करें, और उस बिंदु पर, प्रगति नियंत्रण को वापस ध्वस्त करने के लिए स्विच करें और सामग्री नियंत्रण को दृश्यमान पर वापस स्विच करें।

मैं आम तौर पर प्रगति नियंत्रण अनिश्चित बना देता हूं। यहाँ एक उदाहरण है; इसमें, मेरे पास प्रोग्रेसग्रिड नामक एक अलग उपयोगकर्ता नियंत्रण है जिसमें मेरी प्रगति पट्टी है।

<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; 
    } 
+0

वाह पर शीर्ष पर दिखाता है! बहुत बढ़िया जवाब! हालांकि, आपके समाधान के साथ, मैं ListBox के केंद्र में प्रोग्रेसबार नियंत्रण कैसे केंद्रित करूं? कैनवास? – Martin

+0

हम्म - आपके पास प्रगति पैनल सूची बॉक्स का बच्चा हो सकता है, और सूची बॉक्स की दृश्यता के भीतर सभी अन्य तत्वों को ध्वस्त करने के लिए सेट कर सकता है, और जब आपको प्रगति पैनल की आवश्यकता नहीं होती है, तो इसे ध्वस्त करने की दृश्यता सेट करें। –

+0

या आपके पास लिस्टबॉक्स एक ग्रिड की तरह एक अलग कंटेनर का बच्चा हो सकता है, और प्रगति पैनल सूची बॉक्स का एक भाई है - तो आप प्रगति पैनल के क्षैतिज और लंबवत संरेखण को "केंद्र" पर सेट कर सकते हैं, और यह दिखाई देने पर केंद्रित होगा। –

1

एक चाल आप एक शून्य ऊंचाई कैनवास कि काम हो सकता है के साथ उपयोग कर सकते है। क्रिस एंडरसन की डब्ल्यूपीएफ पुस्तक इस पर विस्तार से जाती है और यह क्यों काम करती है, लेकिन ऐसा कुछ ऐसा होता है।

  • एक StackPanel
  • ढेर पैनल
  • को ऊंचाई = "0" और एक उच्च z- सूचकांक के साथ एक कैनवास जोड़ने ढेर पैनल के लिए अपना उपयोगकर्ता नियंत्रण जोड़ने पैदा करते हैं।

जब आप प्रगति बार दिखाना चाहते हैं तो इसे शून्य ऊंचाई कैनवास में जोड़ें। यह आपको उपयोगकर्ता नियंत्रण पर स्थिति रखने की अनुमति देगा। कैनवास आपको अपनी सीमाओं से परे जाने की अनुमति देता है। प्रगति पट्टी को केंद्रित करने के लिए केवल उपयोगकर्ता नियंत्रण के आयामों को देखने और कैनवास पर प्रगति पट्टी की स्थिति निर्धारित करने की आवश्यकता होनी चाहिए। जब आप कर लें तो कैनवास से प्रगति पट्टी हटाएं।

यहां एक साधारण उदाहरण है जो टेक्स्टबॉक्स का उपयोग करता है। यह सही नहीं है लेकिन यह विचार दिखाता है। बटन पर क्लिक करने से टेक्स्टबॉक्स को इंककैनवास

<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); 
} 
संबंधित मुद्दे

 संबंधित मुद्दे