首先道个歉,这两天家里断网,一直没办法更新。
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常用的属性和方法如下:
属性
| 名称 | 说明 |
获取一个值,指示应用程序是否已请求取消后台操作。 | ||
获取 IContainer,它包含 Component。(从 Component 继承。) | ||
获取一个值,指示 BackgroundWorker 是否正在运行异步操作。 | ||
获取或设置一个值,该值指示 BackgroundWorker 能否报告进度更新。 | ||
获取或设置一个值,该值指示 BackgroundWorker 是否支持异步取消。 |
方法
名称 | 说明 | |
调用 RunWorkerAsync 时发生。 | ||
调用 ReportProgress 时发生。 | ||
当后台操作已完成、被取消或引发异常时发生。 |
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常用的属性如下:
获取一个值,该值指示水平 ScrollBar 是否可见。 | ||
获取一个值,该值表示垂直 ScrollBar 是否可见。 | ||
获取 ScrollViewer 中显示的所有内容的垂直大小。 | ||
获取 ScrollViewer 中显示的所有内容的水平大小。 | ||
获取或设置一个值,该值指示是否应显示水平 ScrollBar。 | ||
获取一个表示可滚动区域的垂直大小的值,或一个表示范围高度和视区高度差别的值。 | ||
获取一个表示可滚动区域的水平大小的值,或一个表示范围宽度和视区宽度差别的值。 | ||
获取或设置在父对象(如面板或项控件)中构成 FrameworkElement 时应用于此元素的垂直对齐特征。(继承自 FrameworkElement。) | ||
获取或设置控件内容的垂直对齐方式。(继承自 Control。) | ||
获取一个值,该值包含滚动内容的垂直偏移量。 | ||
获取或设置一个值,该值指示是否应显示垂直 ScrollBar。 | ||
获取一个值,该值包含可见内容的垂直大小。 | ||
获取一个值,该值包含可见内容的水平大小。 | ||
获取或设置 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();
}
}
}
转载于:https://blog.51cto.com/15810006769/1168215