2011-05-11 11 views
16

मैं वर्तमान में एक wpf C# अनुप्रयोग विकसित कर रहा हूं। जब खिड़की बंद हो जाती है और खिड़की बंद हो जाती है तो खिड़की लोड होने पर फीका करने के लिए फॉर्म के xaml में ईवेंट ट्रिगर्स में जोड़ा गया है।एक विंडो बाहर फिसलने

किसी भी समस्या के बिना पूरी तरह से काम करता है लेकिन लुप्तप्राय काम नहीं कर रहा है।

मैं यह इतना की स्थापना विंडो में fades जब यह लोड करता है एक टाइमर 5 सेकंड तक के लिए है, और फिर प्रपत्र घटना बाहर फीका कॉल की है।

हालांकि, खिड़की बाहर नहीं निकलती है, यह सीधे एनीमेशन को बंद कर देती है। नीचे दिए गए कोड मैं में फीका के लिए है और घटनाओं

<Window.Triggers> 
     <EventTrigger RoutedEvent="Window.Loaded"> 
      <BeginStoryboard> 
       <Storyboard Name="FormFade"> 
        <DoubleAnimation Name="FormFadeAnimation" 
            Storyboard.TargetProperty="(Window.Opacity)" 
            From="0.0" To="1.0" Duration="0:0:1" 
            AutoReverse="False" RepeatBehavior="1x" /> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
     <EventTrigger RoutedEvent="Window.Unloaded"> 
      <BeginStoryboard> 
       <Storyboard Name="FormFadeOut" Completed="FormFadeOut_Completed"> 
        <DoubleAnimation Name="FormFadeOutAnimation" 
            Storyboard.TargetName="FormFadeOut" 
            Storyboard.TargetProperty="(Window.Opacity)" 
            From="1.0" To="0.0" Duration="0:0:1" 
            AutoReverse="False" RepeatBehavior="1x" /> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
    </Window.Triggers> 

आप की पेशकश कर सकते हैं किसी भी मदद के लिए धन्यवाद बाहर फीका है।

+0

[करीब पर एक WPF खिड़की से बाहर लुप्त] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/867656/fading-out-a-wpf-window-on-close) –

+0

उपरोक्त के लिए बस एक नोट: स्तरित विंडोज '(विंडो स्टाइल = कोई नहीं, अनुमति ट्रांस्पेरेंसी = सही, पृष्ठभूमि = पारदर्शी) 'विंडोज विस्टा या बाद में हार्डवेयर प्रदान किया जा सकता है और जब यह लुप्त हो जाए तो काला आयताकार से बच जाएगा। – AlexO

उत्तर

29

Unloaded, इस के लिए एक उपयुक्त घटना नहीं है, तो इस घटना को भी खिड़कियों के लिए हो सकता है मुझे यकीन नहीं कर रहा हूँ। आपको Closing को संभालने की आवश्यकता है, इसे वास्तव में बंद करने से रोकें, एनीमेशन शुरू करें और Completed एनीमेशन की घटना होने पर इसे बंद करें।

उदा

<Window ... 
     Closing="Window_Closing"> 
private void Window_Closing(object sender, CancelEventArgs e) 
{ 
    Closing -= Window_Closing; 
    e.Cancel = true; 
    var anim = new DoubleAnimation(0, (Duration)TimeSpan.FromSeconds(1)); 
    anim.Completed += (s, _) => this.Close(); 
    this.BeginAnimation(UIElement.OpacityProperty, anim); 
} 
+0

मैंने आपके द्वारा सुझाए गए प्रयासों का प्रयास किया है और अब यह एक अपवाद के साथ आ रहा है कि 'विंडो। क्लोजिंग वैल्यू को संपत्ति के लिए असाइन नहीं किया जा सकता है' ऑब्जेक्ट का रूटेड इवेंट सिस्टम। विंडो.इवेंट ट्रिगर – Boardy

+0

क्या आप कोड देख सकते हैं? यह EventTriggers के अंदर ** ** नहीं है। –

+0

क्षमा करें, मैं आपके कोड को गलत तरीके से पढ़ता हूं, मदद करता हूं – Boardy

6

सिर्फ इस नमूना

<Window x:Class="FadeInAndOutWindow.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300" Closing="Window_Closing" x:Name="winHelp"> 
<Window.Triggers> 
    <EventTrigger RoutedEvent="Window.Loaded"> 
     <BeginStoryboard> 
      <Storyboard Name="FormFade"> 
       <DoubleAnimation Name="FormFadeAnimation" 
            Storyboard.TargetName="winHelp" 
            Storyboard.TargetProperty="(Window.Opacity)" 
            From="0.0" 
            To="1.0" 
            Duration="0:0:1" 
            AutoReverse="False" 
            RepeatBehavior="1x" /> 
      </Storyboard> 
     </BeginStoryboard> 
    </EventTrigger> 
    <EventTrigger RoutedEvent="Window.Unloaded"> 
     <BeginStoryboard> 
      <Storyboard Name="FormFadeOut" 
         Completed="FormFadeOut_Completed"> 
       <DoubleAnimation Name="FormFadeOutAnimation" 
            Storyboard.TargetName="winHelp" 
            Storyboard.TargetProperty="(Window.Opacity)" 
            From="1.0" 
            To="0.0" 
            Duration="0:0:1" 
            AutoReverse="False" 
            RepeatBehavior="1x" /> 
      </Storyboard> 
     </BeginStoryboard> 
    </EventTrigger> 
</Window.Triggers>  
<Grid> 

</Grid> 

namespace FadeInAndOutWindow 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
     } 

     private bool closeCompleted = false; 


     private void FormFadeOut_Completed(object sender, EventArgs e) 
     { 
      closeCompleted = true; 
      this.Close(); 
     } 

     private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
     { 

      if (!closeCompleted) 
      { 
       FormFadeOut.Begin(); 
       e.Cancel = true; 
      } 
     } 

    } 
} 
5

H.B. कोशिश समाधान अच्छा है लेकिन खिड़की को प्रभावी रूप से बंद न करें क्योंकि बंद करें() window_Closing और लूप को कॉल करें। यहाँ मेरी काम कर समाधान:

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     AlreadyFaded = false; 
    } 

    bool AlreadyFaded; 
    private void window_Closing(object sender, CancelEventArgs e) 
    { 
     if (!AlreadyFaded) 
     { 
      AlreadyFaded = true; 
      e.Cancel = true; 
      var anim = new DoubleAnimation(0, (Duration)TimeSpan.FromSeconds(1)); 
      anim.Completed += new EventHandler(anim_Completed); 
      this.BeginAnimation(UIElement.OpacityProperty, anim); 
     } 
    } 

    void anim_Completed(object sender, EventArgs e) 
    { 
     Close(); 
    } 
+0

में परिभाषित किया गया है यह समाधान बहुत अच्छा काम करता है। मैंने बेसविंडो क्लास बनाया है और मेरी सभी खिड़कियां इससे प्राप्त होती हैं। मेरी सभी खिड़कियों में अब यह व्यवहार है। इस उन्नत संस्करण के लिए धन्यवाद। – alexandrudicu

+0

बहुत अच्छा काम करता है, लेकिन किसी कारण से यह एक काला आयताकार दिखाता है जब यह लुप्त हो जाता है .. उस पर कोई विचार? – Mittchel

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