사용자 컨트롤이 표시될 때 발생하는 이벤트는 무엇입니까?
WPF에 페이드 효과(애니메이션)를 추가하려고 합니다.UserControls(그렇기는 하지만)FrameworkElement더 일반적으로).
만약 내가 허락한다면,Loaded이벤트 트리거: 초기 페이드인. 페이드 애니메이션은 때때로 UserControl이 표시되기 전에 시작됩니다.결과는 엉망입니다.예를 들어 UserControl이 Loaded 이벤트 처리기에서 쿼리 실행과 같은 긴 작업(10분의 1초)을 수행하는 경우 이러한 문제가 발생합니다.
따라서 컨텐츠가 렌더링될 때 FrameworkElement/UserControl에서 받는 이벤트를 처리하고 페이드인을 시작해야 합니다.그System.Windows.Window을 가지고 있습니다.ContentRendered이벤트가 발생하지만 UserControl은 그렇지 않습니다.그러면 Framework Element(또는 UserControl)가 렌더링되면 어떤 이벤트가 발생합니까?
크기 변경 또는 레이아웃 업데이트에서 크기를 확인합니다.실제 너비 또는 높이가 0이 아닐 때 작업을 수행합니다.
view.LayoutUpdated+=(o,e)=>
{
if (!loaded && (view.ActualHeight > 0 || view.ActualWidth > 0))
{
// You can also unsubscribe event here.
loaded =true;
}
}
몇 년이나 늦었지만, 지금부터 해결책을 찾았지만 헛수고였기 때문에, 저는 제 발견을 공유하고 싶습니다.
만약 당신이 원한다면,ContentRendered모든 컨트롤(또는 시각적 또는 심지어 종속성 개체)에 대한 이벤트를 파야 합니다.Visual.
다음 코드를 사용합니다.
// Wait for Control to Load
void TestUserControl_Loaded(object sender, RoutedEventArgs e)
{
// Get PresentationSource
PresentationSource presentationSource = PresentationSource.FromVisual((Visual)sender);
// Subscribe to PresentationSource's ContentRendered event
presentationSource.ContentRendered += TestUserControl_ContentRendered;
}
void TestUserControl_ContentRendered(object sender, EventArgs e)
{
// Don't forget to unsubscribe from the event
((PresentationSource)sender).ContentRendered -= TestUserControl_ContentRendered;
// ..
}
제어를 기다려야 합니다.Loaded그렇지 않은 경우 프레젠테이션Source.FromVisual()이 null을 반환합니다.
다양한 발송인.BeginInvoke 메서드가 일관되게 작동하지 않았습니다.때때로 컨트롤이 실제로 표시되기 훨씬 전에 렌더링된 이벤트를 실행합니다.
이것은 항상 저에게 효과가 있습니다.
저는 제가 HwndSource를 가지고 놀고 있다는 것을 알고 있는데, 이는 상당히 낮은 수준이며 가능한 영향을 미칠지 확신할 수 없습니다.(아마 더 경험이 많은 사람이 자세히 설명할 수 있을 것입니다.)
IsVisibleChanged 이벤트 할당 이벤트 핸들러를 사용할 수 있습니다.
MyUserControl.IsVisibleChanged += ScheduleUserControl_IsVisibleChanged;
이벤트 핸들러에서 표시 여부를 확인합니다.
void _IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if ((bool)e.NewValue)
{
//Visible
}
else
{
//Not Visible
}
}
작업 시작을 예약할 수 있습니다.Storyboard우선 순위가 낮은 경우, 예:
Dispatcher.BeginInvoke(BeginStoryboardAction, DispatcherPriority.ContextIdle);
다음은 이 방법 사용과 관련된 문제를 설명하는 문서입니다.
시도해 보세요IsVisibleChanged하지만 나 자신은 그것을 많이 사용하지 않았습니다.
IsVisible 속성 값 이외의 이유로 요소가 레이아웃 시스템에서 렌더링되지 않는 경우 이 이벤트가 발생하지 않습니다.예를 들어 요소에 연결된 시각적 요소가 없을 수 있습니다.
GotFocus 이벤트를 사용할 수 있습니다.
<i:Interaction.Triggers>
<i:EventTrigger EventName="GotFocus">
<i:InvokeCommandAction Command="{Binding ContentControlLoadedCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
언급URL : https://stackoverflow.com/questions/4708039/what-event-is-fired-when-a-usercontrol-is-displayed
'programing' 카테고리의 다른 글
| 끌어 당겨서 UITableView 컨트롤러 없이 UITableView 새로 고침 (0) | 2023.04.29 |
|---|---|
| 오류: 참조 테이블 "bar"에 대해 지정된 키와 일치하는 고유 제약 조건이 없습니다. (0) | 2023.04.29 |
| 읽기 전용 속성에서는 양방향 또는 단방향 ToSource 바인딩이 작동할 수 없습니다. (0) | 2023.04.29 |
| 푸시되지 않은 GIT 커밋을 삭제하려면 어떻게 해야 합니까? (0) | 2023.04.29 |
| 프로젝트에서 코코아 포드를 제거하는 방법은 무엇입니까? (0) | 2023.04.29 |