2010-09-06 30 views
12

Tôi cần thay đổi trạng thái điều khiển và sau đó thực hiện một số thao tác. Để cụ thể, tôi muốn chạy một hình động trước khi điều khiển bị ẩn. Tôi muốn thực hiện một việc như sau:Làm thế nào để chờ chuyển đổi trạng thái thay đổi để kết thúc trong Silverlight 4?

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

Vấn đề là hoạt ảnh chuyển tiếp chạy không đồng bộ và do đó điều khiển được xóa khỏi cây trực quan ngay sau khi bắt đầu hoạt ảnh.

Vậy làm cách nào để đợi hoạt ảnh kết thúc?

+0

Điều này cũng hoạt động trong WPF. Cảm ơn bài đăng, đây chính xác là những gì tôi đang tìm kiếm! –

+0

bất kỳ cách nào điều này có thể được thực hiện trong MVVM? – user20358

Trả lời

14

Bạn có thể đính kèm một sự kiện handler Storyboard.Completed để Storyboard hoặc đính kèm một xử lý sự kiện VisualStateGroup.CurrentStateChanged đến VisualStateGroup:

<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

Đây là giải pháp duy nhất xuất hiện trong đầu tôi. Nhưng nó không có vẻ rất đẹp và sạch sẽ với tôi. :-(Mặt khác, nếu không có giải pháp nào khác, tôi sẽ không có lựa chọn nào khác Cảm ơn bạn – gius

+0

Nhưng nếu chúng ta đang sử dụng Custom control thì trong trường hợp đó bạn không thể thêm handler vào xaml. –

+0

@ các giải pháp dains hoạt động cho trường hợp đó. –

3

Cách đúng xử lý vấn đề này sẽ được lắng nghe sự kiện CurrentStateChanged trên VisualStateGroup, nhưng từ kinh nghiệm của tôi nó không phải là đáng tin cậy lúc tốt nhất và bị hỏng ở tồi tệ nhất.

Tùy chọn thứ hai là móc sự kiện đã hoàn thành trên bảng phân cảnh của bạn, nhưng tùy chọn này có những cạm bẫy của riêng nó. Trong một số trường hợp, trình quản lý trạng thái trực quan tạo hình động trong nội bộ, do đó, sự kiện đã hoàn thành mà bạn đặt sẽ không được gọi.

2

Đó là trong thực tế có thể đính kèm xử lý Hoàn thành vào mã:

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; 
     } 
    } 
} 

Ví dụ từ chủ đề này: http://forums.silverlight.net/forums/p/38027/276746.aspx

Làm việc cho tôi trong dự án live sử dụng hành vi gắn liền quá! Hơi khó chịu mặc dù tôi đã phải sử dụng các thuộc tính phụ thuộc riêng biệt cho UserControl gốc (để sử dụng trong VisualStateManager.GoToState) và LayoutRoot để có được bộ sưu tập VisualStateGroup thực tế.

Các vấn đề liên quan