wpf 进度条的添加

xzjxylophone 2010-07-25 04:10:54
当我在加载数据的时候,
我该如何控制进度条


private void RefreshWindow(StorageLocation enumOP)
{
//这个函数是执行复杂的串口通讯 得到的一个list 结果, 如何在这里 添加一个进度条啊?
this.list = this.currentSC.GetAllInformation();
// 绑定数据到 datagrid 中
this.Select(enumOP, string.Empty);

}



...全文
1109 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
kanpass0 2012-01-04
  • 打赏
  • 举报
回复
楼主~~~!!!能否提供个实例下载
cjnkd 2011-11-30
  • 打赏
  • 举报
回复
学习了。
gowow 2011-05-06
  • 打赏
  • 举报
回复
我也遇到这个问题
xzjxylophone 2010-08-02
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 sunpire 的回复:]

恭喜LZ解决问题。
不过照我的理解,使用了绑定时,应是不用去订阅 sc.PropertyChanged 事件的,
即 pb_Main.Value 直接绑定 sc.Finished 属性
<ProgressBar Value="{Binding Finished}" /> 。

绑定自己实现了跨线程调用的问题。
[/Quote]

恩 你说的对,
现在项目紧张,还没有时间去好好的学习。。。。
Sunpire 2010-08-02
  • 打赏
  • 举报
回复
恭喜LZ解决问题。
不过照我的理解,使用了绑定时,应是不用去订阅 sc.PropertyChanged 事件的,
即 pb_Main.Value 直接绑定 sc.Finished 属性
<ProgressBar Value="{Binding Finished}" /> 。

绑定自己实现了跨线程调用的问题。
xzjxylophone 2010-08-01
  • 打赏
  • 举报
回复
解决这个问题: 需要注意以下2点内容:
1. INotifyPropertyChanged 接口, WPF一个比较重要的接口, 数据绑定和数据更新都需要这个接口
2. Dispatcher.Invoke 的使用, 更新UI界面

问题描述:
主界面 win1
需要打开的界面 win2
有进度条的界面 winProcessbar
效果:
win1中点击一个按钮弹开win2界面,但是因为win2需要从数据库中加载数据,所以是先弹出winProcessbar界面,显示进度,现在是如何让进度动起来

现在按这种方式去实现 之:
业务类:


public class SCAssociate : INotifyPropertyChanged
{
private double finished;
public double Finished
{
get
{
return this.finished;
}
private set
{
this.finished = value;
NotifyPropertyChanged("Finished");

}
}
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}

public List<ATCAssociate> GetAllInformation()
{
for(int i = 0; i < 50; i++)
{
this.Finished++;
this.Dosomething(i);
}
......
}


win2 中:

///获取数据的
public void XXXX()
{
//this.currentSC是上面业务类的实例
W_PBar win = new W_PBar("正在加载联系人数据请稍候......", this.currentSC);
win.Show();
try
{
this.list = win.GetAssociateList();

}
catch
{
win.Close();
}
}

winProcessbar 类中:

public List<ATCAssociate> GetAssociateList()
{
if (this.currentSCBase is SCAssociate)
{

sc.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(sc_PropertyChanged);
return sc.GetAllInformation();
}
return null;
}

double value = 50;
void sc_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
///每当 finished +1的时候,就自动更新了UI了, 当然这里是简单的例子,具体的需要重新编写代码
///更新ui 需要用 Dispatcher.Invoke
pb_Main.Dispatcher.Invoke(new Action<DependencyProperty, object>(pb_Main.SetValue), DispatcherPriority.Background, ProgressBar.ValueProperty, value);
value++;
}



在此特地感谢sunpire 大神 帮我解决了很多问题。

BTW, 也许我的方法不是很好, 但是现在工作紧张不能进行进一步的修改, 如果做的很烂, 希望大家不要喷我,我毕竟是一个菜鸟............



xzjxylophone 2010-08-01
  • 打赏
  • 举报
回复
终于解决问题了 哈哈

我高兴的都快要哭了。。(还是个小菜鸟啊。。。。。。)

等下 把我的思路 和相关代码给发出来。
pkjijie 2010-07-28
  • 打赏
  • 举报
回复

sunpire 大神~~~~
Sunpire 2010-07-27
  • 打赏
  • 举报
回复
不知道我这样描述LZ你能否看得懂。 实际上LZ的业务类是用不着去考虑什么 Win1、Win2、Win3 的,用术语说就是业务不依赖于UI, 你只管在业务类中使用线程去执行你读取串口数据的业务,该写Finished的时候就写Finished(或者是第一种方法触发事件)。

至于前台界面,也用不着管它有没有进度条,只管绑定业务类(或订阅业务类的事件),调用业务类的方法,显示进度那是前台自己要负责的事(使用数据绑定时WPF自己帮我们负责了)。 你只有秉着这样的思路编程,才能理清后台和前台的关系,否则你都是把前台后台混在一起,很难有进步。

在线程这里,最好是写在业务类中,如果业务类中不用线程,那么就是在界面让业务类实例执行方法时要用线程。 不过我没有测试使用数据绑定的方式时,是否可以不使用线程,但是使用线程又用不了多少代码,还是用一下咯。

进度条的IsIndeterminate 我没有测试,实际上我都没有怎么用过ProgressBar,昨天是第一次用,你可以先看看 IsIndeterminate 在一个窗口中是怎么个表现方式。
xzjxylophone 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 sunpire 的回复:]

我把LZ的其他两个帖子也回了,就等着接分了。

其实也是我的问题,一开始就没有把2楼的代码贴在1楼。

不过经过这样子也有一些收获,使用数据绑定始终还是符合 WPF 和 Silverlight 的 MVP/MVVM 思想,连跨线程访问的麻烦都省去了,不然使用事件还要去写 Dispatcher.BeginInvoke()。

另外关于 ShowDialog() 我也没有判断对,误导了楼……
[/Quote]



怎么没有第三个 窗口了啊?

打开第二个窗口的时候,需要加载数据,
第三个窗口是等待窗口, 不能 把 第二个和第三个窗口合并在一起的, 这个不是我想要的效果。。


我按照你的方法依然不能正确的显示出结果。。


void currentSC_Advanced(object sender, EventArgs e)
{
//win 是第三个窗口的实例
win.Dispatcher.BeginInvoke((System.Threading.ThreadStart)delegate()
{
win.pb_Main.Value = this.currentSC.Finished;
});
//win.pb_Main.Value = this.currentSC.Finished;
}
xzjxylophone 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 sunpire 的回复:]


Window2 是第二个窗口,这里只使用了 Loaded 事件,
并且按照LZ的例子,……
[/Quote]

sunpire 大神... 我该如何去实现以下的功能?
昨天那几行还是不会转换,因为我的业务比较麻烦的, 我已经换了一种思路了, 是这个样子的:
win1 打开win2, 打开win2,
在加载数据的这段期间内,

步骤
1.开始运行加载数据函数
2.打开win3窗口(里面有一个进度条)
3. 让win3窗口的进度条,自动的来回滚动(设置 IsIndeterminate 为true)(但实际上进度条不来回滚动.....)
4. 数据加载完的时候,时候关闭win3窗口

这个过程我该如何去实现啊. 是用多线程去编程吗? 还是其他的。
xzjxylophone 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 qqq2671568 的回复:]

这个东西要自己揣摩。
别人只能给你建议
[/Quote]

书到用时方恨少啊....

现在根本没有时间去 揣摩了, 工作 需要的...
qqq2671568 2010-07-27
  • 打赏
  • 举报
回复
这个东西要自己揣摩。
别人只能给你建议
xzjxylophone 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 sunpire 的回复:]

我昏,LZ也没睡啊,我扛不住,睡去了。呼呼呼

“这段代码该 如何去变化, 我的业务是有返回值的, 返回的是一个List”
你不是说你的业务类是从串口中得到数据的嘛,你就定一个规则嘛,比如接收了10条记录为1个进度(或者是一批记录为1个进度),你是设计者,该如何变化还不是由你说了算,具体业务也只有你才清楚嘛
[/Quote]

好吧, 你赢了。。。

接着去实现去....

我也困的不行了。。。。。

淡定。。。。。。。
Sunpire 2010-07-27
  • 打赏
  • 举报
回复
我昏,LZ也没睡啊,我扛不住,睡去了。呼呼呼

“这段代码该 如何去变化, 我的业务是有返回值的, 返回的是一个List”
你不是说你的业务类是从串口中得到数据的嘛,你就定一个规则嘛,比如接收了10条记录为1个进度(或者是一批记录为1个进度),你是设计者,该如何变化还不是由你说了算,具体业务也只有你才清楚嘛
Sunpire 2010-07-27
  • 打赏
  • 举报
回复
三个窗口的:
MainWindow

private void button1_Click(object sender, RoutedEventArgs e)
{
Window2 win = new Window2();
win.ShowDialog();
}


Window2 是第二个窗口,这里只使用了 Loaded 事件,
并且按照LZ的例子,把业务类实例放在了 Window2

public partial class Window2 : Window
{
public Window2()
{
InitializeComponent();
}
// 实例化业务类
SC currentSC = new SC();
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Window1 win = new Window1();
win.DataContext = currentSC;
currentSC.DoSomething();
win.ShowDialog();
}
}


Window1(显示进度条),这样Window1就纯粹只剩下界面了,代码中为空

<Grid>
<ProgressBar Value="{Binding Finished}" Height="24" HorizontalAlignment="Left" Margin="12,12,0,0" Name="pb" VerticalAlignment="Top" Width="144" />
<TextBlock Text="{Binding Finished}" Height="23" HorizontalAlignment="Left" Margin="12,51,0,0" Name="txtProgress" VerticalAlignment="Top" />
</Grid>

Window1 的 cs 代码

public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
}


业务类,和11楼相同

using System.ComponentModel;

public class SC : INotifyPropertyChanged
{
private double finished;
public double Finished
{
get { return finished; }
set
{
finished = value;
NotifyPropertyChanged("Finished");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}

public void DoSomething()
{
System.Threading.Thread th = new System.Threading.Thread(() => {
while (this.Finished < 100)
{
Finished++;
// 模拟业务,停止1秒
System.Threading.Thread.Sleep(1000);
}

});
th.Start();

}
}



这样满足要求了没?
xzjxylophone 2010-07-27
  • 打赏
  • 举报
回复
ublic void DoSomething()
{
System.Threading.Thread th = new System.Threading.Thread(() => {
while (this.Finished < 100)
{
Finished++;
// 模拟业务,停止1秒
System.Threading.Thread.Sleep(1000);
}

});
th.Start();



这段代码该 如何去变化, 我的业务是有返回值的, 返回的是一个List
xzjxylophone 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 sunpire 的回复:]

LZ先把两个窗口的搞明白嘛,我10楼和11楼的代码都是可以运行的,推荐使用11楼的代码。

三个窗口和两个窗口应没有什么区别的。
[/Quote]

好的, 我再来试一试啊。。。
Sunpire 2010-07-27
  • 打赏
  • 举报
回复
LZ先把两个窗口的搞明白嘛,我10楼和11楼的代码都是可以运行的,推荐使用11楼的代码。

三个窗口和两个窗口应没有什么区别的。
Sunpire 2010-07-26
  • 打赏
  • 举报
回复
还有一种应也可以,不使用事件,而是让 currentSC 实现 INotifyPropertyChanged 接口,

public class SC:INotifyPropertyChanged {
private double finished;
public double Finished{
get { return finished; }
set
{
finished=value;
NotifyPropertyChanged("Finished");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}


在界面上, 进度条.Value 直接和 this.currentSC.Finished 绑定, OneWay 绑定即可

<ProgressBar Name="pb" Value={Binding Finished ,Mode=OneWay} />



this.pb.DataContext = this.currentSC;
加载更多回复(11)
在Windows系统中,notepad.exe(记事本)是一个“经典的”、“简洁的”文本编辑器。这个软件,没有华丽的外观,也没有繁杂的功能,仅仅是一个文本编辑小软件。虽然经过Windows系统数十年的变换,但它却保持着永恒姿态,数十年来几乎不曾改变过。曾经,VS中的经典DEMO中,就有它的身影,一个新建的项目,就藏有一个新建的“记事本”。然而,在WPF的项目中,“记事本”却消失的无影无踪,也许是很容易实现,也许是为了革新,而不愿再传承“经典”。确实,使用WPF技术再次让“记事本”复活,确实也是一件非常容易的事情。但是,如果,使用WPF技术,再搭配当下非常流行的MVVM模式呢?复活“记事本”的难度却陡然上升至很多WPF程序员为之默默叹气。而,MVVM模式是掌握WPF的最顶级技术,MVVM模式拥有的无尽的优势,让WPF相对于过往的编程模式来说,是一种革命性的创新,从而也成为大中型WPF项目中必须的模式。但,学习难度。。。。。。在这个《WPF记事本开发详解》的课程中,赵老师带领你在WPF中,从零开始一步步构建MVVM模式,直到让你亲自以WPF+MVVM的方式,让这个经典的“记事本”软件从你的手中“复活”。在课程中,赵老师会详细讲解WPF和MVVM中的各种技巧,让你从此爱上WPF+MVVM编程。

8,736

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧