2009-03-29 4 views
3

레이블에 시간을 표시하고 싶습니다. 레이블 내용은 창이로드 될 때 자동으로 새로 고쳐 져야합니다.WPF : 창로드에 대한 새로 고침/업데이트 컨트롤

레이블 컨트롤이있는 간단한 WPF 창이 있습니다. 여기에 도시 된 바와 같이

<Window x:Class="shoes.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300" Loaded="Window_Loaded"> 
    <Grid> 
     <Label Margin="12" Name="lblSeconds"></Label> 
     <Button Margin="68,22,135,0" Name="button1" Height="24" VerticalAlignment="Top" Click="button1_Click">Button</Button> 
    </Grid> 
</Window> 

여기 사용할 수있는 코드를 보았다 : http://geekswithblogs.net/NewThingsILearned/archive/2008/08/25/refresh--update-wpf-controls.aspx

그리고이 방법에 맞게 수정 :

public partial class Window1 : Window 
{ 
    private static Action EmptyDelegate = delegate() { }; 

    public Window1() 
    { 
     InitializeComponent(); 

    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     if (IsLoaded) 
     { 
      LoopingMethod(); 
     } 
    } 

    private void LoopingMethod() 
    { 
     while(true) 
     { 
      lblSeconds.Content = DateTime.Now.ToLongTimeString(); 
      lblSeconds.Refresh(); 
      Thread.Sleep(10); 
     } 
    } 
} 
public static class ExtensionMethods 
{ 

    private static Action EmptyDelegate = delegate() { }; 


    public static void Refresh(this UIElement uiElement) 
    { 
     uiElement.Dispatcher.Invoke(DispatcherPriority.Render, EmptyDelegate); 
    } 
} 

내가 코드를 발견했다 꽤 잘 일 때 작동을 button_Click 이벤트를 통해 트리거됩니다. 이 같은 Window_Loaded 이벤트를 통해 코드를 실행하려고했지만 헛된. 창 내용은 절대로 표시되지 않습니다.

창이로드 될 때 레이블이 자동으로 업데이트되도록하려면 어떻게해야합니까?

답변

3

OnLoad 처리기가 무한 루프에 있기 때문에 정상적으로 정상입니다. 그 루프는 UI 스레드에 있으므로 Window는 결코 표시되지 않습니다.

우선 : 루프를 Backgroundworker에 랩핑하여 별도의 스레드에서 실행되도록하십시오.

또한 루프 (loop)를 통해 변경 될 때 PropertyChanged 이벤트를 발생시키는 속성을 갖는 시간 (string)으로 속성을 표시하는 INotifyPropertyChanged을 구현하는 별도의 객체로 루프 코드를 제외합니다. 물론 여전히 별도의 스레드에서 수행해야합니다 (예 : BackgroundWorker 사용). 레이블을 사용하여 특수 객체를 바인딩합니다.

다른 방법으로는 일정한 간격으로 콜백을 수행하는 Timer을 사용하며 여기에서 레이블을 업데이트 할 수 있습니다.

+0

저는 Backgroundworker를 사용하여 원하는대로했습니다! –

3

CurrentTime 속성과 함께 InotifyPropertyChanged 인터페이스를 구현하고 PropertyChanged ("CurrentTime") 이벤트를 주기적으로 발생시키는 DispatcherTimer 인스턴스가 포함 된 클래스를 작성합니다.

그러면이 객체를 양식의 리소스에 넣고 레이블의 내용을 CurrentTime 속성에 바인딩하면됩니다.

DispatcherTimer는 메시지 펌프를 사용하므로 불필요한 스레드가 필요하지 않습니다.

1

무한 루프를 사용하는 대신 DispatcherTimer를 사용하십시오.