WPF 視窗居中 變更觸發機制

2021-09-19 22:30:04 字數 3059 閱讀 6721

原文:

wpf 視窗居中 & 變更觸發機制

解決:1。單例項視窗,視窗每次隱藏後再顯示時,位置居中顯示

2。多螢幕下單例項視窗,當父視窗移動到其它螢幕時,單例項視窗再次彈出時,位置才更新到父視窗螢幕。

3。子視窗每次喚醒時,都居中顯示。

windows的啟動時位置顯示,windowstartuplocation

當第一次window.showdialog時,window顯示如上設定。

上面只涉及到了首次顯示位置,之後,視窗的位置會繼續保留

我們先了解一下,有哪些觸發機制

activated 視窗啟用

視窗變更為前台視窗時(即顯示在最前面),會觸發

isvisiblechanged 顯示變更

當我們設定視窗隱藏hide()時,isvisibile=false.視窗再次showdialog時,isvisibile=true;

利用如上倆種機制,下面就可以搞事情了。

首先定義幾個列舉:

1

///2

///視窗顯示變更觸發時機

3///

4public

enum

windowlocationinvokeoccasion

5

如上列舉包含了4種觸發機制。

我們再定義個附加屬性,通過附加屬性去設定視窗的額外功能-居中顯示觸發機制

1

///2

///視窗顯示居中觸發時機

3///

另:居中顯示設定,請使用的屬性

4///

5public

static

readonly dependencyproperty invokeoccasionproperty =dependencyproperty.registerattached(6"

invokeoccasion

", typeof(windowlocationinvokeoccasion), typeof

(windowlocationoptions),

7new propertymetadata(default(windowlocationinvokeoccasion), invokeoccasionproperty_changedcallback));

在屬性更改觸發事件中,根據不同的觸發條件,設定不同的居中顯示。

1

var screen = screen.fromhandle(new

windowinterophelper(parentwindow).handle);

23 graphics currentgraphics = graphics.fromhwnd(new

windowinterophelper(parentwindow).handle);

4double dpixratio = currentgraphics.dpix / 96;5

double dpiyratio = currentgraphics.dpiy / 96;6

7//當子視窗與父視窗所在螢幕相同時,不作處理

8var issubwindowinsamescreen = subwindow.left > screen.bounds.left / dpixratio &&

9 subwindow.left < screen.bounds.left / dpixratio + screen.bounds.width / dpixratio &&

10 subwindow.top > screen.bounds.top / dpiyratio &&

11 subwindow.top < screen.bounds.top / dpiyratio + screen.bounds.height /dpiyratio;

12return issubwindowinsamescreen;

介紹完成觸發條件,下面說下視窗居中顯示。

居中顯示,分為當前螢幕內居中/主視窗內居中,直接上**

設定視窗的依靠位置location(left,top)(左上角)

ps:視窗的位置left/top可能為負

1

///2

///在主視窗中居中顯示

3///

4///

5///

6private

static

void

setwindowincenterowner(window subwindow, window parentwindow)721

if (parentwindow.windowstate ==windowstate.maximized)

2236

else

3742 }

視窗位置設定和上面的一樣,值得注意的是dpi。

通過win的顯示設定,調整文字顯示比例,螢幕的位置轉換(x,y),得考慮dpi的換算

1

///2

///在父視窗所在螢幕居中顯示

3///

4///

5///

6private

static

void

setwindowincenterscreen(window subwindow, window parentwindow)710

11private

const

int dpipercent = 96;12

13private

static

void

setwindowlocationinscreen(window subwindow, window parentwindow, windowstate windowstate)

1429

else

3037

}38 }

關鍵字:單例項視窗,視窗居中,centerowner,centerscreen,當前螢幕dpi

WPF 視窗居中 變更觸發機制

原文 wpf 視窗居中 變更觸發機制 解決 1。單例項視窗,視窗每次隱藏後再顯示時,位置居中顯示 2。多螢幕下單例項視窗,當父視窗移動到其它螢幕時,單例項視窗再次彈出時,位置才更新到父視窗螢幕。3。子視窗每次喚醒時,都居中顯示。windows的啟動時位置顯示,windowstartuplocatio...

WPF 視窗居中 變更觸發機制

解決 1。單例項視窗,視窗每次隱藏後再顯示時,位置居中顯示 2。多螢幕下單例項視窗,當父視窗移動到其它螢幕時,單例項視窗再次彈出時,位置才更新到父視窗螢幕。3。子視窗每次喚醒時,都居中顯示。windows的啟動時位置顯示,windowstartuplocation 當第一次window.showdi...

WPF 窗體居中

private void centerwindowonscreen windowstartuplocation centerscreen 設定windowstartuplocation屬性設定為centerscreen會開啟乙個視窗定位在螢幕,其中包含滑鼠游標的中心。設定windowstartupl...