程式資訊
- 程式 ID:
NoBorderContentWindow - 所屬子系統:Other
- 狀態:stable
無邊框內容視窗(NoBorderContentWindow)¶
本頁是 ContentWindow 的變體說明
NoBorderContentWindow 與內容視窗(ContentWindow)是同一概念的兩種外觀:兩者共用同一個包裝用 ViewModel(ContentWindowViewModel)與同一套參數(ContentWindowParameter),差別在外框樣式——前者無邊框、背景透明。它不是一支獨立的業務表單,沒有自己的選單編號、權限或欄位。完整的用途、參數與行為請見內容視窗(ContentWindow)。
與 ContentWindow 的差異¶
NoBorderContentWindow 是 ContentWindow 的無邊框(borderless)樣板,預想供「進度條/提示」類的輕量浮層使用:
| 比較項 | ContentWindow | NoBorderContentWindow |
|---|---|---|
| 視窗外框/標題列 | 有標準視窗外框 | 以 ControlTemplate 覆寫,只剩一個 Border 包住 ContentPresenter,背景透明、無標題列、無關閉鈕 |
| 適用情境 | 一般彈窗承載一個內容 View(明細編輯、查詢面板等) | 進度條、簡短提示等「剛好包住內容」的小浮層 |
| 包裝用 ViewModel | ContentWindowViewModel |
ContentWindowViewModel(建構式內同樣 new 一個) |
| 尺寸計算 | 預設帶入主視窗大小-100,或依參數 Width/Height 取較小值;IsSizeToContent 時自動縮成內容大小 |
尺寸計算的程式邏輯與 ContentWindow 相同 |
尺寸計算與參數面與 ContentWindow 相同;外觀上少了視窗外框、背景透明,看起來像一塊浮在主視窗上的內容區塊。
目前未被任何路徑使用,且尚未接好
系統的彈窗服務 WindowService.ShowContentWindow(...) 一律建立 ContentWindow,沒有任何程式碼建立 NoBorderContentWindow。它是保留的無邊框樣板,且目前尚未接好兩個關鍵環節(見下方差異說明),實質上是個半成品骨架,並非可直接套用的成品。
這支程式做什麼¶
它是一個容器視窗骨架:理論上把任何實作 IContentOfContentWindow 的內容 View 放進來顯示成無邊框浮層。建構式會:
- 依
ContentWindowParameter決定尺寸——- 有主視窗時取主視窗
ActualWidth/ActualHeight各減 100;無主視窗時退回預設 1500×800。 - 參數帶
Width/Height時,取「算出的值」與「參數值」中較小者(Math.Min)。 - 參數
IsSizeToContent = true時只設SizeToContent、不指定寬高,讓視窗自動縮成內容大小。
- 有主視窗時取主視窗
- 有主視窗時把主視窗設為 Owner,並設
WindowStartupLocation = CenterOwner(置中於主視窗,覆寫 XAML 預設的CenterScreen)。 - 建立包裝用的
ContentWindowViewModel(其建構式把內容 VM 設為Content、Parameter.Title設為Title)。 - 依參數
NeedCloseButton決定NeedHideCloseButton(為true時改為不隱藏)。
與 ContentWindow 相比,少了兩個關鍵步驟
- 未設定
DataContext:ContentWindow在建構式末尾會this.DataContext = viewModel,但NoBorderContentWindow沒有這一行。因此 XAML 上的{Binding Title}/{Binding Content}/{Binding DialogResult}目前都沒有資料來源,視窗會是空的。 - 未觸發載入後工作:
ContentWindow.Window_Loaded會在視窗顯示後await OnContentWindowLoadedAsync()(驅動進度條型自動關窗),NoBorderContentWindow.Window_Loaded沒有這段,只檢查NeedHideCloseButton,而連那段隱藏關閉鈕的呼叫也被註解掉了。所以「進度條做完自動關窗」在這支樣板上目前不會發生。 這兩點是它仍是半成品的原因,下方說明據此修正。
常見問題¶
「無邊框內容視窗」要怎麼從選單開啟?
它不在主選單中,沒有選單編號、也不需要權限。它是基礎元件,由其他功能在需要彈窗時於程式內部呼叫,使用者不會單獨開啟它。
它和 ContentWindow 是兩支不同的程式嗎?
是兩個獨立的 WPF 視窗類別(ContentWindow 與 NoBorderContentWindow),但共用同一套包裝用 ViewModel(ContentWindowViewModel)與參數。可把它當作 ContentWindow 的「無邊框皮膚」,但要注意它目前尚未接好 DataContext 與載入後工作(見上方警告)。完整說明見內容視窗(ContentWindow)。
進度條的「做完自動關窗」在這支樣板上能用嗎?
目前不能。自動關窗靠 ProgressBarViewModel 實作 IContentWindowLoadedAsync,由容器在視窗顯示後 await OnContentWindowLoadedAsync() 觸發、完成後在 finally 把 DialogResult 設為 true。這段觸發只寫在 ContentWindow.Window_Loaded,NoBorderContentWindow.Window_Loaded 並未實作。若日後要在無邊框情境使用進度條自動關窗,需先把這段 hook(以及 DataContext 綁定)補上。
相關功能¶
- 內容視窗(ContentWindow) — 本程式的標準外框版本,操作與參數的完整說明在此。
- Other 模組首頁
需補截圖清單
本頁為基礎元件變體說明,原則上不需獨立截圖。若日後要示意無邊框外觀,可補拍:
images/nobordercontentwindow-step1.png— 無邊框進度條彈窗浮在主視窗上的外觀