2009-05-23 34 views
21

Không có Đồng hồ bấm giờ cho Silverlight.Đồng hồ bấm giờ cho đèn bạc?

Bạn sẽ sử dụng điều gì thay vì nó?

tôi thấy một số bài viết về những người nói để tạo ra một hình ảnh động trống rỗng và gọi GetCurrentTime() từ lớp Storyboard, tôi không thể có được nó để làm việc ...

bạn sẽ làm gì?

+2

thú vị vì trang này dường như cho biết nó tồn tại - http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.startnew(v=VS.95).aspx –

+0

@James Đó là thực sự rất thú vị. Hoặc là trang đó chỉ có lỗi, hoặc có thể nó đang đến với SL5. Bài đăng này gợi ý rằng bạn có thể tham khảo dll WP7 và sử dụng lớp Đồng hồ bấm giờ đó. Tôi đã không thử nó mặc dù. http://forums.silverlight.net/forums/p/207108/486425.aspx – Oskar

+1

@James, @Oskar: Đồng hồ bấm giờ cho Silverlight không tồn tại, nhưng chỉ dành cho Khung công tác XNA. Xem phần Thông tin Phiên bản của liên kết của bạn và so sánh với thông tin như System.Boolean: http://msdn.microsoft.com/en-us/library/system.boolean% 28v = VS.95% 29.aspx –

Trả lời

2

Có một vài điều bạn có thể làm với điều này. Nắm tay được sử dụng một cái gì đó giống như Environment.TickCount giống như người here. Tuy nhiên, điều mà tôi nghĩ có thể hoạt động tốt hơn là sử dụng số DispatcherTimer.

Để thiết lập DispatcherTimer hoạt động giống như đồng hồ bấm giờ, chúng tôi cũng sẽ cần một TimeSpan liên quan đại diện cho thời gian nó được chạy. Chúng ta có thể khởi tạo DispatcherTimer và thiết lập khoảng thời gian mà nó xử lý, và trình xử lý cho sự kiện Tick.

DispatcherTimer _timer; 
TimeSpan _time; 
public Page() 
{ 
    InitializeComponent(); 
    _timer = new DispatcherTimer(); 

    _timer.Interval = new TimeSpan(0, 0, 0, 0, 10); 
    _timer.Tick += new EventHandler(OnTimerTick); 
} 

Trong giao diện người dùng chúng ta có thể tạo ra một cái gì đó đơn giản để bắt đầu và ngừng đếm thời gian của chúng tôi, cũng như hiển thị dữ liệu đồng hồ bấm giờ:

<StackPanel> 
     <Button Content="Start" x:Name="uiStart" Click="OnStartClick" /> 
     <Button Content="Stop" x:Name="uiStop" Click="OnStopClick" /> 
     <TextBlock x:Name="uiDisplay"/> 
</StackPanel> 

Bây giờ, tất cả những gì còn lại là xử lý sự kiện.
Trình xử lý OnTimerTick sẽ tăng và hiển thị dữ liệu đồng hồ bấm giờ của chúng tôi.
Trình xử lý bắt đầu của chúng tôi sẽ xử lý việc gây quỹ/tái cấp vốn cho TimeSpan của chúng tôi, trong khi trình xử lý Dừng sẽ chỉ dừng DispatcherTimer.

void OnTimerTick(object sender, EventArgs e) 
{ 
    _time = _time.Add(new TimeSpan(0, 0, 0, 0, 10)); 
    display.Text = _time.ToString(); 
}  
private void OnStartClick(object sender, RoutedEventArgs e) 
{ 
    _time = new TimeSpan(0,0,0,0,0); 
    _timer.Start(); 
} 
private void OnStopClick(object sender, RoutedEventArgs e) 
{ 
    _timer.Stop(); 
} 
+0

Tôi đã thử sử dụng cùng một cách tiếp cận, tuy nhiên kết quả không chính xác. Có thể do chức năng trên không hoặc do phần cứng, thời gian trong ứng dụng chạy chậm hơn so với đồng hồ treo tường thực tế. Bạn có thể giúp đỡ và sửa lỗi này không? – letsc

6

Xem đồng hồ của tôi theo số here. Mã nguồn là here. Và hai bài viết về nó là herehere. Các mô hình hoạt hình Silverlight vay chính nó tốt cho một đồng hồ bấm giờ.

alt text http://xmldocs.net/ball2/background.png

<Storyboard x:Name="Run" RepeatBehavior="Forever"> 
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" 
    Storyboard.TargetName="SecondHand" x:Name="SecondAnimation" 
    Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)" RepeatBehavior="Forever"> 
    <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/> 
    <SplineDoubleKeyFrame KeyTime="00:01:00" Value="360"/> 
</DoubleAnimationUsingKeyFrames> 
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" 
    Storyboard.TargetName="MinuteHand" 
    Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)" RepeatBehavior="Forever"> 
    <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/> 
    <SplineDoubleKeyFrame KeyTime="01:00:00" Value="360"/> 
</DoubleAnimationUsingKeyFrames> 
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" 
    Storyboard.TargetName="HourHand" 
    Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)" RepeatBehavior="Forever"> 
    <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/> 
    <SplineDoubleKeyFrame KeyTime="12:00:00" Value="360"/> 

và mã để chạy kịch bản đó là ở đây:

private void RunWatch() 
{ 
    var time = DateTime.Now; 

    Run.Begin(); 

    Run.Seek(new TimeSpan(time.Hour, time.Minute, time.Second)); 
} 
+5

Rất buồn cười! Haha –

+0

Tôi không chắc chắn bao nhiêu điều này thêm vào câu hỏi, nhưng rất tốt đẹp! – Aardvark

4

Đây là một lớp Stopwatch thay thế mà bạn có thể thêm vào dự án của bạn.

+0

Cảm ơn bạn đã chia sẻ, triển khai tuyệt vời: D –

23

Đây là những gì tôi đã làm. Đơn giản và hoạt động rất tốt đối với tôi:

long before = DateTime.Now.Ticks; 
DoTheTaskThatNeedsMeasurement(); 
long after = DateTime.Now.Ticks; 

TimeSpan elapsedTime = new TimeSpan(after - before); 
MessageBox.Show(string.Format("Task took {0} milliseconds", 
    elapsedTime.TotalMilliseconds)); 

Tất cả những gì bạn cần làm là giữ một biến dài giữ tổng số lần đánh dấu trước khi bắt đầu nhiệm vụ mục tiêu.

+0

giải pháp đơn giản, tôi là người hâm mộ. – themaestro

+1

Sử dụng 'DateTime.UtcNow' trừ khi bạn thực sự quan tâm đến múi giờ, v.v. – Yaur

Các vấn đề liên quan