2010-03-02 9 views
11

मेरे पास एक WPF एप्लिकेशन है जो एक पूर्णस्क्रीन कियोस्क ऐप है। यह वास्तव में इस बिंदु पर एक बहुत ही जटिल ऐप है, लेकिन यहां कुछ कोड है जो मूल विचार दिखाता है। अनिवार्य रूप से, जब भी उपयोगकर्ता एक स्क्रीन से अगले स्क्रीन पर जाता है, तो नई विंडो लाने पर कुछ गंभीर झिलमिलाहट होती है। गंभीर मामलों में, नई स्क्रीन दिखाई देने से पहले कुछ सेकंड के लिए डेस्कटॉप प्रदर्शित होता है। यह इस नमूना कोड में नहीं होता है, क्योंकि यह इतना आसान है, लेकिन कुछ और बटन और शैलियों को जोड़ें और आप इसे देखेंगे।मैं डब्ल्यूपीएफ फुलस्क्रीन ऐप में फ्लिकर से कैसे बच सकता हूं?

App.xaml.cs:

public partial class App : Application { 
    Manager mManager; 
    public App() { 
     mManager = new Manager(); 
     Window1 screen1 = new Window1(mManager); 
     mManager.Screen1 = screen1; 
     try { 
      this.Run(screen1); 
     } catch (Exception e) { 
      System.Console.WriteLine(e.ToString());     
     } finally { 
      Application.Current.Shutdown(); 
     } 
    } 
} 

Window1.xaml.cs:

public partial class Window1 : Window { 
    Manager Manager{get; set;} 
    public Window1(Manager inManager) { 
     InitializeComponent(); 
     Manager = inManager; 
    } 

    private void OnChangeScreen(object sender, RoutedEventArgs e) { 
     Manager.OpenScreen2(); 
    } 
} 

Window2.xaml.cs:

public partial class Window2 : Window { 
    Manager Manager{get; set;} 
    public Window2(Manager inManager) { 
     InitializeComponent(); 
     Manager = inManager; 
    } 

    private void OnChangeScreen(object sender, RoutedEventArgs e) { 
     Manager.OpenScreen1(); 
    } 
} 

Manager.cs:

public class Manager { 
    public Window1 Screen1{ get; set;} 
    public Window2 Screen2{ get; set;} 

    public Manager(){ 
     Screen1 = new Window1(this); 
    } 

    public void OpenScreen2() { 
     Screen2 = new Window2(this); 
     Screen2.Show(); 
     if (Screen1 != null) { 
      Screen1.Hide(); 
     } 
    } 

    public void OpenScreen1() { 
     Screen1 = new Window1(this); 
     Screen1.Show(); 
     if (Screen2 != null) { 
      Screen2.Hide(); 
     } 
    } 
} 

Window1.xaml (अनिवार्य रूप से window2.xaml द्वारा मजाक उड़ाया):

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" 
     WindowStyle="None" 
     WindowState="Maximized" 
     Width="1280" 
     Height="1024" 
     FontFamily="Global User Interface" 
     ResizeMode="NoResize"> 

    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition></ColumnDefinition> 
      <ColumnDefinition></ColumnDefinition> 
      <ColumnDefinition></ColumnDefinition> 
      <ColumnDefinition></ColumnDefinition> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition></RowDefinition> 
      <RowDefinition></RowDefinition> 
      <RowDefinition></RowDefinition> 
      <RowDefinition></RowDefinition> 
     </Grid.RowDefinitions> 
     <Button Name="ChangeScreenButton" Click="OnChangeScreen" Grid.Row="2" Grid.Column="2" Content="Toggle Screen 2"></Button> 
    </Grid> 
</Window> 

दो खिड़कियों के प्रदर्शित करता है इंटरलिविंग (यानी, खिड़की 2, आदि को हटाने से पहले खिड़की 1 दिखा रहा है) अस्थिर व्यवहार नहीं बदलता है। इस सरल ऐप में, उन अन्य स्क्रीनों को छिपाना संभव होगा जो दिखाए नहीं गए हैं, लेकिन अधिक जटिल ऐप में, स्क्रीन जानकारी को सही ढंग से और आसानी से प्रबंधित करने के लिए बहुत अधिक राज्य जानकारी है।

क्या कोई जादू कोडवेयर या तकनीक है जो झिलमिलाहट से बचने के लिए है जो इस सरल ऐप में काम करेगी जो कि अधिक जटिल ऐप के लिए भी है? मुझे चिंता है कि छिपाने और दिखाने में सहायता के लिए मुझे इस बिंदु पर पूरे यूआई को फिर से लिखना होगा, और यह मेरे समय सीमा में बस संभव नहीं है।

संपादित करें: मैंने कुछ संवादों पर छिपाने/दिखाने की कोशिश की है, और यह कोई फर्क नहीं पड़ता। शायद ऐसा इसलिए है क्योंकि मुख्य कियोस्क ऐप शैली भारी है?

उत्तर

15

झिलमिलाहट का मूल कारण है कि खारिज किया जा करने के लिए जब भी आप .Hide() एक खिड़की अपने PresentationSource कट जाने पर, Unloaded घटनाओं के कारण सब कुछ और सब कुछ WPF की MILCore परत में कैश पर लागू किया जाना है। फिर जब आप .Show() इसे बाद में, सब कुछ पुनर्निर्मित किया जाता है।

फ्लिकर को रोकने के लिए, सुनिश्चित करें कि आप अपने यूआई को प्रेजेंटेशनसोर्स से हर समय जुड़े रखें। यह कई तरह से किया जा सकता है:

एक प्रच्छन्न TabControl

उपयोग के साथ एकल खिड़की से युक्त एक TabControl स्टाइल ताकि आप टैब नहीं देख सकते हैं एक एकल खिड़की। जब आप सामान्य रूप से विंडो दिखाते या छिपाते हैं तो कोड को टैब में स्विच करें। आप अपने मौजूदा कोड में "विंडो" के साथ "विंडो" को आसानी से खोज और प्रतिस्थापित कर सकते हैं, फिर "कस्टम()" कॉल को अपने कस्टम "शो()" में बदलें, जो निम्न करता है:

  1. पहले की जांच करें इस पृष्ठ के लिए बनाया TabItem
  2. यदि कोई TabItem पाया (एक शब्दकोश का उपयोग), एक नया TabItem अंदर पृष्ठ लपेट और नए TabItem को TabControl TabControl
  3. स्विच में जोड़ने

ContentTemplate आप आपके टैबकंट्रोल के लिए उपयोग करना बेहद सरल है:

<ContentTemplate TargetType="TabControl"> 
    <ContentPresenter x:Name="PART_SelectedContentHost" 
        ContentSource="SelectedContent" /> 
</ContentTemplate> 

नेविगेशन

के साथ एक फ्रेम का उपयोग करना नेविगेशन के साथ Frame का उपयोग करते हुए एक काउंटर के लिए एक बहुत अच्छा समाधान है क्योंकि यह पेज स्विचिंग और अन्य कार्यक्षमता का एक बहुत लागू करता है। हालांकि टैबकंट्रोल का उपयोग करने के बजाय मौजूदा एप्लिकेशन को अपडेट करने के लिए यह और अधिक काम हो सकता है। किसी भी मामले में आपको Window से Page में कनवर्ट करने की आवश्यकता है, लेकिन फ़्रेम के साथ आपको नेविगेशन से निपटने की भी आवश्यकता है। अस्पष्टता

साथ

एकाधिक विंडोज़ आप एक कम अस्पष्टता का उपयोग कर एक खिड़की लगभग पूरी तरह से अदृश्य कर सकते हैं और अभी तक WPF अभी भी चारों ओर दृश्य पेड़ रखेंगे। यह एक छोटा बदलाव होगा: सभी कॉल को Window.Show() और Window.Hide() पर "MyHide()" और "MyShow()" पर कॉल के साथ प्रतिस्थापित करें जो अस्पष्टता को अपडेट करता है। ध्यान दें कि आप इन दिनोंचर्या को बहुत कम अवधि (उदाहरण के लिए 0.2 सेकंड) के एनीमेशन को ट्रिगर करके इसे और बेहतर बना सकते हैं जो अस्पष्टता को एनिमेट करता है। चूंकि दोनों एनीमेशन एक ही समय में सेट किए जाएंगे, इसलिए एनीमेशन आसानी से आगे बढ़ेगा और यह एक साफ प्रभाव होगा।

+0

धन्यवाद। – mmr

2

मुझे उत्सुकता है कि आप कियोस्क में उसी एप्लिकेशन के लिए एकाधिक विंडो का उपयोग क्यों कर रहे हैं। आप आसानी से एक ही "विंडो" पर सभी नियंत्रण डाल सकते हैं और अलग-अलग "स्क्रीन" प्रदर्शित करने के लिए पैनलों पर दृश्यता बदल सकते हैं। यह निश्चित रूप से डेस्कटॉप को कभी भी दिखाए जाने से रोक देगा, और आपको फीड संक्रमण या स्लाइडिंग एनिमेशन जैसे साफ-सुथरे चीजों को करने की अनुमति देगा।

+0

एक बहुत, बहुत दिलचस्प विचार है कि। मुझे यकीन नहीं है कि चीजों को इस दृष्टिकोण में बदलने में कितना समय लगेगा (फिर से, राज्य की समस्याएं; यह WinForms ऐप को WPF पर स्विच किया जाता था), लेकिन यह एक प्रयोग या दो के लायक हो सकता है। – mmr

+5

एक और विचार जो इसे रोक सकता है ... यदि बाद में खिड़कियों को प्रदर्शित करने में लंबा समय लग रहा है, तो यह हो सकता है कि कंप्यूटर सबकुछ प्रस्तुत करने की कोशिश कर रहा हो। आप स्टार्टअप पर सभी विंडोज़ "शो" करना चाहते हैं, और अपनी इच्छित खिड़की को सक्रिय करने के माध्यम से उनके बीच स्विच कर सकते हैं। इस तरह यह विंडोज़ सक्रिय रूप से सक्रिय (शीर्ष पर) विंडो को स्विच करता है क्योंकि वास्तव में प्रत्येक संक्रमण पर सभी घटकों को प्रस्तुत करने के विपरीत होता है। – NebuSoft

1

WPF नेविगेशन कार्यक्षमता में बनाया गया है।

बस Frame और पेज क्लास देखें जिन्हें आप आसानी से वीएस या ब्लेंड का उपयोग करके डिज़ाइन कर सकते हैं।

+0

और नेविगेशनविंडो। – Will

0

अंतर्निहित नेविगेशन कार्यक्षमता का उपयोग करने के बारे में टिप्पणियों से सहमत हुए, लेकिन यदि आप इस समय अपने डिज़ाइन में लॉक हैं, तो शायद अपनी खिड़कियों की अस्पष्टता को एनिमेट करने पर विचार करें? आउटगोइंग विंडो के लिए 1 -> 0 से अस्पष्टता की एक छोटी 100 या 200 एमएस एनीमेशन और आने वाली विंडो के लिए 0 -> 1 समस्या को हल कर सकती है। स्टोरीबोर्ड पर पूर्ण घटना में आउटगोइंग विंडो की वास्तविक सफाई को संभाल लें।

+0

साफ विचार, लेकिन मुझे बताया गया है कि मुझे ऐसी चीजों के साथ रचनात्मक होने की अनुमति नहीं है, बस चीजों को तेजी से दिखाने के लिए। – mmr

+0

यदि आपकी चिंता संपूर्ण डिजाइनर/डेवलपर अलगाव है, तो आप मौजूदा एनिमेशन वाले मुद्दों से बचने के लिए कोड में स्टोरीबोर्ड बना सकते हैं। अगर यह सिर्फ एक नीति मुद्दा है, तो ... मुझे लगता है कि वे अपनी झटके पसंद करते हैं। :) –

+0

यह एक "यह मेरे जैसा कला जैसा दिखता है! आप एक कोडर हैं, आपको कलाकार बनने की इजाजत नहीं है! यही वह नहीं है जो हम आपको भुगतान करते हैं! खानों पर वापस जाओ!" मानसिकता की तरह। – mmr

0

यह देखते हुए कि डब्ल्यूपीएफ स्क्रीन तत्वों के ऑफलोड प्रसंस्करण के लिए डायरेक्टएक्स और ग्राफिक्स प्रोसेसर का उपयोग कैसे करता है, क्या कंप्यूटर के डायरेक्टएक्स और ड्राइवर अद्यतित हैं?

कोरी

+0

यह उस मशीन पर हो रहा है जिस पर ऐप का परीक्षण किया जाता है, और वे सभी को पूरी तरह अपडेट किया जाना चाहिए। यदि .NET को अधिक डायरेक्टएक्स ड्राइवर स्थापित करने की आवश्यकता है, तो मुझे लगता है कि यह इंस्टॉलर का हिस्सा होगा ... लेकिन मेरी देव मशीन में निश्चित रूप से हालिया डायरेक्टएक्स स्थापित है और यह यहां झटकेदार है। स्पष्टीकरण के लिए – mmr

0

आप निर्माता है कि एक लंबे समय है कि एक देरी और झिलमिलाहट का कारण बन सकता लेता है में किसी भी प्रारंभ किया है। आप एक एसिंक्रोनस विधि का उपयोग करने का प्रयास कर सकते हैं या उस पृष्ठभूमि को थ्रेड पर प्रारंभ कर सकते हैं ताकि यह विंडो के प्रदर्शन को अवरुद्ध न करे।

किसी चीज का एक उदाहरण जो देरी का कारण होगा डेटाबेस डेटाबेस या नेटवर्क पर डेटा के लिए अनुरोध होगा।

एक त्वरित प्रयोग खिड़की को दिखाने में देरी होने के कारण धीमे विंडो में कन्स्ट्रक्टर के हिस्सों को अक्षम करना होगा।

0

जैसा कि पहले दिए फ्रेम्स का उपयोग कर/टैब नियंत्रण संक्रमण के दौरान झिलमिलाहट से बचने

आप अपने आवेदन बदल सकते हैं और (बीच में डेस्कटॉप की चमकती) कि झिलमिलाहट दूर करने के लिए Windows7 पर चाहते हैं या नहीं करना चाहते हैं WindowsVista आप अनुकूलन कर सकते हैं आपकी विंडोज़ 'विज़ुअल इफेक्ट्स' सेटिंग 'Adjust for best performance'

+1

यह वास्तव में एक सामान्य समाधान नहीं है - हम अपने कोडिंग अक्षमता के कारण डेस्कटॉप विषयों को बंद करने के लिए अपने सभी ग्राहकों से नहीं पूछ सकते हैं। हमें बस बेहतर होना है। – mmr

0

यहां एक आसान विकल्प है जो मेरे कियोस्क जैसे एप्लिकेशन में काले रंग की पृष्ठभूमि के साथ काम करता है, जो ऊपर दिए गए उत्तरों से प्रेरित है। यहां मेरे पास "भाषाविंडो" है जिसे वर्तमान भाषा को बदलने के लिए एप्लिकेशन में कहीं से भी खोला जा सकता है।

LanguageWindow.xaml में (जाँच WindowState = छोटा):

<Window x:Class="LanguageWindow" 
    ... 
    Title="LanguageWindow" Height="1024" Width="1280" WindowStyle="None" WindowState="Minimized" Background="Black"> 

LanguageWindow.xaml.vb में:

Private Sub LanguageWindow_ContentRendered(sender As Object, e As EventArgs) Handles Me.ContentRendered 
    Me.WindowState = WindowState.Maximized 
End Sub 

देखा!

(विजुअल स्टूडियो 2015 के साथ किया, .नेट फ्रेमवर्क 4.6, WPF, VB.net)

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