国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C# wpf 獲取控件刷新的時機

這篇具有很好參考價值的文章主要介紹了C# wpf 獲取控件刷新的時機。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


前言

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


一、為何要獲取刷新時機?

例子一、隱藏控件后截屏

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

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

有一段邏輯需要根據(jù)控件大小做計算,使用的是ActualWidth、ActualHeight。在這段邏輯前剛好有修改大小的代碼,但此時修改Width、Height之后ActualWidth、ActualHeight不會立刻改變,需要等到界面刷新時會改變,這就會導致計算數(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);
}

效果預覽
C# wpf 獲取控件刷新的時機,# wpf,c#,wpf,開發(fā)語言


總結(jié)

以上就是今天要講的內(nèi)容,本文的做法是筆者曾經(jīng)在某個論壇看到的建議,然后去嘗試實現(xiàn)發(fā)現(xiàn)是可行的,后來進一步封裝為異步方法。發(fā)出來的主要目的是作為記錄,一方面是方便以后拷貝使用,另一方面也希望能對大家有所幫助。文章來源地址http://www.zghlxwxcb.cn/news/detail-798173.html

到了這里,關于C# wpf 獲取控件刷新的時機的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • WPF 獲取父容器控件的寬度

    在WPF中,如果你想要獲取一個控件的父容器(Parent)的寬度,你可以通過以下方式訪問: 這里的 this 指的是當前控件實例。 .Parent 屬性返回直接父容器, .ActualWidth 則是獲取該父容器的實際渲染寬度。 如果你需要獲取更高級別的祖先容器的寬度,或者是在代碼后面綁定到某個

    2024年01月17日
    瀏覽(25)
  • [C# WPF] 如何給控件添加邊框(Border)?

    在WPF中,可以使用邊框控件或者邊框?qū)傩詠頌榭丶砑舆吙颉?以下是兩種常見的方法: WPF中的Border控件用于為其他控件添加邊框效果。它是一個容器控件,可以包含一個子元素,并為其提供邊框、背景和填充等裝飾效果。 以下是Border控件的一些主要屬性: BorderBrush:用于定

    2024年02月20日
    瀏覽(20)
  • C# wpf 附加屬性實現(xiàn)任意控件拖動調(diào)整大小

    C# wpf 附加屬性實現(xiàn)任意控件拖動調(diào)整大小

    第一節(jié) Grid內(nèi)控件拖動調(diào)整大小 第二節(jié) Canvas內(nèi)控件拖動調(diào)整大小 第三節(jié) 窗口拖動調(diào)整大小 第四節(jié) 附加屬性實現(xiàn)拖動調(diào)整大?。ū菊拢?第五章 拓展更多調(diào)整大小功能 前面幾節(jié)講了控件拖動改變大小的幾種方法,根據(jù)不同的布局可以有不同的實現(xiàn)方式。本節(jié)主要講的是利用

    2024年02月11日
    瀏覽(40)
  • C# wpf 實現(xiàn)任意控件(包括窗口)更多調(diào)整大小功能

    C# wpf 實現(xiàn)任意控件(包括窗口)更多調(diào)整大小功能

    第一節(jié) Grid內(nèi)控件拖動調(diào)整大小 第二節(jié) Canvas內(nèi)控件拖動調(diào)整大小 第三節(jié) 窗口拖動調(diào)整大小 第四節(jié) 附加屬性實現(xiàn)拖動調(diào)整大小 第五章 拓展更多調(diào)整大小功能(本章) 上一章我們已經(jīng)實現(xiàn)了任意控件統(tǒng)一的拖動調(diào)整功能,能夠方便的給任意控件設置拖動調(diào)整大小。開發(fā)過程

    2024年01月18日
    瀏覽(22)
  • 【小沐學C#】WPF中嵌入web網(wǎng)頁控件(WebBrowser、WebView2、CefSharp)

    【小沐學C#】WPF中嵌入web網(wǎng)頁控件(WebBrowser、WebView2、CefSharp)

    使用 Windows Presentation Foundation (WPF),你可以創(chuàng)建適用于 Windows 且具有非凡視覺效果的桌面客戶端應用程序。 WPF 的核心是一個與分辨率無關且基于矢量的呈現(xiàn)引擎,旨在充分利用現(xiàn)代圖形硬件。 WPF 通過一套完善的應用程序開發(fā)功能對該核心進行了擴展,這些功能包括可擴展應

    2024年02月03日
    瀏覽(32)
  • WPF應用開發(fā)之控件動態(tài)內(nèi)容展示

    WPF應用開發(fā)之控件動態(tài)內(nèi)容展示

    在我們開發(fā)一些復雜信息的時候,由于需要動態(tài)展示一些相關信息,因此我們需要考慮一些控件內(nèi)容的動態(tài)展示,可以通過動態(tài)構(gòu)建控件的方式進行顯示,如動態(tài)選項卡展示不同的信息,或者動態(tài)展示一個自定義控件的內(nèi)容等等,目的就是能夠減少一些硬編碼的處理方式,以

    2024年02月05日
    瀏覽(20)
  • WPF開發(fā)一個可以自適應排列的Panel控件

    WPF開發(fā)一個可以自適應排列的Panel控件

    一.控件介紹 ????初看標題可能無法理解,我們看看什么是自適應排列。 乍一看它有點像WrapPanel控件,都是從左至右排列,如果一行排列不下就換行繼續(xù)排列,但是細看你就會發(fā)現(xiàn)不對,WrapPanel控件行尾是不會對齊的,也就是說只要WrapPanel的子控件的寬度不一致,每一行的

    2024年04月08日
    瀏覽(23)
  • WPF開發(fā)經(jīng)驗-WPF的TextBox控件的MouseDown事件不響應的解決方法

    WPF開發(fā)經(jīng)驗-WPF的TextBox控件的MouseDown事件不響應的解決方法

    最近項目有個需求,大概是,當點擊某個TextBox時,先執(zhí)行一些業(yè)務上的邏輯處理。 于是按以往思維,將TextBox的MouseDown事件關聯(lián)事件處理方法,將業(yè)務處理寫在方法里。 調(diào)試發(fā)現(xiàn),點擊TextBox時,事件處理方法未執(zhí)行。 通過查閱微軟官方文檔了解到問題原因。 附上文檔鏈接:

    2024年02月08日
    瀏覽(30)
  • MAUI 框架開發(fā) 將 MAUI 嵌入到 WPF 控件里

    本文將介紹如何將 MAUI 的底層替換為 WPF 框架層,且將 MAUI 的內(nèi)容嵌入到 WPF 的一個控件里面,無 UI 框架嵌入的空域問題 本文是 MAUI 框架開發(fā)博客,而不是 MAUI 應用開發(fā)博客,本文更多介紹的是進行 MAUI 這個框架的開發(fā)內(nèi)容。不熟悉或不進行 MAUI 框架開發(fā)的伙伴也可以看著玩

    2024年02月17日
    瀏覽(22)
  • 使用WPF開發(fā)自定義用戶控件,以及實現(xiàn)相關自定義事件的處理

    使用WPF開發(fā)自定義用戶控件,以及實現(xiàn)相關自定義事件的處理

    在前面隨筆《使用Winform開發(fā)自定義用戶控件,以及實現(xiàn)相關自定義事件的處理》中介紹了Winform用戶自定義控件的處理,對于Winform自定義的用戶控件來說,它的呈現(xiàn)方式主要就是基于GDI+進行渲染的,對于數(shù)量不多的控件呈現(xiàn),一般不會覺察性能有太多的問題,隨著控件的數(shù)量

    2024年02月02日
    瀏覽(40)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包