欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

一、為何要獲取刷新時機

例子一、隱藏控件后截屏

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

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

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

二、如何實現(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);
}

效果預覽

到此這篇關于C# wpf實現(xiàn)控件刷新的示例代碼的文章就介紹到這了,更多相關C# wpf控件刷新內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 如何在C#中使用OpenCV(GOCW使用教程)

    如何在C#中使用OpenCV(GOCW使用教程)

    這篇文章主要介紹了如何在C#中使用OpenCV(GOCW使用教程),幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-12-12
  • 詳解c# 類型轉換

    詳解c# 類型轉換

    這篇文章主要介紹了c# 類型轉換的相關資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以學習
    2020-07-07
  • C#實現(xiàn)異步連接Sql Server數據庫的方法

    C#實現(xiàn)異步連接Sql Server數據庫的方法

    這篇文章主要介紹了C#實現(xiàn)異步連接Sql Server數據庫的方法,涉及C#中await方法的相關使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • C# 屏蔽關鍵字的實現(xiàn)方法

    C# 屏蔽關鍵字的實現(xiàn)方法

    前段時間在公司做了一個論壇屏蔽關鍵字的功能,我做的比較簡單、實用~ 現(xiàn)在拿出來給博友們分享下..也希望大家能頂頂我~
    2013-05-05
  • Unity使用LineRender斷筆寫字

    Unity使用LineRender斷筆寫字

    這篇文章主要為大家詳細介紹了Unity使用LineRender斷筆寫字效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • C#實現(xiàn)單件模式的三種常用方法

    C#實現(xiàn)單件模式的三種常用方法

    這篇文章主要介紹了C#實現(xiàn)單件模式的三種常用方法,分析了單件模式的原理、功能與常用的三種實現(xiàn)方法,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • C# 組件的使用方法示例詳解

    C# 組件的使用方法示例詳解

    這篇文章主要介紹了C# 組件的使用方法示例詳解,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2025-04-04
  • 深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的朋友可以參考下
    2016-01-01
  • C#中overrid和new修飾符有什么不同

    C#中overrid和new修飾符有什么不同

    在C#的繼承中嘗嘗會用到相關的修飾詞:override和new。這兩個修飾符都可以在新的子類中,重寫同名的父類方法。下面通過本文給大家介紹C#中overrid和new修飾符的區(qū)別,感興趣的朋友一起看看吧
    2018-02-02
  • Unity實現(xiàn)通用的信息提示框

    Unity實現(xiàn)通用的信息提示框

    這篇文章主要為大家詳細介紹了Unity實現(xiàn)通用的信息提示框,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06

最新評論