1.使用Popup來實現自訂的彈出效果。Popup控制項彈出的塊會一直在螢幕的最前方,所以使用Popup可以實現各種各樣的彈出框,並且給了你極大的自訂的空間,很多第三方的彈出框控制項的原理其實就是使用了Popup來封裝上各種效果來實現的。
Popup使用的方法:
private Popup popup;
popup = new Popup();
popup.Child = new 控制項類();
//開啟
popup.IsOpen = true;
//關閉
popup.IsOpen = false
或者
xaml代碼
<Popup x:Name="popup">
<Border>
<StackPanel>
……
</StackPanel>
</Border>
</Popup>
cs代碼
//開啟
popup.IsOpen = true;
//關閉
popup.IsOpen = false
2.在TextBlock控制項中使用<LineBreak></LineBreak>進行換行。
<TextBlock TextWrapping="Wrap">
測試
<LineBreak></LineBreak>
<LineBreak></LineBreak>
測試
<LineBreak></LineBreak>
<LineBreak></LineBreak>
測試
</TextBlock>
3.捕獲物理按鍵返回鍵,開啟頁面,離開頁面。windows phone有3個物理按鍵,返回鍵,開始鍵,搜尋鍵,後面兩個無法在程式中捕獲到。
//點擊返回按鈕
protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
//你的代碼
e.Cancel = false;
base.OnBackKeyPress(e);
}
//從其他頁面進入該頁面
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
//你的代碼
base.OnNavigatedTo(e);
}
//離開當前的頁面
protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
//你的代碼
base.OnNavigatedFrom(e);
}
4.擷取父控制項裡面的子控制項的方法。之前在判斷ListBox控制項什麼時候滾到底的時候使用過該方法,這個方法很常用。
//擷取第一個子類型
public static T FindChildOfType<T>(DependencyObject root) where T : class
{
var queue = new Queue<DependencyObject>();
queue.Enqueue(root);
while (queue.Count > 0)
{
DependencyObject current = queue.Dequeue();
for (int i = VisualTreeHelper.GetChildrenCount(current) - 1; 0 <= i; i--)
{
var child = VisualTreeHelper.GetChild(current, i);
var typedChild = child as T;
if (typedChild != null)
{
return typedChild;
}
queue.Enqueue(child);
}
}
return null;
}
//擷取所有的子類型
public static List<T> FindAllChildOfType<T>(DependencyObject root) where T : class
{
var queue = new Queue<DependencyObject>();
queue.Enqueue(root);
List<T> allChild = new List<T>();
while (queue.Count > 0)
{
DependencyObject current = queue.Dequeue();
for (int i = VisualTreeHelper.GetChildrenCount(current) - 1; 0 <= i; i--)
{
var child = VisualTreeHelper.GetChild(current, i);
var typedChild = child as T;
if (typedChild != null)
{
allChild.Add(typedChild);
}
queue.Enqueue(child);
}
}
return allChild;
}
5. 使用<ControlTemplate>……</ControlTemplate>來擴充控制項的各種自訂化的效果,當你需要在控制項上實現一些動畫的效果,或者在控制項上再嵌入其他的一些控制項都可以通過設計一個ControlTemplate來實現。
如實現一個按鈕的單擊效果:
<Button Content="Button" Height="72" HorizontalAlignment="Left" Margin="103,197,0,0" Name="button1" VerticalAlignment="Top" Width="160">
<Button.Template>
<ControlTemplate>
<Grid Background="Transparent">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Pressed">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ButtonBackground" Storyboard.TargetProperty="Background">
<DiscreteObjectKeyFrame KeyTime="0" Value="YellowGreen"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ButtonBackground" Storyboard.TargetProperty="BorderBrush">
<DiscreteObjectKeyFrame KeyTime="0" Value="YellowGreen"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Border x:Name="ButtonBackground" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Margin="{StaticResource PhoneTouchTargetOverhang}">
<ContentControl x:Name="ContentContainer" Foreground="{TemplateBinding Foreground}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" Padding="{TemplateBinding Padding}" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
</Border>
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
6.顯示和隱藏手機的頂部托盤,就是頂部那個訊號和電池資訊那塊東西。
//顯示
SystemTray.IsVisible = true;
//隱藏
SystemTray.IsVisible = false;
遇到一個問題:ApplicationBar的高度無法自訂,當ApplicationBarMenuItem為偶數的時候,下面還多了一大截的空間很影響美觀(為奇數的時候就不會多出這一大截的空間,不知道微軟為何要這樣設計),大家有沒有相關的解決方案呢?