CustomMessageBox使用总结
开发过程中难免要使用到消息框,然而系统提供的MessageBox却难以满足许多需求。一、MessageBox的背景颜色无法更改,这就无法满足需求要求的消息框颜色。二、MessageBox的提示形式过于单一,难以满足包含ListPicker、CheckBox等方式的弹出框,而CustomMessageBox的模版中包含了ContentPresenter,可以承载各种各样的内容控件。在多方面考虑之后,于是决定选择Toolkit的CustomMessageBox作为应用的弹出提示框。
然而在使用过程中发现CustomMessageBox还是存在些许问题的。
首先,当应用的SystemTray系统托盘的Opacity(透明度)为0的时候,消息框弹出的时候系统托盘仍然是透明的,很难看有木有啊!

为了处理掉这个问题,不得不对CustomMessageBox进行重载。
double oldOpacity;
public MyCustomMessageBox():
base()
{
this.Dismissed += MyCustomMessageBox_Dismissed;
} void MyCustomMessageBox_Dismissed(object sender, DismissedEventArgs e)
{
SystemTray.Opacity = oldOpacity;
} public void Show()
{
oldOpacity = SystemTray.Opacity;
SystemTray.Opacity = 1;
this.Show();
}
然而,这还是比较小的问题。需求要求的消息框是要不受系统的主题背景影响的,而CustomMessageBox的遮罩背景却会在手机主题背景为白色的时候,遮罩背景变成透明的淡白色,这与应用自身设计的皮肤太不搭调了,很难看。这要如何处理掉呢?查看了CustomMessageBox的模版,发现模版中并没有有关于遮罩背景的部分。
<Style TargetType="controls:CustomMessageBox">
<Setter Property="VerticalAlignment" Value="Top"/>
<Setter Property="HorizontalContentAlignment" Value="Left"/>
<Setter Property="VerticalContentAlignment" Value="Top"/>
<Setter Property="FontFamily" Value="{StaticResource PhoneFontFamilyNormal}"/>
<Setter Property="FontSize" Value="{StaticResource PhoneFontSizeNormal}"/>
<Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}"/>
<Setter Property="Background" Value="{StaticResource PhoneChromeBrush}"/>
<Setter Property="Margin" Value="0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="controls:CustomMessageBox">
<Grid
Background="{TemplateBinding Background}"
HorizontalAlignment="Stretch">
<Grid
Width="480"
HorizontalAlignment="Left">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<StackPanel
Grid.ColumnSpan="2"
Margin="0,0,0,18">
<TextBlock
x:Name="TitleTextBlock"
Text="{TemplateBinding Title}"
Foreground="{TemplateBinding Foreground}"
Visibility="Collapsed"
Margin="24,16,24,-6"
FontFamily="{StaticResource PhoneFontFamilySemiBold}"/>
<TextBlock
x:Name="CaptionTextBlock"
Text="{TemplateBinding Caption}"
Foreground="{TemplateBinding Foreground}"
Visibility="Collapsed"
Margin="24,8,24,0"
FontSize="{StaticResource PhoneFontSizeLarge}"
FontFamily="{StaticResource PhoneFontFamilySemiBold}"
TextWrapping="Wrap"
HorizontalAlignment="Left"/>
<TextBlock
x:Name="MessageTextBlock"
Text="{TemplateBinding Message}"
Foreground="{TemplateBinding Foreground}"
Margin="24,11,24,0"
Visibility="Collapsed"
FontSize="{StaticResource PhoneFontSizeMedium}"
FontFamily="{StaticResource PhoneFontFamilySemiLight}"
TextWrapping="Wrap"
HorizontalAlignment="Left"/>
<ContentPresenter Margin="12,0,0,0"/>
</StackPanel>
<Button
x:Name="LeftButton"
Grid.Row="1" Grid.Column="0"
Content="{TemplateBinding LeftButtonContent}"
IsEnabled="{Binding IsLeftButtonEnabled}"
Foreground="{TemplateBinding Foreground}"
Margin="12,0,0,12"
Visibility="Collapsed"
controls:TiltEffect.IsTiltEnabled="True"/>
<Button
x:Name="RightButton"
Grid.Row="1" Grid.Column="1"
Content="{TemplateBinding RightButtonContent}"
IsEnabled="{Binding IsRightButtonEnabled}"
Foreground="{TemplateBinding Foreground}"
Margin="0,0,12,12"
Visibility="Collapsed"
controls:TiltEffect.IsTiltEnabled="True"/>
</Grid>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
无奈之中只好去看CustomMessageBox的源码,最终发现遮罩的这一层原来是这样实现的。首先创建一个Grid容器,然后再创建一个Rectangle对象作为遮罩层,并且Fill值为系统的PhoneBackgroundColor这个值。将遮罩层Add到Grid容器中,将弹出框Add到Grid容器中,最后在将Grid容器添加到Popup然后弹出。那么可不可以这样做呢,在后台中找到遮罩的Rectangle,将其Fill固定下来。
public void Show()
{
oldOpacity = SystemTray.Opacity;
SystemTray.Opacity = 1;
this.Show();
//获取Grid容器
Grid container = this.Parent as Grid;
//可视化树中查找Rectangle遮罩层
Rectangle rec = BV_ToolAPI.FindFirstChildOfType<Rectangle>(container);
rec.Fill = new SolidColorBrush(Color.FromArgb(0x99, 0, 0, 0));
}
Ok,这样,CustomMessageBox就不会再根据系统的主题背景颜色而变化了。
CustomMessageBox使用总结的更多相关文章
- 准备.Net转前端开发-WPF界面框架那些事,UI快速实现法
题外话 打开博客园,查看首页左栏的”推荐博客”,排名前五的博客分别是(此处非广告):Artech.小坦克.圣殿骑士.腾飞(Jesse).数据之巅.再看看它们博客的最新更新时间:Artech(2014- ...
- 《深入理解Windows Phone 8.1 UI控件编程》基于最新的Runtime框架
<深入理解Windows Phone 8.1 UI控件编程>本书基于最新的Windows Phone 8.1 Runtime SDK编写,全面深入地论述了最酷的UI编程技术:实现复杂炫酷的 ...
- wp8使用Beetle.NetPackage实现基于TCP通讯的订单查询
在新版本的Beetle.NetPackage中提供了对Protobuf和Controller的支持,所以在WP8下使用Beetle.NetPackage进行基于TCP的数据交互则一件非常简单事情.下面 ...
- 自定义SWT控件六之自定义Tab
6.自定义tab 本章节提供的自定义tab 分为两类 tab上带删除按钮和添加按钮,可删除tab和添加tab tab不可删除和添加 6.1 不可删除tab package com.view.contr ...
- 自定义SWT控件五之自定义穿梭框
5.自定义穿梭框 package com.view.control.shuttlebox; import java.util.ArrayList; import java.util.HashMap; ...
随机推荐
- c# 方法参数(传值,传引用,ref,out,params,可选参数,命名参数)
一.方法参数的类型----值类型和引用类型 当方法传递的参数是值类型时,变量的栈数据会完整地复制到目标参数中即实参和形参中的数据相同但存放在内存的不同位置.所以,在目标方法中对形参所做的更改不会 ...
- ApplePay高调入华,教你在app里上线ApplePay
ApplePay在中国上线后,就有许多线上app前后脚加入了对其的接入支持,个人比较喜欢的ENJOY也抢在首批接入了ApplePay应用内支付.本文将分享作者的接入经验. ApplePay是苹果公 ...
- solr--搜索参数随笔
1.默认搜索域.查询域的关系 qf字段的配置:query fields,指定solr从哪些field中搜索 在solrj中设置如下: params.setParam("qf", & ...
- ios-为银行卡号格式化 每隔四位添加一个空格
-(NSString *)formatterBankCardNum:(NSString *)string { NSString *tempStr=string; NSInteger size =(te ...
- Web分布式部署,跨应用程序Forms身份验证的集成方案
最近一个项目要求进行分布式部署.保证在双十一期间系统的正常运行,虽然该系统平时访问量不是很大,但是基于业务需要,必须在至少两台服务器上部署. 该系统需要登录后才可以使用,首先需要解决分布式部署的用户状 ...
- 纯CSS 多图片轮播
今天做东西的时候,遇到一个问题关于图片轮播的问题,以前也接触过(百度 人家的demo改改..),再次遇到这个问题的时候,根据以前的印象找到了demo正信心满满的准备改一下嵌进去,发现 jquery.m ...
- Android学习笔记④——页面的布局方式
FrameLayout(帧布局) 这个布局的特点是简单的默认把每一个视图组件都放在边框内且放在左上角,即使添加多个视图组件,他们也都是重叠在左上角,新的视图会遮挡住旧的视图.可以根据gravity来改 ...
- IOS缓存之NSCache缓存
NSCache:专门做缓存的类 NSCache简介:NSCache是苹果官方提供的缓存类,用法与NSMutableDictionary的用法很相似,在AFNetworking和SDWebImage中, ...
- ajaxFileUpload 报这错jQuery.handleError is not a function 博客分类: WEB前端jquery
ajaxfileuploadhandleError 今天刚打个一个技术群,里面有人问标题上的问题,嘿,我恰好遇过,现在大家至少也在用jquery1.9以上的版本,ajaxfileupload的版本早 ...
- virsh default启动失败原因分析及解决
启动default时出现如下错误提示:[root@node1 ~]# virsh net-start defaulterror: Failed to start network defaulterro ...