之前看到以及其它应用都有调节屏幕亮度的功能,还以为MS有相关的API,就去MSDN找了下,但是怎么都找不到。今天突然想到做自定义MessageBox时,由于要突出弹出框部分,所以会改变LayoutRoot的opacity属性,以达到屏幕暗下来的效果,于是马上试了下,结果是可行的。添加一个Slider,并将其Value熟性绑定到LayoutRoot的Opcity属性上,这样一来,在滑动Slider时,LayoutRoot的Opcaity就会改变,也就达到了我们想要的效果。代码很也简单:
<
Grid
x:Name
=
"LayoutRoot"
Background
=
"Transparent"
Opacity
=
"{Binding ElementName=slider, Path=Value}"
>
<
Slider
x:Name
=
"slider"
Height
=
"100"
Minimum
=
"0.1"
Maximum
=
"1"
Value
=
"1"
/>
由于之前认为这个只能改变当前的Opacity,所以又想了一个方法,利用Behavior,这个东东真是让我爱不释手啊。具体思路就是去的当前app的PhoneApplicationFrame,它也包含一个Opcity的依赖属性,所以我们可以从这一点入手。代码也很简单:
public
class
ChangeBrightnessBehavior : Behavior<Slider>
{
PhoneApplicationFrame frame;
protected
override
void
OnAttached()
{
base
.OnAttached();
this
.AssociatedObject.ValueChanged += AssociatedObject_ValueChanged;
}
void
AssociatedObject_ValueChanged(
object
sender, RoutedPropertyChangedEventArgs<
double
> e)
{
if
(frame ==
null
)
frame = App.Current.RootVisual
as
PhoneApplicationFrame;
frame.Opacity = e.NewValue;
}
protected
override
void
OnDetaching()
{
this
.AssociatedObject.ValueChanged -= AssociatedObject_ValueChanged;
frame =
null
;
base
.OnDetaching();
}
}
使用的时候如果闲前台添加行为太麻烦,还可以使用后置代码进行添加:
1System.Windows.Interactivity.Interaction.GetBehaviors(slider).Add(new ChangeBrightnessBehavior());
Ps:注意引入相应的命名空间,slider的最小值设为0.1是因为当Opacity值为0时,元素是不可见的,屏幕全黑了,连slider都看不见了,UE就不好了,建议稍微设高一点。
本文来自hamguy博客,原文地址:http://www.hamguy.info/?p=533