------------恢復內容開始------------
好久沒寫WPF的博客了,其實有很多心得要總結下,但是懶。。。。。
今天工作需要,需要實現一個
1 右下角的提示窗口,然后過三五秒自動消失這樣的需求。
2 再任意位置可以彈出 一個小界面,比如點擊確認按鈕后彈出某些確認信息 (用窗口實現當然也可以,感覺有點大馬拉小車)
想着這樣的功能應該又好人做過了,直接網上抄下就可以了,奈何沒找到,CSDN下載都需要積分。哎,現在的人都想着賺錢了嘛。。。。
決定用Popup做,回顧了下Popup的玩法,要實現,右下角/任意坐標,還是有點麻煩的。一些基礎如果不是很清楚可以看下這個博客
https://www.cnblogs.com/nimorl/p/11628596.html ,寫的比較清楚
想實現任意位置,需要用到PlacementRectangle 屬性,這個東西 簡單點說就是需要你告訴POPUP 一個坐標,然后它根據坐標來做相對定位,我覺得太麻煩了,我這么懶的人是不會去計算坐標的
所以我想了個簡單的方法。既然popup需要一個宿主,那么我們可以在界面的任意位置放置這個宿主,只不過不顯示宿主。這樣,POPUP的位置也可以說是任意了。
比如左下角。假設我們Window下面是一個Grid.那么我只要把宿主放到右下角,然后讓POPUP 靠左顯示就可以了
1 <Grid > 2 <Button x:Name="pophost" Height="100" Width="1" HorizontalAlignment="Right" Margin="0,0,0,0" VerticalAlignment="Bottom" > </Button> 3 <Popup IsOpen="True" StaysOpen="True" PlacementTarget ="{Binding ElementName=pophost}" Placement="Left" > 4 <TextBlock Background="AliceBlue" Height="100" Width="200">我是popup里的txtblock</TextBlock> 5 </Popup> 6 </Grid>
那么,我要多放一個額外的宿主是不是很麻煩那?是的,所以我們改進下代碼,定義一個UserCrontrol, 名字就叫myPopup吧 里面放一個Popup,這樣,你用的時候直接用myPopup就行了
1 <UserControl x:Class="CsharpWpfManual.myPopup" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6 xmlns:local="clr-namespace:CsharpWpfManual" 7 mc:Ignorable="d" x:Name="popuphost" 8 Width="0.1" Height="100" > 9 <Popup x:Name="pp" PlacementTarget="{Binding ElementName=popuphost}" IsOpen="False" StaysOpen="True" Placement="Left" Opened="pp_Opened"> 10 <TextBox x:Name="txt" Width="300" Height="100">你好,我來了</TextBox> 11 </Popup> 12 </UserControl>
這樣我用的時候,代碼就變成了這樣
1 <Grid > 3 <local:myPopup Background="Red" x:Name="mypp" Width="0" Height="100" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0,0,0,0"/> 4 </Grid>
下面我們寫一下myPopup 的cs代碼。實現一些定時和顯示消息的功能
1 public partial class myPopup : UserControl 2 { 3 public myPopup() 4 { 5 InitializeComponent(); 6 readDataTimer.Tick += new EventHandler(timeCycle); 7 readDataTimer.Interval = new TimeSpan(0, 0, 0, 5); 8 } 9 10 private static System.Windows.Threading.DispatcherTimer readDataTimer = new System.Windows.Threading.DispatcherTimer(); 11 public void timeCycle(object sender, EventArgs e) 12 { 13 if (pp.IsOpen == true) 14 { 15 pp.IsOpen = false; 16 } 17 readDataTimer.IsEnabled = false; 18 19 } 20 /// <summary> 21 /// opend事件,打開后,啟動定時器開始計時,先寫死5秒把 22 /// </summary> 23 private void pp_Opened(object sender, EventArgs e) 24 { 25 readDataTimer.IsEnabled = true; 26 27 readDataTimer.Start(); 28 } 29 30 31 public void ShowMessage(string message) 32 { 33 pp.IsOpen = true; 34 txt.Text = message; 35 } 36 }
至此,相信聰明的小伙伴們已經想到了如何把 提示框放在界面中央了, 也可以擴展一下在mypopup類中做個Content屬性,這樣就可以方式任何東西啦,我懶的做了,誰做好了記得分享啊
我也不多說了,上個源碼給大伙看把
https://files.cnblogs.com/files/CSSZBB/WpfApp7.rar
-