sourcecode

창의 차이점은 무엇입니까?로드됨 및 창.콘텐츠 렌더링 이벤트

copyscript 2023. 5. 9. 22:56
반응형

창의 차이점은 무엇입니까?로드됨 및 창.콘텐츠 렌더링 이벤트

다른 점은 무엇입니까?Window.Loaded그리고.Window.ContentRenderedWPF의 이벤트?은 ▁이▁is?ContentRendered이벤트가 먼저 호출되었습니까?

에 대한 Window.ContentRendered여기서의 사건은 단지 말합니다.

창의 내용이 렌더링된 후에 발생합니다.

에 대한 Window.Loaded여기 사건에 의하면

요소가 배치되고 렌더링되며 상호 작용할 준비가 될 때 발생합니다.

윈도우의 를 설정하고 싶은 .MaxHeight창을 표시하는 화면의 작업 영역 높이로 표시됩니다.제가 어떤 종목에서 해야 하나요?

편집:

찾고 있던 것을 찾은 것 같은데, 지금은 더 혼란스럽습니다.Loaded하고 그 에 이벤트가 발생합니다.ContentRendered사건이 일어납니다.Chris Sells & Ian Griffiths의 책 Programming WPF에서, 그것은 다음과 같이 말합니다.Loaded는 이트는벤입니다.

윈도우가 표시되기 직전에 상승됨

'콘텐츠 렌더링' 이벤트는

창의 내용이 시각적으로 렌더링될 때 상승합니다.

에서 MSDN에 과 모순됩니다.Loaded 이벤트:

요소가 배치되고 렌더링되며 상호 작용할 준비가 될 때 발생합니다.

이것은 지금 훨씬 더 혼란스럽습니다.

저는 두 종목 사이에 거의 차이가 없다고 생각합니다.이를 이해하기 위해 간단한 조작 예제를 만들었습니다.

XAML

<Window x:Class="LoadedAndContentRendered.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Name="MyWindow"
        Title="MainWindow" Height="1000" Width="525"
        WindowStartupLocation="CenterScreen"
        ContentRendered="Window_ContentRendered"     
        Loaded="Window_Loaded">

    <Grid Name="RootGrid">        
    </Grid>
</Window>

Code behind

private void Window_ContentRendered(object sender, EventArgs e)
{
    MessageBox.Show("ContentRendered");
}

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Loaded");
}   

" 이경메시는지"Loaded메시지 뒤에 첫 번째로 나타납니다.ContentRendered이렇게 하면 설명서의 정보를 확인할 수 있습니다.

에서 WPF는 과 같습니다.Loaded이벤트는 다음과 같은 경우:

배치, 렌더링 및 상호 작용 준비가 완료되었습니다.

로 WPF는Window이지만 일반적으로 는동한요소예만일루로패배내트열합용야니어이다된에널으반적지이일예▁that:▁(합니(▁is▁be다:Grid 따라서, 의 내용을 모니터링합니다.Window그리고 그것을 만들었습니다.ContentRendered: 벤트이. MSDN의 비고:

창에 내용이 없으면 이 이벤트는 발생하지 않습니다.

우리가 만, 만면든다가우리즉을 ,Window:

<Window x:Class="LoadedAndContentRendered.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Name="MyWindow"        
    ContentRendered="Window_ContentRendered" 
    Loaded="Window_Loaded" />

그것은 오직 작동할 것입니다.Loaded 건의사의

의 에 대한 .Window그들은 같은 방식으로 일합니다.다음을 생성합니다.Label 체로대에GridWindow두 경우 모두 성공적으로 액세스했습니다.Width:

private void Window_ContentRendered(object sender, EventArgs e)
{
    MessageBox.Show("ContentRendered: " + SampleLabel.Width.ToString());
}

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Loaded: " + SampleLabel.Width.ToString());
}   

Styles그리고.Templates이 단계에서는 성공적으로 적용되며, 이러한 이벤트에서는 액세스할 수 있습니다.

예를 들어, 다음을 추가하려고 합니다.Button:

private void Window_ContentRendered(object sender, EventArgs e)
{
    MessageBox.Show("ContentRendered: " + SampleLabel.Width.ToString());

    Button b1 = new Button();
    b1.Content = "ContentRendered Button";
    RootGrid.Children.Add(b1);
    b1.Height = 25;
    b1.Width = 200;
    b1.HorizontalAlignment = HorizontalAlignment.Right;
}

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Loaded: " + SampleLabel.Width.ToString());

    Button b1 = new Button();
    b1.Content = "Loaded Button";
    RootGrid.Children.Add(b1);
    b1.Height = 25;
    b1.Width = 200;
    b1.HorizontalAlignment = HorizontalAlignment.Left;
}

의 경우에는Loaded이벤트,Button덧붙여서Grid의 출현과 동시에.Window의 경우에는ContentRendered이벤트,Button덧붙여서Grid모든 내용이 표시될 것입니다.

따라서 로드 전에 항목 또는 변경 사항을 추가하려는 경우Window사용해야 합니다.Loaded이벤트. 내용과 관련된 작업을 수행하려면Window스크린샷을 찍는 것과 같이 이벤트를 사용하는 데 필요합니다.ContentRendered.

링크 https://learn.microsoft.com/en-us/previous-versions/dotnet/netframework-4.0/ms748948(v=vs.100)#window-lifetime-events 에 방문하여 Window Lifetime Events(윈도우 라이프타임 이벤트)로 스크롤하면 이벤트 순서가 표시됩니다.

열기:

  1. 소스 시작됨
  2. 활성화됨
  3. 로드됨
  4. 콘텐츠 렌더링

닫기:

  1. 마감
  2. 비활성화됨
  3. 마감됨

데이터 바인딩을 사용하는 경우 ContentRendered 이벤트를 사용해야 합니다.

아래 코드의 경우 Loaded 이벤트가 발생하면 헤더가 NULL입니다.그러나 헤더는 ContentRendered 이벤트가 발생할 때 값을 가져옵니다.

<MenuItem Header="{Binding NewGame_Name}" Command="{Binding NewGameCommand}" />

창 클래스 상속

  • 물건
  • 디스패처 개체
  • 종속성 개체
  • 시각.
  • UI 요소
  • FrameworkElement <- 여기가 Loaded가 사는 입니다.
  • 통제
  • 콘텐츠 제어
  • 창 <- 여기가 콘텐츠 렌더링이 사는 곳입니다.

차이점은 Loaded는 창 자체(FrameworkElement 객체)가 준비될 때 실행된다는 것입니다. 그러나 창 자체는 최소화 및 최대화 단추가 있는 제목 표시줄일 뿐이며 중간에 큰 빈 공간이 있습니다.

큰 빈 공간은 내용 컨트롤이므로 창이 로드되고 준비된 후 "중요" 비트인 창의 내용으로 주의를 돌립니다.

창의 내용이 화면에 렌더링되면 내용 렌더링이 실행됩니다.

참고: 창에 내용이 없으면 내용 렌더링 이벤트가 실행되지 않습니다.

이것은 사이의 차이에 관한 것이 아닙니다.Window.ContentRendered그리고.Window.Loaded하지만 그 방법에 대해서는.Window.Loaded이벤트를 사용할 수 있습니다.

시간이 오래 걸리는 모든 애플리케이션에서 화면이 튀는 것을 방지하기 위해 사용합니다.

    // initializing my main window
    public MyAppMainWindow()
    {
        InitializeComponent();

        // Set the event
        this.ContentRendered += MyAppMainWindow_ContentRendered;
    }

    private void MyAppMainWindow_ContentRendered(object sender, EventArgs e)
    {
        // ... comes up quick when the controls are loaded and rendered

        // unset the event
        this.ContentRendered -= MyAppMainWindow_ContentRendered;

        // ... make the time comsuming init stuff here
    }

언급URL : https://stackoverflow.com/questions/18452756/whats-the-difference-between-the-window-loaded-and-window-contentrendered-event

반응형