2012-06-01 3 views
1

이름이 생성 된 스토리 보드를 찾는 데 문제가 있습니다. 이 코드는 여러 번 호출되고 반환 값은 비동기이기 때문에 클래스 변수를 사용할 수 없습니다.동적으로 생성 된 Storyboard 인스턴스 찾기 (WPF)

당신은 자세한 내용은 내 다른 질문을 볼 수 Here

내 코드 :

private void refreshPostIt(int index) 
    { 
     Button btn = // Button to rotate 
     Storyboard sb = new Storyboard(); 
     sb.Name = "sb" + postItIndex; 

     Storyboard.SetTarget(rotate, btn); 
     Storyboard.SetTargetName(rotate, btn.Name); 
     Storyboard.SetTargetProperty(rotate, new PropertyPath("(UIElement.RenderTransform).(RotateTransform.Angle)")); 
     sb.Children.Add(rotate); 
     sb.Begin(btn, true); 

     // Asynchronous call 
     BackgroundWorker bgw = new BackgroundWorker(); 
     bgw.DoWork += new DoWorkEventHandler(bgw_DoWork); 
     bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted); 
     bgw.RunWorkerAsync(postItIndex); 
    } 
private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     int postItIndex = // Retrieved from e.Arguments 
     Button btn = // Find the Button thanks to the postItIndex 

     Storyboard sb = // Here is my problem, how to find the Storyboard 
     if (sb != null) 
     { 
      // Stop rotation 
      //sb.Stop(btn); 
     } 
    } 
+0

MVVM을 사용하지 않기 때문에이 문제가 발생합니다. viewmodel에 "postIt"모음이있는 경우 각각에 IsRefreshing 속성이 있습니다. BeginStoryBoard와 Stop을 사용할 수 있습니다. xaml을 설정하는 방법을 설명하는 답글을 게시 할 예정이지만 데이터 수집을 위해 컬렉션과 UI를 적용하는 방법은 ... –

답변

1

항상 BackgroundWorker에 상속하는 클래스를 만들 수 있습니다, 그것은 봉인 아닙니다. 완성 된 이벤트에 전달할 정보가 들어있는 속성을 해당 클래스에 추가하십시오.

class StoryboardWorkerArgs 
    { 
     public Storyboard StoryBoard { get; set; } 
     public object Other { get; set; } 
    } 

    class BackgroundWorker2 : BackgroundWorker 
    { 
     public StoryboardWorkerArgs Args { get; set; } 
    } 

그러면 스토리 보드를 args 속성으로 설정할 수 있습니다.

BackgroundWorker2 worker = new BackgroundWorker2(); 
worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); 
worker.Args = new StoryboardWorkerArgs() 
{ 
    StoryBoard = null, /* reference to your storyboard*/ 
    Other = null, /* postItIndex */ 
}; 
worker.RunWorkerAsync(); 

완료 한 이벤트.

void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    BackgroundWorker2 sender2 = sender as BackgroundWorker2; 
    if (sender2 != null) 
    { 
     var story = sender2.Args.StoryBoard; // <- your storyboard. 
    } 
} 
+0

위대한, 솔루션은 잘 작동합니다. 그러나 호출자에게 전달하는 인수 클래스만으로이를 수정했습니다. 고맙습니다. –

+0

위의 페이지 중 하나를 사용했다면 다른 사람들에게 표시해주세요. 결과를 얻기 위해 자신 만의 방법을 찾은 경우 그것을 답으로 추가하고 다른 사람들이 문제를 해결할 수있는 방법을 알 수 있도록 표시하십시오. – Andy

1

"postIt"을 표시하는 데 MVVM을 사용하는 경우 스토리 보드를 시작하고 중지하면 완전히 XAML로 표시됩니다. 창에서

Class MyApp : INotifyPropertyChanged 
    ObservableCollection<Post> Posts {get;set;} 
    void RefreshPost(int id); 

Class Post : INotifyPropertyChanged 
    bool IsRefreshing {get;set;} 

이 ItemTemplate을 가진 목록 상자에 있습니다 : 당신은 (의사)와 같은 soemthing해야 뷰 모델

<Style> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding IsRefreshing}" 
        Value="True"> 
      <DataTrigger.EnterActions> 
       <BeginStoryboard x:Name="rotating"> 
        <Storyboard> 
         <DoubleAnimation... /> 
        </Storyboard> 
       </BeginStoryboard> 
      </DataTrigger.EnterActions> 
      <DataTrigger.ExitActions> 
       <StopStoryboard BeginStoryboardName="rotating" /> 
      </DataTrigger.ExitActions> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

:

이 골대를 나타내는 UIItem의 DataTemplate에 다음 pseudostyle이 당신 포스트, 그리고 ItemsSource 포스트 콜렉션을 제공하십시오.

그리고 Window의 datacontext는 MyApp의 인스턴스로 설정됩니다. 그래서 어떤 게시물의 IsRrefreshing을 변경하면 UI가 나머지를 처리합니다.

관련 문제