通常,我們會 通過allowstransparency=」true」、 windowstyle=」none」 這兩個屬性將wpf視窗的邊框去掉,由於邊框沒了,我們就不能通過滑鼠指標懸停在某一邊上拖動改變視窗的大小,此時若要能調整視窗大小,官方倒也提供了個屬性:resizemode=」canresizewithgrip」,這麼一設定,我們會發現視窗右下角多出乙個三角標記,此時可以將滑鼠指正懸停在這個標記上,進而拖動改變視窗的大小,這確實能解決問題,但是產品經理那過不了啊= =,「別的軟體都可以在邊框上調整呀」,orz…
首先,我們不可能在每乙個視窗xaml裡都加上邊角,而是要寫乙個視窗模板,然後讓需要能縮放的視窗繼承這個模板就行了。
ok,建立乙個視窗模板的資源檔案:
""
xmlns:x="">
"customwindowtemplete" targettype="window">
"transparent" borderthickness="12" x:name="outborder">
"15" color="#000000"
opacity=".25"
direction="90" shadowdepth="1"/>
"1"/>
"1"/>
grid.rowdefinitions>
"1"/>
"1"/>
grid.columndefinitions>
grid.row="1"
grid.column="1"
background="white" >
grid>
grid.row="0"
grid.column="0"
opacity=".25"/>
grid.row="0"
grid.column="1"
opacity=".25"/>
grid.row="0"
grid.column="2"
opacity=".25"/>
grid.row="1"
grid.column="0"
opacity=".25"/>
grid.row="1"
grid.column="2"
opacity=".25"/>
grid.row="2"
grid.column="0"
opacity=".25"/>
grid.row="2"
grid.column="1"
opacity=".25"/>
grid.row="2"
grid.column="2"
opacity=".25"/>
grid>
property="allowstransparency"
value="true"/>
property="windowstyle"
value="none"/>
property="template"
value="">setter>
style>
source="resources/customcolor.xaml"/>
source="resources/vcreditwindow.xaml"/>
resourcedictionary.mergeddictionaries>
resourcedictionary>
再新建乙個基類視窗:
public
class vcreditwindowbehindcode : window
,,,,,,,
}; public
enum resizedirection
[dllimport("user32.dll", charset = charset.auto)]
public
static
extern intptr sendmessage(intptr hwnd, uint msg, intptr wparam, intptr lparam);
public
vcreditwindowbehindcode()
void vcreditwindowbehindcode_mousemove(object sender, mouseeventargs e)}}
void vcreditwindowbehindcode_sourceinitialized(object sender, eventargs e)
void vcreditwindowbehindcode_loaded(object sender, routedeventargs e)
}public
void
resizepressed(object sender, mouseeventargs e)
}public
void
resizewindow(resizedirection direction)
}注意建構函式裡的3個事件,在這3個事件裡分別做了一系列的初始化工作。這裡真正改變視窗大小的**其實是user32裡的sendmessage方法。
下來就到了具體的視窗了:
在視窗屬性裡引入命名空間: xmlns:vcredit=」clr-namespace:vcreditchat.resources」
然後把視窗最外層的標籤window替換成vcredit:vcreditwindowbehindcode,也就是剛剛那個基類視窗
再引用一下剛剛資源裡定義的樣式:style=」」
最後在視窗的後台**裡繼承一下基類視窗類: public partial class chatsingle : vcreditwindowbehindcode
以上就完成了滑鼠在邊框拖動調整無邊框視窗大小的功能了,但是還有個問題,就是我們將border的borderthickness設定成了12,如果最大化視窗會發現,視窗離電腦螢幕邊框還有12畫素的空白,此時我們就要在最大化時通過後台**動態設定borderthickness=0,在視窗正常化時再恢復12。
WPF無邊框拖動 全屏 縮放
先看效果 無邊框設定windowstyle none 視窗無關閉及縮放按鈕,但還有黑邊 設定allowstransparency true 黑邊沒有了。全屏,遮住工作列 this.windowstate system.windows.windowstate.normal this.windowsty...
WPF 無邊框窗體滑鼠拖動改變大小和移動
protected override void onsourceinitialized eventargs e protected virtual intptr wndproc intptr hwnd,int msg,intptr wparam,intptr lparam,ref bool hand...
WPF 建立無邊框的圓角視窗
首先將窗體的背景設為透明,將允許透明的屬性設定為true,即 background transparent allowstransparency true 將window的windowstyle屬性設定為none,即windowstyle none 當allowstransparency true ...