C#?wpf實(shí)現(xiàn)控件刷新的示例代碼
前言
做wpf開(kāi)發(fā)不像mfc控件的刷新相對(duì)同步,wpf的控件改變寬高或者可見(jiàn)性后在下一行代碼不會(huì)立刻看到效果,而且也沒(méi)有一種事件可以獲取確切的界面刷新后的時(shí)機(jī)。如果只是進(jìn)行延遲等待,在不同機(jī)器效果是不同的,而且也并沒(méi)有具體標(biāo)識(shí)說(shuō)明已刷新界面,這就導(dǎo)致某些場(chǎng)景的功能實(shí)現(xiàn)起來(lái)會(huì)比較困難。本文提供一種獲取控件真正界面刷新時(shí)機(jī)的方法。
一、為何要獲取刷新時(shí)機(jī)
例子一、隱藏控件后截屏
需要隱藏控件后截屏,直接修改Visibility后截屏是不行的,控件不會(huì)立刻隱藏,所以會(huì)截到控件的畫面。如果不能獲取到真正的刷新時(shí)機(jī),那就這能延時(shí)等待,但延時(shí)是不穩(wěn)定的,至少筆者就遇到了延時(shí)500毫秒再截屏,依然在生產(chǎn)環(huán)境有客戶遇到了截到控件畫面的bug。
例子二、修改控件大小后做計(jì)算
有一段邏輯需要根據(jù)控件大小做計(jì)算,使用的是ActualWidth、ActualHeight。在這段邏輯前剛好有修改大小的代碼,但此時(shí)修改Width、Height之后ActualWidth、ActualHeight不會(huì)立刻改變,需要等到界面刷新時(shí)會(huì)改變,這就會(huì)導(dǎo)致計(jì)算數(shù)值不正確。這種場(chǎng)景很可能難以使用延時(shí)。
二、如何實(shí)現(xiàn)
1.使用動(dòng)畫
wpf的動(dòng)畫有個(gè)完成事件,我們通過(guò)這個(gè)事件就可以獲取繪制完一幀的時(shí)機(jī)。
//創(chuàng)建
var da = new DoubleAnimation(1, 0, new Duration(TimeSpan.FromMilliseconds(1)), FillBehavior.Stop);
da.Completed += (S, E) {
//動(dòng)畫完成,此處表明控件已刷新
};
//啟動(dòng)動(dòng)畫觸發(fā)繪制
elememt.BeginAnimation(Control.OpacityProperty, da);
2.使用TaskCompletionSource
使用TaskCompletionSource是為了提供異步接口,方便使用,在使用時(shí)只需要await即可。
var tcs = new TaskCompletionSource(); da.Completed += (S, E) => tcs.SetResult(); await tcs.Task;
三、完整代碼
public static class ElementExtensions
{
/// <summary>
/// 等待控件真實(shí)刷新后
/// </summary>
internal static Task WaitForPaint(this UIElement elememt)
{
var tcs = new TaskCompletionSource();
//通過(guò)動(dòng)畫來(lái)獲取這個(gè)時(shí)機(jī)
var da = new DoubleAnimation(1, 0, new Duration(TimeSpan.FromMilliseconds(1)), FillBehavior.Stop);
da.Completed += (S, E) => tcs.SetResult();
//啟動(dòng)動(dòng)畫觸發(fā)繪制
elememt.BeginAnimation(Control.OpacityProperty, da);
return tcs.Task;
}
}
四、使用示例
1、隱藏工具條截屏
private async void Button_Click(object sender, RoutedEventArgs e)
{
//隱藏工具條
toolBar.Visibility= Visibility.Collapsed;
//等待界面上真正隱藏
await toolBar.WaitForPaint();
//截屏
略
//顯示工具條
toolBar.Visibility= Visibility.Visible;
}
2、修改寬高后獲取ActualWidth、ActualHeight
private async void Button_Click(object sender, RoutedEventArgs e)
{
var button = sender as Button;
Console.WriteLine("ActualWidth=" + button.ActualWidth + " ActualHeight=" + button.ActualHeight);
button.Width = 100;
button.Height = 100;
Console.WriteLine("ActualWidth=" + button.ActualWidth + " ActualHeight=" + button.ActualHeight);
await button.WaitForPaint();
Console.WriteLine("ActualWidth=" + button.ActualWidth + " ActualHeight=" + button.ActualHeight);
}
效果預(yù)覽

到此這篇關(guān)于C# wpf實(shí)現(xiàn)控件刷新的示例代碼的文章就介紹到這了,更多相關(guān)C# wpf控件刷新內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)異步連接Sql Server數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了C#實(shí)現(xiàn)異步連接Sql Server數(shù)據(jù)庫(kù)的方法,涉及C#中await方法的相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04
C# 屏蔽關(guān)鍵字的實(shí)現(xiàn)方法
前段時(shí)間在公司做了一個(gè)論壇屏蔽關(guān)鍵字的功能,我做的比較簡(jiǎn)單、實(shí)用~ 現(xiàn)在拿出來(lái)給博友們分享下..也希望大家能頂頂我~2013-05-05
深入解析C#中的交錯(cuò)數(shù)組與隱式類型的數(shù)組
這篇文章主要介紹了深入解析C#中的交錯(cuò)數(shù)組與隱式類型的數(shù)組,隱式類型的數(shù)組通常與匿名類型以及對(duì)象初始值設(shè)定項(xiàng)和集合初始值設(shè)定項(xiàng)一起使用,需要的朋友可以參考下2016-01-01

