2009-01-07 8 views
31

एक रद्द करें बटन के पीछे मूल विचार एक एस्केप कीप्रेस के साथ अपनी विंडो को बंद करने में सक्षम है।डब्ल्यूपीएफ बटन। आईस्केल संपत्ति कैसे काम करती है?

आप IsCancel संपत्ति रद्द करें बटन को सही पर है, जिससे रद्द करें बटन स्वचालित रूप से पास करने के लिए क्लिक निपटने घटना के बिना संवाद स्थापित कर सकते हैं।

स्रोत: प्रोग्रामिंग WPF (ग्रिफ़िथ, सेल्स)

तो यह काम करना चाहिए

<Window> 
<Button Name="btnCancel" IsCancel="True">_Close</Button> 
</Window> 

हालांकि व्यवहार मैं उम्मीद मेरे लिए बाहर काम नहीं कर रहा। मूल विंडो एप्लिकेशन द्वारा निर्दिष्ट मुख्य एप्लिकेशन विंडो है। स्टार्टअप यूआरआई संपत्ति। क्या काम करता है

<Button Name="btnCancel" IsCancel=True" Click="CloseWindow">_Close</Button> 

private void CloseWindow(object sender, RoutedEventArgs) 
{ 
    this.Close(); 
} 
  • कि क्या विंडो एक सामान्य विंडो या एक संवाद है के आधार पर IsCancel अलग के व्यवहार है है? IsCancel केवल विज्ञापन के रूप में काम करता है अगर ShowDialog कहा जाता है?
  • क्या एस्केप प्रेस पर विंडो बंद करने के लिए बटन के लिए एक स्पष्ट क्लिक हैंडलर आवश्यक है (IsCancel सत्य पर सेट है)?

उत्तर

29

हाँ, यह केवल संवादों पर काम करता है के रूप में एक सामान्य विंडो "रद्द" की धारणा नहीं है, यह ही है DialogResult.Cancel WinForms में ShowDialog से लौटने के रूप में।

यदि आप बच के साथ एक खिड़की को बंद आप एक हैंडलर PreviewKeyDown को खिड़की पर कि क्या यह Key.Escape है पर पिक जोड़ सकता है, और उसे बंद प्रपत्र करना चाहता था:

public MainWindow() 
{ 
    InitializeComponent(); 

    this.PreviewKeyDown += new KeyEventHandler(CloseOnEscape); 
} 

private void CloseOnEscape(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Escape) 
     Close(); 
} 
16

हम स्टीव जवाब एक ले जा सकते हैं आगे बढ़ें और एक संलग्न संपत्ति बनाएं जो किसी भी विंडो के लिए "बंद से बचें" कार्यक्षमता प्रदान करती है। संपत्ति को एक बार लिखें और किसी भी विंडो में इसका इस्तेमाल करें। बस खिड़की XAML करने के लिए निम्नलिखित जोड़ें:

yournamespace:WindowService.EscapeClosesWindow="True" 

यहाँ संपत्ति के लिए कोड है:

using System.Windows; 
using System.Windows.Input; 

/// <summary> 
/// Attached behavior that keeps the window on the screen 
/// </summary> 
public static class WindowService 
{ 
    /// <summary> 
    /// KeepOnScreen Attached Dependency Property 
    /// </summary> 
    public static readonly DependencyProperty EscapeClosesWindowProperty = DependencyProperty.RegisterAttached(
     "EscapeClosesWindow", 
     typeof(bool), 
     typeof(WindowService), 
     new FrameworkPropertyMetadata(false, new PropertyChangedCallback(OnEscapeClosesWindowChanged))); 

    /// <summary> 
    /// Gets the EscapeClosesWindow property. This dependency property 
    /// indicates whether or not the escape key closes the window. 
    /// </summary> 
    /// <param name="d"><see cref="DependencyObject"/> to get the property from</param> 
    /// <returns>The value of the EscapeClosesWindow property</returns> 
    public static bool GetEscapeClosesWindow(DependencyObject d) 
    { 
     return (bool)d.GetValue(EscapeClosesWindowProperty); 
    } 

    /// <summary> 
    /// Sets the EscapeClosesWindow property. This dependency property 
    /// indicates whether or not the escape key closes the window. 
    /// </summary> 
    /// <param name="d"><see cref="DependencyObject"/> to set the property on</param> 
    /// <param name="value">value of the property</param> 
    public static void SetEscapeClosesWindow(DependencyObject d, bool value) 
    { 
     d.SetValue(EscapeClosesWindowProperty, value); 
    } 

    /// <summary> 
    /// Handles changes to the EscapeClosesWindow property. 
    /// </summary> 
    /// <param name="d"><see cref="DependencyObject"/> that fired the event</param> 
    /// <param name="e">A <see cref="DependencyPropertyChangedEventArgs"/> that contains the event data.</param> 
    private static void OnEscapeClosesWindowChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     Window target = (Window)d; 
     if (target != null) 
     { 
     target.PreviewKeyDown += new System.Windows.Input.KeyEventHandler(Window_PreviewKeyDown); 
     } 
    } 

    /// <summary> 
    /// Handle the PreviewKeyDown event on the window 
    /// </summary> 
    /// <param name="sender">The source of the event.</param> 
    /// <param name="e">A <see cref="KeyEventArgs"/> that contains the event data.</param> 
    private static void Window_PreviewKeyDown(object sender, KeyEventArgs e) 
    { 
     Window target = (Window)sender; 

     // If this is the escape key, close the window 
     if (e.Key == Key.Escape) 
     target.Close(); 
    } 
} 
+3

हां। संलग्न गुण अभी भी मेरे सिर में तुरंत 'क्लिक' नहीं करते हैं। – Gishu

+0

बहुत अच्छा काम करता है, केवल एक चीज यह है कि मुझे कास्टिंग को विंडो में बदलना था और यहां सुझाए गए शून्य के लिए एक और चेक जोड़ना था - http://stackoverflow.com/questions/10206742/unable-to-cast-object-of-type माइक्रोसॉफ्ट-एक्सप्रेशन-प्लेटफार्म-डब्लूपीएफ-इंस्टेंसबिल्डर, त्रुटि से बचने के लिए "प्रकार की ऑब्जेक्ट डालने में असमर्थ" माइक्रोसॉफ्ट.एक्सप्रेसियन। प्लेटफार्म.WPF.InstanceBuilders.WindowInstance 'टाइप करने के लिए' System.Windows.Window '"(प्रोजेक्ट बनाने में सक्षम था सफलतापूर्वक, लेकिन त्रुटियां परेशान थीं। यह मेरे वीएस 2012 + आर # के लिए है। इसके बाद मुझे इसके बाद वीएस को पुनरारंभ करना पड़ा। – sarh

6

यह बिल्कुल सही नहीं है यह है ... MSDN इस कहते हैं: जब आप सेट एक बटन की IsCancel संपत्ति सत्य है, आप AccessKeyManager के साथ पंजीकृत एक बटन बनाते हैं। बटन तब सक्रिय होता है जब कोई उपयोगकर्ता ईएससी कुंजी दबाता है। तो तुम के पीछे अपने कोड में कोई हैंडलर की जरूरत है और आप किसी भी संलग्न गुण या जैसे कि

+2

एमएसडीएन बिल्कुल पूरा नहीं है - यहां कोड देखें: http://referencesource.microsoft.com/#PresentationFramework/ फ्रेमवर्क/सिस्टम/विंडोज/कंट्रोल/बटन सीएस, 274 जब कोई बटन दबाया जाता है, यदि कोई कमांड असाइन नहीं किया गया है और IsCancel सेट है, तो डायलॉग कैंसल स्वचालित रूप से निष्पादित हो जाता है (ऑनक्लिक हैंडलर पूर्ण होने के बाद)। – Govert

1

WPF AcceptButton में हाँ इस right.In है विंडोज़ अनुप्रयोग कुछ चाहिए और रद्द करें बटन नहीं है नहीं है। लेकिन एक बात यह है कि यदि आप अपनी नियंत्रण दृश्यता को झूठी के रूप में सेट कर रहे हैं, तो यह अपेक्षित काम नहीं करेगा। इसके लिए आपको WPF में सत्य के रूप में दृश्यता बनाने की आवश्यकता है।उदाहरण के लिए:

:

<Button x:Name="btnClose" Content="Close" IsCancel="True" Click="btnClose_Click"></Button> 

तो फिर तुम कोड में btnClose_Click लिखने फ़ाइल के पीछे है:

<Button x:Name="btnClose" Content="Close" IsCancel="True" Click="btnClose_Click" Visibility="Hidden"></Button> 

तो, आप इसे बनाने की जरूरत है (यह अभी नहीं बटन क्योंकि यहां दृश्यता गलत है के लिए काम नहीं कर रहा)

private void btnClose_Click (object sender, RoutedEventArgs e) 
    { this.Close(); } 
संबंधित मुद्दे