<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Windows Presentation Foundation (WPF)</title><link>https://www.dotnetzone.gr:443/cs/forums/102/ShowForum.aspx</link><description>Συζήτηση σχετικά με το πώς μπορεί το WPF να δημιουργήσει οπτικά ελκυστικές εφαρμογές ώστε να βελτιώσουν το user experience.</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: WPF disable close button</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/73930.aspx</link><pubDate>Tue, 20 Aug 2013 01:52:40 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:73930</guid><dc:creator>kalogeros</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/73930.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=102&amp;PostID=73930</wfw:commentRss><description>Ώπα Παναγιώτη κράσαρα! Κάνε τα λίγο πιο λιανά γιατί χάθηκα...χααχα!Τι είναι κώδικας MFC; Ο έλεγχος γίνεται με βάση τα δικά μου κριτήρια, δηλαδή regular expressions, κενα πεδία και τα λοιπά. Αν μιλάς για το WindowStyle στην περίπτωση που βάλεις None ναι μεν δεν έχεις επιλογή κλεισίματος από το παράθυρο αλλά μπορείς με δεξί κλικ πάνω στην εφαρμογή στο εικονίδιο κάτω στη μπάρα&amp;nbsp; να την κλείσεις κανονικά. Με Visible properties πως μπορείς να απενεργοποιήσεις τα - [] Χ; Έλεγχος γίνεται με τη διαδικασία On Closing απλά σε περίπτωση που κάνεις hard close του παραθύρου από το Χ δεν θα λειτουργήσει το On Closing και το Data Binding που γινόταν θα διακοπεί χωρίς να σωθούν τα απαραίτητα πριν το κλείσιμο της εφαρμογής. Την έχω ξανακούσει την λογική MVVM αλλά δεν την έχω εφαρμόσει γιατί δεν ξέρω πως να το κάνω. Πάντως δεν ξέρω αν γίνεται αυτό από τα Visible controls. Για το framework Caliburn.Micro δεν το έχω ξανακούσει και το μαθαίνω τώρα από σένα. Αν μπορείς δώσε μου κάποιο παραδειγματάκι για να καταλάβω. &amp;nbsp; &lt;br&gt;</description></item><item><title>Απ: WPF disable close button</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/73921.aspx</link><pubDate>Mon, 19 Aug 2013 05:00:03 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:73921</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/73921.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=102&amp;PostID=73921</wfw:commentRss><description>&lt;p&gt;Γιατί αυτή η μανούρα? Όλα τα Controls σχεδόν τόσο στα Windows Forms όσο και στο WPF έχουν το Enabled και το Visible property με τα οποία μπορείς ανετότατα να ενεργοποιήσεις/απενεργοποιήσεις κουμπιά και άλλα controls.&amp;nbsp;&lt;span style="font-size:10pt;"&gt;Μήπως προσπαθείς να περάσεις κώδικα MFC σε .ΝΕΤ?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Εξάλλου, ο έλεγχος των δεδομένων πρέπει να γίνεται πάντα πριν τα στείλεις στη βάση. Δεν μπορείς να αρκεστείς στο ότι το UI έχει εμποδίσει την εισαγωγή λάθος δεδομένων. Γι αυτό και το .NET σου δίνει (πάλι και στα δύο UI Frameworks) validators οι οποίοι κοιτάνε τα validations που έχεις ορίσει εσύ στο data model σου για να σου πουν αν τα δεδομένα είναι σωστά ή όχι.&lt;/p&gt;&lt;p&gt;Ειδικά τώρα για το WPF, η όλη σχεδίαση είναι λάθος. Η σωστή σχεδίαση είναι να χρησιμοποιήσεις το MVVM pattern και να ξεχωρίσεις εντελώς το UI (View) από το μοντέλο πίσω του (ViewModel). Αυτά πρέπει να είναι ανεξάρτητα μεταξύ τους. Η σύνδεση δεδομένων και UI όπως και εντολών με controls γίνεται μέσω του WPF binding. Μπορείς άνετα να κάνεις bind τα Enabled, Visible properties οποιουδήποτε control σε properties στο ViewModel οι οποίες θα γίνονται true ανάλογα με το αν είναι εντάξει τα δεδομένα ή όχι.&lt;/p&gt;&lt;p&gt;Μάλιστα, κάποια frameworks όπως το Caliburn.Micro χρησιμοποιούν conventions για να κάνουν "αυτόματα" αυτή τη σύνδεση. Αν π.χ. έχεις ένα κουμπί με το όνομα Save, το Caliburn.Micro θα συνδέσει την Enabled με την CanSave property στο ViewModel σου.&amp;nbsp;&lt;/p&gt;</description></item><item><title>WPF disable close button</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/73909.aspx</link><pubDate>Sun, 18 Aug 2013 23:25:29 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:73909</guid><dc:creator>kalogeros</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/73909.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=102&amp;PostID=73909</wfw:commentRss><description>&lt;p&gt;Θα ήθελα να ρωτήσω ποιός είναι ο καλύτερος τρόπος έτσι ώστε να αποφευχθεί η εισαγωγή dirty data σε βάση δεδομένων αν ο χρήστης κλείσει μια εφαρμογή WPF από το close button (x) του παραθύρου.&lt;/p&gt;&lt;p&gt;Αυτό που βρήκα είναι η απενεργοποίηση του close button (x) με τον παρακάτω κώδικα:&lt;/p&gt;&lt;p&gt;protected override void OnSourceInitialized(EventArgs e)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.OnSourceInitialized(e);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (hwndSource != null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hwndSource.AddHook(new HwndSourceHook(this.hwndSourceHook));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DllImport("user32.dll")]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [DllImport("user32.dll")]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; const uint MF_BYCOMMAND = 0x00000000;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; const uint MF_GRAYED = 0x00000001;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; const uint MF_ENABLED = 0x00000000;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; const uint SC_CLOSE = 0xF060;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; const int WM_SHOWWINDOW = 0x00000018;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; const int WM_CLOSE = 0x10;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IntPtr hwndSourceHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (msg == WM_SHOWWINDOW)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IntPtr hMenu = GetSystemMenu(hwnd, false);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (hMenu != IntPtr.Zero)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EnableMenuItem(hMenu, SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (msg == WM_CLOSE)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; handled = true;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return IntPtr.Zero;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;Απλά αυτό το κομμάτι κώδικα απενεργοποιεί εντελώς το κλείσιμο της εφαρμογής. Πως θα μπορέσω να το ενεργοποιήσω έτσι ώστε ο χρήστης όταν κάνει shutdown την εφαρμογή να μπορέσει να κλείσει η εφαρμογή ελεγχόμενα. &lt;/p&gt;&lt;p&gt;Και άλλες ιδέες δεκτές! &lt;br&gt;&lt;/p&gt;</description></item></channel></rss>