跳轉到

程式資訊

  • 程式 IDNoBorderContentWindow
  • 所屬子系統:Other
  • 狀態:stable

無邊框內容視窗(NoBorderContentWindow)

本頁是 ContentWindow 的變體說明

NoBorderContentWindow內容視窗(ContentWindow)同一概念的兩種外觀:兩者共用同一個包裝用 ViewModel(ContentWindowViewModel)與同一套參數(ContentWindowParameter),差別在外框樣式——前者無邊框、背景透明。它不是一支獨立的業務表單,沒有自己的選單編號、權限或欄位。完整的用途、參數與行為請見內容視窗(ContentWindow)

與 ContentWindow 的差異

NoBorderContentWindowContentWindow無邊框(borderless)樣板,預想供「進度條/提示」類的輕量浮層使用:

比較項 ContentWindow NoBorderContentWindow
視窗外框/標題列 有標準視窗外框 ControlTemplate 覆寫,只剩一個 Border 包住 ContentPresenter背景透明、無標題列、無關閉鈕
適用情境 一般彈窗承載一個內容 View(明細編輯、查詢面板等) 進度條、簡短提示等「剛好包住內容」的小浮層
包裝用 ViewModel ContentWindowViewModel ContentWindowViewModel(建構式內同樣 new 一個)
尺寸計算 預設帶入主視窗大小-100,或依參數 WidthHeight 取較小值;IsSizeToContent 時自動縮成內容大小 尺寸計算的程式邏輯與 ContentWindow 相同

尺寸計算與參數面與 ContentWindow 相同;外觀上少了視窗外框、背景透明,看起來像一塊浮在主視窗上的內容區塊。

目前未被任何路徑使用,且尚未接好

系統的彈窗服務 WindowService.ShowContentWindow(...) 一律建立 ContentWindow沒有任何程式碼建立 NoBorderContentWindow。它是保留的無邊框樣板,且目前尚未接好兩個關鍵環節(見下方差異說明),實質上是個半成品骨架,並非可直接套用的成品。

這支程式做什麼

它是一個容器視窗骨架:理論上把任何實作 IContentOfContentWindow 的內容 View 放進來顯示成無邊框浮層。建構式會:

  1. ContentWindowParameter 決定尺寸——
    • 有主視窗時取主視窗 ActualWidth/ActualHeight 各減 100;無主視窗時退回預設 1500×800。
    • 參數帶 WidthHeight 時,取「算出的值」與「參數值」中較小者Math.Min)。
    • 參數 IsSizeToContent = true 時只設 SizeToContent、不指定寬高,讓視窗自動縮成內容大小
  2. 有主視窗時把主視窗設為 Owner,並設 WindowStartupLocation = CenterOwner(置中於主視窗,覆寫 XAML 預設的 CenterScreen)。
  3. 建立包裝用的 ContentWindowViewModel(其建構式把內容 VM 設為 ContentParameter.Title 設為 Title)。
  4. 依參數 NeedCloseButton 決定 NeedHideCloseButton(為 true 時改為不隱藏)。

與 ContentWindow 相比,少了兩個關鍵步驟

  1. 未設定 DataContextContentWindow 在建構式末尾會 this.DataContext = viewModel,但 NoBorderContentWindow 沒有這一行。因此 XAML 上的 {Binding Title}{Binding Content}{Binding DialogResult} 目前都沒有資料來源,視窗會是空的。
  2. 未觸發載入後工作ContentWindow.Window_Loaded 會在視窗顯示後 await OnContentWindowLoadedAsync()(驅動進度條型自動關窗),NoBorderContentWindow.Window_Loaded 沒有這段,只檢查 NeedHideCloseButton,而連那段隱藏關閉鈕的呼叫也被註解掉了。所以「進度條做完自動關窗」在這支樣板上目前不會發生。 這兩點是它仍是半成品的原因,下方說明據此修正。

常見問題

「無邊框內容視窗」要怎麼從選單開啟?

它不在主選單中,沒有選單編號、也不需要權限。它是基礎元件,由其他功能在需要彈窗時於程式內部呼叫,使用者不會單獨開啟它。

它和 ContentWindow 是兩支不同的程式嗎?

是兩個獨立的 WPF 視窗類別(ContentWindowNoBorderContentWindow),但共用同一套包裝用 ViewModel(ContentWindowViewModel)與參數。可把它當作 ContentWindow 的「無邊框皮膚」,但要注意它目前尚未接好 DataContext 與載入後工作(見上方警告)。完整說明見內容視窗(ContentWindow)

進度條的「做完自動關窗」在這支樣板上能用嗎?

目前不能。自動關窗靠 ProgressBarViewModel 實作 IContentWindowLoadedAsync,由容器在視窗顯示後 await OnContentWindowLoadedAsync() 觸發、完成後在 finallyDialogResult 設為 true。這段觸發只寫在 ContentWindow.Window_LoadedNoBorderContentWindow.Window_Loaded 並未實作。若日後要在無邊框情境使用進度條自動關窗,需先把這段 hook(以及 DataContext 綁定)補上。

相關功能


需補截圖清單

本頁為基礎元件變體說明,原則上不需獨立截圖。若日後要示意無邊框外觀,可補拍:

  1. images/nobordercontentwindow-step1.png — 無邊框進度條彈窗浮在主視窗上的外觀