首先道个歉,这两天家里断网,一直没办法更新。

 

 

 

8. 进度条

   progressBar,表示一个知识操作进度的控件。在xaml中只有一种表现形式:

     <ProgressBar  .../>

   progressBar有两种模式,重复模式和非重复模式。他是有属性IsIndeterminate来确定。这两种模式的特点:

  1. 重复模式

    IsIndeterminate为true时是重复模式。当无法确定其需要等待的时间或者无法计算等待的进度情况,比较适合使用。他就是有几个点儿重复徘徊选中;

  2. 非重复模式

     为false时是非重复模式,这个是需要根据值哎填充。当可以确定执行任务的时间或者跟踪完成任务的进度情况时,适合使用。他里边minimum和maximum属性来指定范围,默认是0到100.通过valuechanged监控数据的变化。通过value来设置。

    使用非重复模式的进度条时,通常需要使用System.ComponentModel.BackgroundWorker类来配合使用。Backgroundworker类允许在单独的专用线程上进行操作,耗时的操作在长时间运行可能导致用户界面的停顿或者是卡屏,这时候就可以使用哪个类方便的解决。如果要在后台执行耗时的操作,可以创建一个backgroundWorker,监听那些报告操作进度并操作完成时发出信号的事件。若要设置后台操作,可以为DoWork事件添加一个事件处理程序。在该程序中调用耗时的操作,虚构要启动,可以使用RunWorkerAsync.若要受到进行更新通知,可以对progressChanged和Ru你workerCompleted事件与用户界面进行通信。Backgroundworker事件不夸appdomain边界进行处理。不能使用它在多个appDomain中执行多线程操作。如果后台需要参数,可以调用RunWoorkerAsync时,给出参数,在Dowork时间处理程序内部,可以从DoworkEventArgs.Argument属性中提取参数。backgroundWorker常用的属性和方法如下:

属性

 

名称

说明

CancellationPending

获取一个值,指示应用程序是否已请求取消后台操作。

Container 

获取 IContainer,它包含 Component。(从 Component 继承。)

IsBusy

获取一个值,指示 BackgroundWorker 是否正在运行异步操作。

Site 

获取或设置 Component 的 ISite。(从 Component 继承。)

WorkerReportsProgress

获取或设置一个值,该值指示 BackgroundWorker 能否报告进度更新。

WorkerSupportsCancellation

获取或设置一个值,该值指示 BackgroundWorker 是否支持异步取消。

方法

名称

说明

Disposed 

添加事件处理程序以侦听组件上的 Disposed 事件。(从 Component 继承。)

DoWork

调用 RunWorkerAsync 时发生。

ProgressChanged

调用 ReportProgress 时发生。

RunWorkerCompleted

当后台操作已完成、被取消或引发异常时发生。

3. 示例代码

创建重复模式和非重复模式

  <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">

   <TextBlock Text="选择ProgressBar的类型:" />

     <RadioButton Content="Determinate类型" Height="71" Name="radioButton1" GroupName="Type" Margin="0,45,0,491" />

     <RadioButton Content="Indeterminate类型" Height="71" Name="radioButton2" GroupName="Type" IsChecked="True" Margin="0,122,0,414" />

     <Button Content="启动ProgressBar" Height="72" HorizontalAlignment="Left" Margin="3,247,0,0" Name="begin" VerticalAlignment="Top" Width="386" Click="begin_Click" />

     <Button Content="取消ProgressBar" Height="72" HorizontalAlignment="Left" Margin="6,338,0,0" Name="cancel" VerticalAlignment="Top" Width="383" Click="cancel_Click" />

     <ProgressBar Height="56" HorizontalAlignment="Left" Name="progressBar1" VerticalAlignment="Top" Width="462"

                         IsIndeterminate="true" Margin="0,443,0,0"   />

   </Grid>

 

.cs文件

 

using System.Windows;

using Microsoft.Phone.Controls;

using System.Threading;

using System.ComponentModel;

namespace ProgressBarDemo

{

    public partial class MainPage : PhoneApplicationPage

    {

        //定义一个后台处理类

        private BackgroundWorker backgroundWorker;

        public MainPage()

        {

            InitializeComponent();

            //第一次进入页面,设置进度条为不可见

            progressBar1.Visibility = System.Windows.Visibility.Collapsed; 

        }

        private void begin_Click(object sender, RoutedEventArgs e)

        {

            //设置进度条为可见

            progressBar1.Visibility = System.Windows.Visibility.Visible;

            

            if (radioButton1.IsChecked == true)

            {

                //设置进度条为不可重复模式

                progressBar1.IsIndeterminate = false;

                //创建一个后台处理类的对象

                backgroundWorker = new BackgroundWorker();

                //调用 RunWorkerAsync后台操作时引发此事件,即后台要处理的事情写在这个事件里面

                backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);

                //当后台操作完成事件

                backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);

                //当处理进度(ReportProgress)被激活后,进度的改变将触发ProgressChanged事件

                backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged);

                //设置为可报告进度情况的后台处理

                backgroundWorker.WorkerReportsProgress = true;

                backgroundWorker.RunWorkerAsync();

            }

            else

            {

                //设置进度条的值为0

                progressBar1.Value = 0;

                //设置进度条为重复模式

                progressBar1.IsIndeterminate = true;

            } 

        }

        private void cancel_Click(object sender, RoutedEventArgs e)

        {

            //隐藏进度条

            progressBar1.Visibility = System.Windows.Visibility.Collapsed;

        }

        //进度改变处理

        void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)

        {

            Dispatcher.BeginInvoke(() =>

            {

                //把进度改变的值赋值给progressBar1进度条的值

                progressBar1.Value = e.ProgressPercentage;

            }

         );

        }

        //后台操作完成

        void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

        {

            Dispatcher.BeginInvoke(() =>

            {

                //隐藏进度条

                progressBar1.Visibility = System.Windows.Visibility.Visible;

            }

            );

        }

        //后台操作处理

        void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)

        {

            for (int i = 0; i < 100; i++)

            {

                i += 20;

                //赋值当前进度的值,同时会触发进度改变事件

                backgroundWorker.ReportProgress(i);

                //为了能看到进度条的变化效果,这里用进程暂停了1秒

                Thread.Sleep(1000);

            }

        }

    }

}

9. 滚动区域

    Scrollviewer控件表示可包含其他可见元素的可滚动区域,程序界面中的内容通常比手机屏幕的课显示区域大,利用这个控件可以方便的适用程序中的内容具备滚动功能,在xaml语法如下:

     <Scrollviewer  .../>

     <Scrollviewer >内容</Scrollviewer>

     Scrollviewer封装一个内容元素和若干个scrollbar控件(最多两个),范围包括Scrollviewer的所有内容。可容的可见区域为视区。HorizontalscrollBarVisibility和verticalscrollbarvisibility属性分别控制垂直和水平的scrollbar控件出现的条件。如果他们设置为hidden,则可以在代码中使用ComputedHorizontalScrollBarVisibilityProperty和ComputedVerticalScrollBarVisibilityProperty,以便发现其在运行时的实际状态。Scrollviewer控件是针对于大内容控件的布局控件,例如textbox多行显示的时候。因为他里边就支持一个子控件,所以通常和Stackpanel,Canvas,grid相互配合使用。Scrollviewer常用的属性如下:

ComputedHorizontalScrollBarVisibility

获取一个值,该值指示水平 ScrollBar 是否可见。

ComputedVerticalScrollBarVisibility

获取一个值,该值表示垂直 ScrollBar 是否可见。

ExtentHeight

获取 ScrollViewer 中显示的所有内容的垂直大小。

ExtentWidth

获取 ScrollViewer 中显示的所有内容的水平大小。

HorizontalScrollBarVisibility

获取或设置一个值,该值指示是否应显示水平 ScrollBar

ScrollableHeight

获取一个表示可滚动区域的垂直大小的值,或一个表示范围高度和视区高度差别的值。

ScrollableWidth

获取一个表示可滚动区域的水平大小的值,或一个表示范围宽度和视区宽度差别的值。

VerticalAlignment

获取或设置在父对象(如面板或项控件)中构成 FrameworkElement 时应用于此元素的垂直对齐特征。(继承自 FrameworkElement。)

VerticalContentAlignment

获取或设置控件内容的垂直对齐方式。(继承自 Control。)

VerticalOffset

获取一个值,该值包含滚动内容的垂直偏移量。

VerticalScrollBarVisibility

获取或设置一个值,该值指示是否应显示垂直 ScrollBar

ViewportHeight

获取一个值,该值包含可见内容的垂直大小。

ViewportWidth

获取一个值,该值包含可见内容的水平大小。

Visibility

获取或设置 UIElement 的可见性。不可见的 UIElement 不呈现,也不将其所需大小告知布局。(继承自 UIElement。)

示例代码

创建一个scrollviewer控件来存放一张大图,然后可以在空间内可以来回上下左右拖动查看

<ScrollViewer HorizontalAlignment="Left" Height="220" Margin="86,270,0,0" VerticalAlignment="Top" Width="230">

  <StackPanel Height="100" Width="100" UseLayoutRounding="True">

       <Image Height="100" Source="/Assets/AlignmentGrid.png"/>

   </StackPanel>

</ScrollViewer>

创建多张图片,可以向上向下滚动的图片;

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">

<ScrollViewer Name="scrollViewer1"  VerticalScrollBarVisibility="Hidden" VerticalAlignment="Top" HorizontalAlignment="Left" Height="600" Width="332">

<StackPanel Name="stkpnlImage" Width="327" /></ScrollViewer>

<Button Content="往上" Height="111" HorizontalAlignment="Left" Margin="338,162,0,0" Name="btnUp" VerticalAlignment="Top" Width="112" FontSize="30"  Click="btnUp_Click" />

<Button Content="往下" FontSize="30" Height="116" HorizontalAlignment="Left" Margin="338,279,0,0" Name="btnDown" VerticalAlignment="Top" Width="112" Click="btnDown_Click"  />

<Button Content="停止" FontSize="30" Height="116" HorizontalAlignment="Left" Margin="338,419,0,0" Name="stop" VerticalAlignment="Top" Width="112" Click="stop_Click" />

</Grid>

using System;

using System.Windows;

using System.Windows.Controls;

using Microsoft.Phone.Controls;

using System.Windows.Threading;

using System.Windows.Media.Imaging;

namespace ScrollViewerDemo

{

    public partial class MainPage : PhoneApplicationPage

    {

        //往下滚动的定时触发器

        private DispatcherTimer tmrDown;

        //往上滚动的定时触发器

        private DispatcherTimer tmrUp;

        public MainPage()

        {

            InitializeComponent();

            //添加图片到ScrollViewer里面的StackPanel中

            for (int i = 0; i <= 30; i++)

            {

                Image imgItem = new Image();

                imgItem.Width = 200;

                imgItem.Height = 200;

                //4张图片循环添加到StackPanel的子节点上

                if (i % 4 == 0)

                {

                    imgItem.Source = (new BitmapImage(new Uri("a.jpg", UriKind.Relative)));

                }

                else if (i % 4 == 1)

                {

                    imgItem.Source = (new BitmapImage(new Uri("b.jpg", UriKind.Relative)));

                }

                else if (i % 4 == 2)

                {

                    imgItem.Source = (new BitmapImage(new Uri("c.jpg", UriKind.Relative)));

                }

                else 

                {

                    imgItem.Source = (new BitmapImage(new Uri("d.jpg", UriKind.Relative)));

                }

                this.stkpnlImage.Children.Add(imgItem);

            }

            //初始化tmrDown定时触发器

            tmrDown = new DispatcherTimer();

            //每500毫秒跑一次

            tmrDown.Interval = new TimeSpan(500);

            //加入每次tick的事件

            tmrDown.Tick += tmrDown_Tick;

            //初始化tmrUp定时触发器

            tmrUp = new DispatcherTimer();

            tmrUp.Interval = new TimeSpan(500);

            tmrUp.Tick += tmrUp_Tick;

        }

        void tmrUp_Tick(object sender, EventArgs e)

        {

            //将VerticalOffset -10 将出现图片将往上滚动的效果

            scrollViewer1.ScrollToVerticalOffset(scrollViewer1.VerticalOffset - 10);

        }

        void tmrDown_Tick(object sender, EventArgs e)

        {

            //先停止往上的定时触发器

             tmrUp.Stop();

            //將 VerticalOffset +10 将出现图片将往下滚动的效果

            scrollViewer1.ScrollToVerticalOffset(scrollViewer1.VerticalOffset + 10);

        }

        //往上按钮事件

        private void btnUp_Click(object sender, RoutedEventArgs e)

        {

            //先停止往下的定时触发器

             tmrDown.Stop();

            //tmrUp定时触发器开始

             tmrUp.Start();

        }

        //往下按钮事件

        private void btnDown_Click(object sender, RoutedEventArgs e)

        {

            //tmrDown定时触发器开始

            tmrDown.Start();

        }

        //停止按钮事件

        private void stop_Click(object sender, RoutedEventArgs e)

        {

            //停止定时触发器

            tmrUp.Stop();

            tmrDown.Stop();

        }

    }

}