2010-09-06 14 views
12

मुझे नियंत्रण की स्थिति बदलने की जरूरत है और फिर कुछ कार्रवाई करें। विशिष्ट होने के लिए, मैं नियंत्रण से पहले एक एनीमेशन चलाने के लिए चाहता हूं। मैं ऐसा ही कुछ करना चाहते हैं:सिल्वरलाइट 4 में खत्म होने के लिए राज्य बदलते संक्रमण की प्रतीक्षा कैसे करें?

VisualStateManager.GoToState(control, "Hidden", true); // wait until the transition animation is finished 
ParentControl.Children.Remove(control); 

समस्या यह है कि संक्रमण एनीमेशन एसिंक्रोनस रूप से चलाया जाता है और इस तरह नियंत्रण दृश्य पेड़ सही होने के बाद एनीमेशन शुरू कर दिया है से निकाल दिया जाता है।

तो मैं एनीमेशन को समाप्त करने के लिए कैसे प्रतीक्षा करूं?

+0

यह WPF में भी काम करता है। पोस्ट के लिए धन्यवाद, यह वही है जो मैं ढूंढ रहा था! –

+0

एमवीवीएम में यह किसी भी तरह से किया जा सकता है? – user20358

उत्तर

14

आप स्टोरीबोर्ड में एक Storyboard.Completed ईवेंट हैंडलर देते हैं या VisualStateGroup करने के लिए एक VisualStateGroup.CurrentStateChanged ईवेंट हैंडलर संलग्न कर सकते हैं:

<UserControl 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" 
x:Class="SilverlightApplication7.MainPage" 
Width="640" Height="480"> 

<Grid x:Name="LayoutRoot" Background="White"> 
    <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup x:Name="VisualStateGroup" > 
      <VisualState x:Name="Hidden"> 
       <Storyboard Completed="OnHidden"> 
        <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="rectangle" d:IsOptimized="True"/> 
       </Storyboard> 
      </VisualState> 
     </VisualStateGroup> 
    </VisualStateManager.VisualStateGroups> 
    <Rectangle x:Name="rectangle" Fill="#FFF4F4F5" HorizontalAlignment="Left" Height="136" Margin="48,72,0,0" Opacity="0" Stroke="Black" VerticalAlignment="Top" Width="208"/> 
</Grid> 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 

namespace SilverlightApplication7 
{ 
public partial class MainPage : UserControl 
{ 
    public MainPage() 
    { 
     // Required to initialize variables 
     InitializeComponent(); 

     this.Loaded += new RoutedEventHandler(MainPage_Loaded); 
    } 

    void MainPage_Loaded(object sender, RoutedEventArgs e) 
    { 
     VisualStateManager.GoToState(this, "Hidden", true); 
    } 

    private void OnHidden(object storyboard, EventArgs args) 
    { 

    } 
} 

}

+0

यह एकमात्र समाधान था जो मेरे दिमाग में आया था। लेकिन यह मेरे लिए बहुत अच्छा और साफ प्रतीत नहीं होता है। :-(दूसरी तरफ, यदि कोई अन्य समाधान नहीं है, तो मेरे पास कोई विकल्प नहीं होगा। धन्यवाद। – gius

+0

लेकिन अगर हम कस्टम नियंत्रण का उपयोग कर रहे हैं तो क्या होगा? उस स्थिति में हैंडलर को xaml में जोड़ना संभव नहीं है। –

+0

@ उस मामले के लिए दाग समाधान काम करता है। –

3

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

दूसरा विकल्प आपके स्टोरीबोर्ड पर पूर्ण आयोजन को हुक करना है, लेकिन इस विकल्प को अपने आप के नुकसान हुए हैं। कुछ मामलों में दृश्य राज्य प्रबंधक आंतरिक रूप से एनिमेशन उत्पन्न करता है, इसलिए आपके द्वारा सेट की गई पूर्ण घटना को कॉल नहीं किया जाएगा।

2

यह कोड में पूर्ण हैंडलर संलग्न करने के लिए संभव है, वास्तव में है: इस सूत्र से

Collection<VisualStateGroup> grps = (Collection<VisualStateGroup>)VisualStateManager.GetVisualStateGroups(this.LayoutRoot); 
foreach (VisualStateGroup grp in grps) { 
    Collection<VisualState> states = (Collection<VisualState>)grp.States; 
    foreach (VisualState state in states) { 
     switch (state.Name) { 
      case "Intro": 
      state.Storyboard.Completed += new EventHandler(Intro_Completed);break; 
     } 
    } 
} 

उदाहरण: http://forums.silverlight.net/forums/p/38027/276746.aspx

लाइव परियोजना में मेरे लिए काम भी संलग्न व्यवहार का उपयोग कर! थोड़ा कष्टप्रद हालांकि मुझे वास्तविक VisualStateGroup संग्रह प्राप्त करने के लिए रूट UserControl (VisualStateManager.GoToState में उपयोग करने के लिए) और लेआउट रूट के लिए अलग निर्भरता गुणों का उपयोग करना पड़ा।

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