第五章:尺寸处理(4)

适合大小的时钟
Device类包含一个静态的StartTimer方法,可以让你设置一个触发周期性事件的定时器。 定时器事件的可用性意味着时钟应用程序是可能的,即使它仅以文本显示时间。
Device.StartTimer的第一个参数是以TimeSpan值表示的时间间隔。 定时器根据该间隔定期触发一个事件。 (你可以低至15或16毫秒,这大约是视频显示器上每秒60帧的帧速率的周期。)事件处理程序没有参数,但必须返回true才能使定时器继续运行。
FitToSizeClock程序创建一个标签来显示时间,然后设置两个事件:页面上的SizeChanged事件以更改字体大小,以及每秒一次的Device.StartTimer事件来更改Text属性。
现在许多C#程序员喜欢将小事件处理程序定义为匿名lambda函数。 这允许事件处理代码非常接近引发事件的对象的实例化和初始化,而不是文件中的其他位置。 它还允许在事件处理程序中引用对象而不将这些对象存储为字段。
在这个程序中,这两个事件处理程序都简单地更改了标签的属性,并且它们都被作为lambda函数使用,以便它们可以访问标签而不将其存储为字段:

public class FitToSizeClockPage : ContentPage
{
    public FitToSizeClockPage()
    {
        Label clockLabel = new Label
        {
            HorizontalOptions = LayoutOptions.Center, 
            VerticalOptions = LayoutOptions.Center
        };
        Content = clockLabel;
        // Handle the SizeChanged event for the page.
        SizeChanged += (object sender, EventArgs args) =>
        {
            // Scale the font size to the page width
            // (based on 11 characters in the displayed string).
            if (this.Width > 0)
                clockLabel.FontSize = this.Width / 6;
        };
        // Start the timer going.
        Device.StartTimer(TimeSpan.FromSeconds(1), () =>
        {
            // Set the Text property of the Label.
            clockLabel.Text = DateTime.Now.ToString("h:mm:ss tt");
            return true;
        });
    }
}

StartTimer处理程序为DateTime指定一个自定义格式字符串,其结果为10个或11个字符,但其中两个是大写字母,并且这些字符比平均字符宽。 SizeChanged处理程序隐式假定通过将字体大小设置为页面宽度的六分之一来显示12个字符:
第五章:尺寸处理(4)
当然,横向模式下的文字要大得多:
第五章:尺寸处理(4)
这个一秒计时器在每秒的开始时刻并不精确,因此显示的时间可能与同一设备上的其他时间显示不完全一致。 您可以通过设置更频繁的计时器记号使其更加准确。 性能不会受到太大的影响,因为显示屏每秒只能更改一次,并且在此之前不需要新的布局周期。

上一篇:管理 R 搜索路径 (like postgresql search_path?)


下一篇:第五章:尺寸处理(1)