codememo

WPF에 "All Children loaded" 이벤트가 있습니까?

tipmemo 2023. 5. 3. 21:27
반응형

WPF에 "All Children loaded" 이벤트가 있습니까?

페이지 로드 이벤트를 듣고 있습니다.그 이벤트는 먼저 발사되고 그 다음에 모든 아이들이 로드 이벤트를 발사합니다.아이들이 다 실었을 때 발사되는 이벤트가 필요합니다.그게 존재합니까?

듣고 있어요.저는 또한 이것에 대한 WPF의 즉시 사용 가능한 솔루션을 놓치고 있습니다.

때때로 모든 하위 컨트롤이 로드된 후에 일부 코드가 실행되기를 원할 수 있습니다.

상위 컨트롤의 생성자에 저장

Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new Action(() => {code that should be executed after all children are loaded} ));

지금까지 몇 번 도와줬어요

Loaded모든 아이들이 일어난 후에 화재가 발생하는 사건입니다.Initialized.거기에는 없다AfterLoad제가 알기로는 사건입니다.할 수 있으면 아이들의 논리를 다음으로 옮깁니다.Initialized이벤트, 그리고Loaded모든 항목이 초기화된 후에 발생합니다.

MSDN - 개체 수명 이벤트를 참조하십시오.

콘텐츠 렌더링 이벤트도 사용할 수 있습니다.

http://msdn.microsoft.com/en-us/library/ms748948.aspx#Window_Lifetime_Events

대부분의 경우 데이터가 특정 자식을 Visual Tree에 로드할지 여부를 결정하기 때문에 WPF는 이러한 이벤트를 제공할 수 없습니다(예: DataTemplate 내부의 UI 요소).

따라서 시나리오를 좀 더 명확하게 설명해 주시면 이에 대한 구체적인 해결책을 찾을 수 있습니다.

선택사항 중 하나(내용이 렌더링될 때):

이.레이아웃 업데이트됨 += 온레이아웃 업데이트됨;

private void OnLayoutUpdated(object sender, EventArgs e)
            {
                if (!isInitialized && this.ActualWidth != 0 && this.ActualHeight != 0)
                {
                    isInitialized = true;
                    // Logic here
                }
            };

당신의 안에 넣으세요.xaml대기할 구성 요소, 로드 이벤트Loaded="MyControl_Loaded"맘에 들다

<Grid Name="Main" Loaded="Grid_Loaded"...>
<TabControl Loaded="TabControl_Loaded"...>
<MyControl Loaded="MyControl_Loaded"...>
...

그리고 당신의 안에서code

bool isLoaded;

private void MyControl_Loaded(object sender, RoutedEventArgs e)
{
   isLoaded = true;
}

그런 다음, 어떤 작업을 수행해야 하지만 모든 구성 요소가 제대로 로드되기 전에 트리거된 이벤트 트리거 내부에 다음과 같이 입력합니다.if(!isLoaded) return;맘에 들다

private void OnButtonChanged(object sender, RoutedEventArgs e)
{
    if(!isLoaded) return;

    ... // code that must execute on trigger BUT after load
}

저는 결국 이 노선들을 따라 무언가를 하게 되었습니다.당신의 마일리지는 다양할 수 있습니다.

void WaitForTheKids(Action OnLoaded)
{
  // After your children have been added just wait for the Loaded
  // event to fire for all of them, then call the OnLoaded delegate

  foreach (ContentControl child in Canvas.Children)
  {
    child.Tag = OnLoaded; // Called after children have loaded
    child.Loaded += new RoutedEventHandler(child_Loaded);
  }
}
internal void child_Loaded(object sender, RoutedEventArgs e)
{
  var cc = sender as ContentControl;
  cc.Loaded -= new RoutedEventHandler(child_Loaded);

  foreach (ContentControl ctl in Canvas.Children)
  {
    if (!ctl.IsLoaded)
    {
      return;
    }
  }
  ((Action)cc.Tag)();
}

언급URL : https://stackoverflow.com/questions/567216/is-there-a-all-children-loaded-event-in-wpf

반응형