首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WPF Bug 清單 (11):RenderTransform 動畫導致 FocusVisualStyle 虛線框錯位

     編輯:關於.NET

現象

使用 RenderTransform (TranslateTransform) 製作位移動畫時,控件獲得焦點後觸發動畫,FocusVisualStyle 虛線框不會跟隨移動,停留在原位。

重現步驟

  1. 按鈕設定 RenderTransformOrigin="0.5,0.5" 與 TranslateTransform。
  2. Storyboard 動畫修改 RenderTransform.X/Y 位移 100px。
  3. 執行程式,Tab 聚焦按鈕 → 滑鼠移入觸發動畫 → 虛線框留在原地。

初始狀態

獲得焦點

動畫後虛線框錯位

根因

  • FocusVisualStyle 渲染於 Adorner Layer,不屬於控件視覺樹一部分。
  • RenderTransform 僅影響控件自身渲染,不傳遞至 Adorner Layer。
  • 邏輯上合理(避免 Render 處理關聯元素),但造成視覺錯位。

相關受影響場景

  • Validation Error Template
  • Popup 控件
  • 任何使用 Adorner 的焦點/驗證視覺指示器

解決方案

方案一:停用 FocusVisualStyle(不推薦)

<Button FocusVisualStyle="{x:Null}" .../>

方案二:改用 LayoutTransform 或 Margin 動畫

影響佈局,效能較差,但焦點框同步移動。

方案三:Storyboard.CurrentTimeInvalidated 事件強制更新 Adorner(推薦)

private void OnCurrentTimeInvalidated(object sender, EventArgs e) {
    AdornerLayer.GetAdornerLayer(button).Update();
}

於 Storyboard 啟動時掛載事件,動畫每幀強制刷新 Adorner Layer。少量控件效能可接受。

總結

RenderTransform 為純渲染層變換,不影響 Adorner Layer。動畫與焦點視覺結合時,需手動同步 Adorner。WPF 4.0 未修復此行為,開發者需自行處理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved