解決: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));
在屬性更改觸發事件中,根據不同的觸發條件,設定不同的居中顯示。
1var 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
唐宋元明清2188
出處:
WPF 視窗居中 變更觸發機制
原文 wpf 視窗居中 變更觸發機制 解決 1。單例項視窗,視窗每次隱藏後再顯示時,位置居中顯示 2。多螢幕下單例項視窗,當父視窗移動到其它螢幕時,單例項視窗再次彈出時,位置才更新到父視窗螢幕。3。子視窗每次喚醒時,都居中顯示。windows的啟動時位置顯示,windowstartuplocatio...
WPF 視窗居中 變更觸發機制
原文 wpf 視窗居中 變更觸發機制 解決 1。單例項視窗,視窗每次隱藏後再顯示時,位置居中顯示 2。多螢幕下單例項視窗,當父視窗移動到其它螢幕時,單例項視窗再次彈出時,位置才更新到父視窗螢幕。3。子視窗每次喚醒時,都居中顯示。windows的啟動時位置顯示,windowstartuplocatio...
WPF 窗體居中
private void centerwindowonscreen windowstartuplocation centerscreen 設定windowstartuplocation屬性設定為centerscreen會開啟乙個視窗定位在螢幕,其中包含滑鼠游標的中心。設定windowstartupl...