最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#?wpf實現(xiàn)控件刷新的示例代碼

 更新時間:2024年01月17日 08:50:59   作者:CodeOfCC  
這篇文章主要為大家詳細介紹了C#?wpf實現(xiàn)控件刷新的相關(guān)知識,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下

前言

做wpf開發(fā)不像mfc控件的刷新相對同步,wpf的控件改變寬高或者可見性后在下一行代碼不會立刻看到效果,而且也沒有一種事件可以獲取確切的界面刷新后的時機。如果只是進行延遲等待,在不同機器效果是不同的,而且也并沒有具體標識說明已刷新界面,這就導(dǎo)致某些場景的功能實現(xiàn)起來會比較困難。本文提供一種獲取控件真正界面刷新時機的方法。

一、為何要獲取刷新時機

例子一、隱藏控件后截屏

需要隱藏控件后截屏,直接修改Visibility后截屏是不行的,控件不會立刻隱藏,所以會截到控件的畫面。如果不能獲取到真正的刷新時機,那就這能延時等待,但延時是不穩(wěn)定的,至少筆者就遇到了延時500毫秒再截屏,依然在生產(chǎn)環(huán)境有客戶遇到了截到控件畫面的bug。

例子二、修改控件大小后做計算

有一段邏輯需要根據(jù)控件大小做計算,使用的是ActualWidth、ActualHeight。在這段邏輯前剛好有修改大小的代碼,但此時修改Width、Height之后ActualWidth、ActualHeight不會立刻改變,需要等到界面刷新時會改變,這就會導(dǎo)致計算數(shù)值不正確。這種場景很可能難以使用延時。

二、如何實現(xiàn)

1.使用動畫

wpf的動畫有個完成事件,我們通過這個事件就可以獲取繪制完一幀的時機。

//創(chuàng)建
var da = new DoubleAnimation(1, 0, new Duration(TimeSpan.FromMilliseconds(1)), FillBehavior.Stop);
da.Completed += (S, E) {
//動畫完成,此處表明控件已刷新
};
//啟動動畫觸發(fā)繪制
elememt.BeginAnimation(Control.OpacityProperty, da);

2.使用TaskCompletionSource

使用TaskCompletionSource是為了提供異步接口,方便使用,在使用時只需要await即可。

 var tcs = new TaskCompletionSource();
 da.Completed += (S, E) => tcs.SetResult();
 await tcs.Task;

三、完整代碼

public static class ElementExtensions
{
    /// <summary>
    /// 等待控件真實刷新后
    /// </summary>
    internal static Task WaitForPaint(this UIElement elememt)
    {
        var tcs = new TaskCompletionSource();
        //通過動畫來獲取這個時機
        var da = new DoubleAnimation(1, 0, new Duration(TimeSpan.FromMilliseconds(1)), FillBehavior.Stop);
        da.Completed += (S, E) => tcs.SetResult();
        //啟動動畫觸發(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實現(xiàn)控件刷新的示例代碼的文章就介紹到這了,更多相關(guān)C# wpf控件刷新內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#使用Datatable導(dǎo)入sqlserver數(shù)據(jù)庫的三種方法

    C#使用Datatable導(dǎo)入sqlserver數(shù)據(jù)庫的三種方法

    本文主要介紹了C#使用Datatable導(dǎo)入sqlserver數(shù)據(jù)庫的三種方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • C#使用CefSharp自定義緩存實現(xiàn)

    C#使用CefSharp自定義緩存實現(xiàn)

    本文介紹了如何使用C#和CefSharp自定義緩存實現(xiàn)減少Web應(yīng)用程序的網(wǎng)絡(luò)請求,提高應(yīng)用程序性能。首先,本文講解了CefSharp的基本知識和使用方法。然后,詳細闡述了在CefSharp中實現(xiàn)自定義緩存的步驟和技巧。最后,通過實例演示了如何使用自定義緩存功能獲取并展示網(wǎng)頁數(shù)據(jù)
    2023-04-04
  • C#使用BitConverter與BitArray類進行預(yù)定義基礎(chǔ)類型轉(zhuǎn)換

    C#使用BitConverter與BitArray類進行預(yù)定義基礎(chǔ)類型轉(zhuǎn)換

    這篇文章介紹了C#使用BitConverter與BitArray類進行預(yù)定義基礎(chǔ)類型轉(zhuǎn)換的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • Unity shader實現(xiàn)自由放大縮小效果

    Unity shader實現(xiàn)自由放大縮小效果

    這篇文章主要為大家詳細介紹了Unity shader實現(xiàn)自由放大縮小效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • c#網(wǎng)絡(luò)喚醒功能實現(xiàn)

    c#網(wǎng)絡(luò)喚醒功能實現(xiàn)

    網(wǎng)絡(luò)喚醒實現(xiàn)了對網(wǎng)絡(luò)的集中管理,即在任何時刻,網(wǎng)管中心的IT管理人員可以經(jīng)由網(wǎng)絡(luò)遠程喚醒一臺處于休眠或關(guān)機狀態(tài)的計算機,下面使用c#實現(xiàn)網(wǎng)絡(luò)喚醒功能
    2014-01-01
  • C# foreach獲取循環(huán)索引的四種方法

    C# foreach獲取循環(huán)索引的四種方法

    在C#中使用foreach循環(huán)的時候我們有時會碰到需要索引的情況,在for循環(huán)中我們可以得到循環(huán)索引 , foreach并不直接提供 , 下面介紹4種foreach獲取索引的方法,希望對大家有用處,需要的朋友可以參考下
    2025-03-03
  • C#在WinForm中使用WebKit傳遞js對象實現(xiàn)與網(wǎng)頁交互的方法

    C#在WinForm中使用WebKit傳遞js對象實現(xiàn)與網(wǎng)頁交互的方法

    這篇文章主要介紹了C#在WinForm中使用WebKit傳遞js對象實現(xiàn)與網(wǎng)頁交互的方法,涉及針對WebBroswer控件及WebKit控件的相關(guān)使用技巧,需要的朋友可以參考下
    2016-03-03
  • C#封裝的Sqlite訪問類實例

    C#封裝的Sqlite訪問類實例

    這篇文章主要介紹了C#封裝的Sqlite訪問類,實例分析了C#針對Sqlite數(shù)據(jù)庫各種常用操作的相關(guān)技巧,需要的朋友可以參考下
    2015-04-04
  • 詳解C#如何使用重載方法實現(xiàn)不同類型數(shù)據(jù)的計算

    詳解C#如何使用重載方法實現(xiàn)不同類型數(shù)據(jù)的計算

    這篇文章主要為大家詳細介紹了C#如何使用重載方法實現(xiàn)不同類型數(shù)據(jù)的計算,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • 找到整型陣列中最大值和最小值的幾種方法總結(jié)

    找到整型陣列中最大值和最小值的幾種方法總結(jié)

    下面小編就為大家分享一篇找到整型陣列中最大值和最小值的幾種方法總結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12

最新評論

三河市| 博白县| 祁连县| 大埔区| 彭阳县| 湖北省| 正宁县| 深泽县| 江西省| 浠水县| 定西市| 彭山县| 文山县| 天水市| 板桥市| 临漳县| 宾川县| 城固县| 辉县市| 邓州市| 通州市| 且末县| 扶风县| 黎川县| 吉木萨尔县| 贞丰县| 上栗县| 楚雄市| 闽侯县| 轮台县| 巴马| 乌拉特中旗| 蓬溪县| 临夏市| 敦化市| 前郭尔| 顺义区| 盱眙县| 德州市| 衡山县| 得荣县|