Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

WPF disable close button

Îåêßíçóå áðü ôï ìÝëïò kalogeros. Τελευταία δημοσίευση από το μέλος kalogeros στις 19-08-2013, 18:52. Υπάρχουν 2 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  18-08-2013, 16:25 73909

    WPF disable close button

    Θα ήθελα να ρωτήσω ποιός είναι ο καλύτερος τρόπος έτσι ώστε να αποφευχθεί η εισαγωγή dirty data σε βάση δεδομένων αν ο χρήστης κλείσει μια εφαρμογή WPF από το close button (x) του παραθύρου.

    Αυτό που βρήκα είναι η απενεργοποίηση του close button (x) με τον παρακάτω κώδικα:

    protected override void OnSourceInitialized(EventArgs e)
            {
                base.OnSourceInitialized(e);
                HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;
                if (hwndSource != null)
                {
                    hwndSource.AddHook(new HwndSourceHook(this.hwndSourceHook));
                }
            }

            [DllImport("user32.dll")]
            static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
            [DllImport("user32.dll")]
            static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable);
            const uint MF_BYCOMMAND = 0x00000000;
            const uint MF_GRAYED = 0x00000001;
            const uint MF_ENABLED = 0x00000000;
            const uint SC_CLOSE = 0xF060;
            const int WM_SHOWWINDOW = 0x00000018;
            const int WM_CLOSE = 0x10;

            IntPtr hwndSourceHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
            {
                if (msg == WM_SHOWWINDOW)
                {
                    IntPtr hMenu = GetSystemMenu(hwnd, false);
                    if (hMenu != IntPtr.Zero)
                    {
                        EnableMenuItem(hMenu, SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);
                    }
                }
                else if (msg == WM_CLOSE)
                {
                    handled = true;
                }
                return IntPtr.Zero;
            }

    Απλά αυτό το κομμάτι κώδικα απενεργοποιεί εντελώς το κλείσιμο της εφαρμογής. Πως θα μπορέσω να το ενεργοποιήσω έτσι ώστε ο χρήστης όταν κάνει shutdown την εφαρμογή να μπορέσει να κλείσει η εφαρμογή ελεγχόμενα.

    Και άλλες ιδέες δεκτές!

  •  18-08-2013, 22:00 73921 σε απάντηση της 73909

    Απ: WPF disable close button

    Γιατί αυτή η μανούρα? Όλα τα Controls σχεδόν τόσο στα Windows Forms όσο και στο WPF έχουν το Enabled και το Visible property με τα οποία μπορείς ανετότατα να ενεργοποιήσεις/απενεργοποιήσεις κουμπιά και άλλα controls. Μήπως προσπαθείς να περάσεις κώδικα MFC σε .ΝΕΤ? 

    Εξάλλου, ο έλεγχος των δεδομένων πρέπει να γίνεται πάντα πριν τα στείλεις στη βάση. Δεν μπορείς να αρκεστείς στο ότι το UI έχει εμποδίσει την εισαγωγή λάθος δεδομένων. Γι αυτό και το .NET σου δίνει (πάλι και στα δύο UI Frameworks) validators οι οποίοι κοιτάνε τα validations που έχεις ορίσει εσύ στο data model σου για να σου πουν αν τα δεδομένα είναι σωστά ή όχι.

    Ειδικά τώρα για το WPF, η όλη σχεδίαση είναι λάθος. Η σωστή σχεδίαση είναι να χρησιμοποιήσεις το MVVM pattern και να ξεχωρίσεις εντελώς το UI (View) από το μοντέλο πίσω του (ViewModel). Αυτά πρέπει να είναι ανεξάρτητα μεταξύ τους. Η σύνδεση δεδομένων και UI όπως και εντολών με controls γίνεται μέσω του WPF binding. Μπορείς άνετα να κάνεις bind τα Enabled, Visible properties οποιουδήποτε control σε properties στο ViewModel οι οποίες θα γίνονται true ανάλογα με το αν είναι εντάξει τα δεδομένα ή όχι.

    Μάλιστα, κάποια frameworks όπως το Caliburn.Micro χρησιμοποιούν conventions για να κάνουν "αυτόματα" αυτή τη σύνδεση. Αν π.χ. έχεις ένα κουμπί με το όνομα Save, το Caliburn.Micro θα συνδέσει την Enabled με την CanSave property στο ViewModel σου. 


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  19-08-2013, 18:52 73930 σε απάντηση της 73921

    Απ: WPF disable close button

    Ώπα Παναγιώτη κράσαρα! Κάνε τα λίγο πιο λιανά γιατί χάθηκα...χααχα!Τι είναι κώδικας MFC; Ο έλεγχος γίνεται με βάση τα δικά μου κριτήρια, δηλαδή regular expressions, κενα πεδία και τα λοιπά. Αν μιλάς για το WindowStyle στην περίπτωση που βάλεις None ναι μεν δεν έχεις επιλογή κλεισίματος από το παράθυρο αλλά μπορείς με δεξί κλικ πάνω στην εφαρμογή στο εικονίδιο κάτω στη μπάρα  να την κλείσεις κανονικά. Με Visible properties πως μπορείς να απενεργοποιήσεις τα - [] Χ; Έλεγχος γίνεται με τη διαδικασία On Closing απλά σε περίπτωση που κάνεις hard close του παραθύρου από το Χ δεν θα λειτουργήσει το On Closing και το Data Binding που γινόταν θα διακοπεί χωρίς να σωθούν τα απαραίτητα πριν το κλείσιμο της εφαρμογής. Την έχω ξανακούσει την λογική MVVM αλλά δεν την έχω εφαρμόσει γιατί δεν ξέρω πως να το κάνω. Πάντως δεν ξέρω αν γίνεται αυτό από τα Visible controls. Για το framework Caliburn.Micro δεν το έχω ξανακούσει και το μαθαίνω τώρα από σένα. Αν μπορείς δώσε μου κάποιο παραδειγματάκι για να καταλάβω.  
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems