在Wpf中界面显示数据的修改,都是通过UI线程完成,如果尝试从其他线程中直接修改控件的值回抛出异常,“调用线程无法访问此对象,因为另一个线程拥有该对象”。

例如:http://www.cnblogs.com/tianma3798/p/5762016.html

解决方案1:通过Invoke或者BeginInvoke将操作发送给Dispatcher 对象,委托Dispatcher去执行UI操作,每个UI控件都有Dispatcher 对象

代码实例:

Xaml代码

<ProgressBar x:Name="progressOne"
Minimum="0" Maximum="1"
Height="30" Margin="10,85,10,0"
VerticalAlignment="Top"/>
<!--绑定 进度条的值,并格式化为百分数-->
<Label x:Name="label" Content="{Binding ElementName=progressOne,Path=Value}"
ContentStringFormat="{}{0:P2}"
HorizontalAlignment="Left"
Margin="110,120,0,0"
FontWeight="Bold" Foreground="Red"
VerticalAlignment="Top"/>

C#代码

//启动前程修改UI数据
Task.Run(() =>
{
int i = ;
while (true)
{
i++;
if (i == )
i = ;
//定义修改UI委托
Action<int> action1 = (q) =>
{
progressOne.Value = q/100.0;
};
progressOne.Dispatcher.BeginInvoke(action1, i);
Thread.Sleep();
}
});

显示:

解决方案2:使用Wpf的双向绑定,在自定义线程中修改源数据,自动通知到UI线程修改界面显示

这种方式有个好处,只关心数据的修改,界面多出使用该数据的界面自动修改

更多双向绑定:http://www.cnblogs.com/tianma3798/p/5765464.html

代码实例:

Xaml代码

<Grid>
<Slider x:Name="slider"
Height="30"
Value="{Binding Path=Result,Mode=TwoWay}" Minimum="0" Maximum="100"
Margin="35,120,25,0" VerticalAlignment="Top"/>
<Label x:Name="label" Content="{Binding Path=Result,Mode=TwoWay}"
ContentStringFormat="当前值:{0}"
HorizontalAlignment="Left"
FontWeight="Bold" Foreground="Red"
Margin="95,165,0,0"
VerticalAlignment="Top"/>
</Grid>

C#代码

//双向绑定数据
NumberData data = new NumberData();
slider.DataContext = data;
label.DataContext = data;
//启动线程修改绑定数据,界面内容会同步修改
Task.Run(() =>
{
int i = ;
while (true)
{
i++;
if (i == ) i = ;
//修改双向绑定属性
data.Result = i;
Thread.Sleep();
}
});
/// <summary>
/// 实现INotifyPropertyChanged接口,通知
/// </summary>
public class NumberData : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged; private int _Result;
public int Result
{
get { return _Result; }
set
{
_Result = value;
if (this.PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Result"));
}
}
}

更多异步修改UI:http://www.cnblogs.com/tianma3798/p/5766691.html

C# 自定义线程修改UI(一)的更多相关文章

  1. C#-WinForm跨线程修改UI界面

    待解决的问题 在我做WinForm开发的过程中,经常会遇到耗时操作或阻塞操作.他们会引发软件的卡顿甚至假死,严重影响软件的使用. 因此,这类耗时或阻塞的操作一般都会使用异步的方式去执行,不影响主线程( ...

  2. 小知识 安卓线程和ui

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  3. 线程操纵UI问题

    WPF只允许UI线程修改UI,其他线程必须通过Invoke.委托(安全性)Winform可以开启/关闭“只允许UI线程修改UI” 在WPF中非UI线程修改UI的方法 非UI线程直接修改UI,会报错 S ...

  4. 03_主线程联网问题&ANR&子线程不能修改UI

    如果不使用HAXM,恐怕网页源码查看器无法获取servlet的源码.初步猜测是安卓模拟器运行速度太慢了.如果CPU不支持VT-x的话,HAXM是安装不上的.所以可以先开启VT-x. 可以参考几篇文章h ...

  5. Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池

    前言:由于最近在做SDK的功能,需要设计线程池.看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到 ...

  6. 恶补Java Swing线程刷新UI机制(由浅到深的参考大佬博文)

    1. java中进度条不能更新问题的研究 感谢大佬:https://blog.csdn.net/smartcat86/article/details/2226681 为什么进度条在事件处理过程中不更新 ...

  7. 学习通过Thread+Handler实现非UI线程更新UI组件

    [Android线程机制] 出于性能考虑,Android的UI操作并不是线程安全的,这就意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的规则 ...

  8. Asp.net Core WebApi 使用Swagger做帮助文档,并且自定义Swagger的UI

    WebApi写好之后,在线帮助文档以及能够在线调试的工具是专业化的表现,而Swagger毫无疑问是做Docs的最佳工具,自动生成每个Controller的接口说明,自动将参数解析成json,并且能够在 ...

  9. Android子线程更新UI的方法总结

    版权声明:本文为博主原创文章,转载请注明出处:https://i.cnblogs.com/EditPosts.aspx?postid=6121280 消息机制,对于Android开发者来说,应该是非常 ...

随机推荐

  1. Yosemite重置Dock的命令

    备忘 defaults write com.apple.dock ResetLaunchPad -bool true killall Dock

  2. 转:几十种编程语言的快速入门教程- learnxinyminutes.com

    原文来自于:http://top.jobbole.com/15551/ 这家网站的名称是 Learn X in Y minutes,包括了几十种编程语言的快速学习入门教程.打开几种编程语言来看了一下, ...

  3. 一个用得比较广的微信API的XXE外部实体注入漏洞

    文件地址: https://github.com/dodgepudding/wechat-php-sdk/raw/master/wechat.class.php 代码: <?php /** * ...

  4. 专家解读Linux操作系统内核中的GCC特性

    专家解读Linux操作系统内核中的GCC特性   Linux内核使用GNU Compiler Collection (GCC)套件的几个特殊功能.这些功能包括提供快捷方式和简化以及向编译器提供优化提示 ...

  5. JSP session 获取id和session持续时间

    <%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8"%> < ...

  6. shell命令记录一些

    ps aux | sort -k 5n|tail -5 找到内存最对的进程 ps  aux 是找出全部的进程 sort -k 5n 表示第5个参数进行排序 tail -5 表示最后5个 ps -e - ...

  7. WPAD 的原理及实现

    WPAD 通过让浏览器自动发现代理服务器,使代理服务器对用户来说是透明的,进而轻松访问互联网.WPAD 可以借助 DNS 服务器或 DHCP 服务器来查询代理自动配置(PAC)文件的位置. 引言 代理 ...

  8. Jump

    hdu4862:http://acm.hdu.edu.cn/showproblem.php?pid=4862 题意:给你n*m的方格,每个方格中有一个数(0---9),然后你每次可以选择一个点开始,这 ...

  9. Hibernate如何一个类映射两个表

    一个User类有username,password属性,还有 otherInformation等其他属性,username和password映射到一个表,otherInformation等其他属性映射 ...

  10. linux安装 Android Studio详细教程,支持性较差,需要安装最新底层库内核的linux

    安装 Android Studio详细教程 libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5 lib32z1 jdk1.8.0_25 android-st ...