WEB开发网
开发学院图形图像Flash Silverlight 2 转换和剪辑区域 阅读

Silverlight 2 转换和剪辑区域

 2009-02-09 11:52:17 来源:WEB开发网   
核心提示: 图 11 中显示了部分 XAML 源代码(代码下载中包含完整的代码),Page 构建程序调用 WebClient.OpenReadAsync 来启动新闻源的异步请求,Silverlight 2 转换和剪辑区域(10),而完成事件处理程序会将标题从源复制到 TextBlock,然后,包括《P

图 11 中显示了部分 XAML 源代码(代码下载中包含完整的代码)。Page 构建程序调用 WebClient.OpenReadAsync 来启动新闻源的异步请求,而完成事件处理程序会将标题从源复制到 TextBlock。然后,它将调用 Storyboard.Begin 开始滚动 TextBlock,并通过编程使 DispatcherTimer 每五分钟触发一次 Tick 事件。Tick 事件处理程序提交新闻源的最新请求,它最终会存储在某个私有字段中。

Silverlight 2 转换和剪辑区域图 11 Page.xaml.cs

using System;
namespace VideoOverlay
{
  public partial class Page : UserControl
  {
    private const double _offset = 20.0;
    private const double _secondsPerFrame = 10.0;
    private const string _separator = "  ?  ";
    private readonly Uri _uri =
      new Uri("http://feeds.feedburner.com/AbcNews_TopStories");
    private DispatcherTimer _timer = new DispatcherTimer();
    private string _text = null;
    public Page()
    {
      InitializeComponent();
      // Launch an async request for current news headlines
      WebClient wc = new WebClient();
      wc.OpenReadCompleted += new
        OpenReadCompletedEventHandler(OnInitialDownloadCompleted);
      wc.OpenReadAsync(_uri);
    }
    private void OnInitialDownloadCompleted(object sender,
      OpenReadCompletedEventArgs e)
    {
      if (e.Error == null)
      {
        // Convert the news content into a string
        Headlines.Text = GetHeadlinesFromSyndicationStream(e.Result);
        // Begin scrolling headlines
        StartTicker();
        // Start the refresh timer
        _timer.Tick += new EventHandler(OnTimerTick);
        _timer.Interval = new TimeSpan(0, 5, 0); // 5 minutes
        _timer.Start();
      }
    }
    private void OnTimerTick(object sender, EventArgs e)
    {
      // Launch an async request for current news headlines
      WebClient wc = new WebClient();
      wc.OpenReadCompleted += new
        OpenReadCompletedEventHandler(OnRefreshDownloadCompleted);
      wc.OpenReadAsync(_uri);
    }
    private void OnRefreshDownloadCompleted(object sender,
      OpenReadCompletedEventArgs e)
    {
      if (e.Error == null)
      {
        // Convert the news content into a string and store it away
        _text = GetHeadlinesFromSyndicationStream(e.Result);
      }
    }
...
  }
}

每次滚动标题的动画结束时,Storyboard.Completed 事件处理程序都会检查该字段是否有了新的新闻源,如果有,则更新 TextBlock 的内容。然后它将再次启动动画运行。因此,标题会在屏幕上滚动播放,而标题会每五分钟刷新一次。很明显,线程同步逻辑或封送调用不需要返回应用程序的 UI 线程,这是因为 DispatcherTimer.Tick 事件处理程序和 Storyboard.Completed 事件处理程序都是在 UI 线程中执行的。

此方法的弊端是获取和刷新新闻源会导致额外的网络流量。但该流量与视频流自身相比显得微不足道,而且修改现场视频流不需要服务器端添加任何昂贵的硬件或软件。此外,客户端呈现的新闻源可以加入额外的 UX 增强效果,例如鼠标悬停时显示与某个标题有关的附加信息或将标题链接到新闻源的超链接。当提供给用户的内容是 XAML DOM 的一部分而不仅仅是一段视频流时,将可以产生无限多的可能性。

转换和剪辑区域是 XAML 为您提供的众多强大功能中的两种。没有它们,Silverlight 的图形子系统就会缺少很多独特的内容。这些天我收到很多询问有关如何实现一些特殊效果(诸如旋转轮播、Rolodex 样式的分页以及交互图表等)的问题。期待在今后的“超酷代码”中出现更加令人振奋的 Silverlight 图形佳作。

请将您想向 Jeff 询问的问题和提出的意见发送至 wicked@microsoft.com。

Jeff Prosise 是《MSDN 杂志》的特邀编辑,他著有多部书籍,包括《Programming Microsoft .NET》。他还是 Wintellect (www.wintellect.com) 公司的创始人,该公司专门针对 Microsoft .NET 提供软件咨询和培训服务。

上一页  5 6 7 8 9 10 

Tags:Silverlight 转换 剪辑

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接