【问题标题】:How to change Rectangle color when touched on Windows Phone 8.1在 Windows Phone 8.1 上触摸时如何更改矩形颜色
【发布时间】:2015-03-24 18:55:33
【问题描述】:
我正在为wp 8.1 和C# 和xaml 开发一个应用程序(Visual Studio 2013)。
我有一个基本页面,其中包含用作按钮的矩形。这些矩形通向其他页面。我的愿望是触摸这些透明矩形会将颜色变为蓝色。
<Rectangle Fill="#FFD69F50" HorizontalAlignment="Left" Height="48" Margin="58,94,0,0" Stroke="Black" VerticalAlignment="Top" Width="73" Tap="h1_Tapped"/>
我已经研究过,但找不到解决方法。我的要求可以吗?
这是一个示例图片。
【问题讨论】:
标签:
c#
windows
xaml
visual-studio-2013
windows-phone-8.1
【解决方案1】:
简单的方法是使用按钮而不是矩形。听起来您的使用本质上是按钮式的,因此您最好使用已经实现 Button 语义的 Button 控件。否则,您将需要添加大量代码来自己实现。
特别针对您的问题,按钮通过移动和更改颜色来处理 PointerPressed 事件。默认情况下,这是用户的主题颜色,但您可以编辑 Button 的模板以选择您自己的颜色并移除偏移。
为此,请右键单击设计器中的按钮(我喜欢在文档大纲窗格中执行此操作,因为在那里很容易找到正确的控件),然后选择编辑模板。编辑副本...上下文菜单。这将创建当前模板的副本,以便您对其进行编辑。
浏览复制的模板并找到 VisualState x:Name="Pressed" 部分。这控制按钮按下时的外观。
<VisualState x:Name="Pressed">
<Storyboard>
<PointerDownThemeAnimation Storyboard.TargetName="Grid"/>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentPresenter">
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ButtonPressedForegroundThemeBrush}"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="Border">
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ButtonPressedBackgroundThemeBrush}"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
默认情况下,这会做三件事:
- 应用 PointerDownThemeAnimation 来移动按钮
- 将背景颜色更改为 ButtonPressedBackgroundThemeBrush
- 将前景色更改为 ButtonPressedForegroundThemeBrush
您可以编辑这些以做任何您想做的事情,包括删除动画和更改目标颜色。我建议将颜色保留为主题资源,即使您定义了自己的颜色并让自定义颜色在高对比度模式下恢复为默认值。
要使按钮成为图片中的小方块,而不是 Xaml 中较宽的矩形,您可能需要设置按钮的 MinWidth 属性及其 Width 属性。
如果您真的想坚持使用矩形而不是按钮,那么您需要编写自己的代码来跟踪 PointerPressed 和 PointerReleased 事件。在 PointerPressed 上捕获指针并设置新颜色,在 PointerReleased 上将两者反转。
【解决方案2】:
private void rectControl_PointerPressed( object sender , PointerRoutedEventArgs e )
{
rectControl.Fill = new SolidColorBrush(Colors.Blue);
}
private void rectControl_PointerReleased( object sender , PointerRoutedEventArgs e )
{
rectControl.Fill = new SolidColorBrush(Colors.White);
}
或者在你的viewModel中定义一个属性,然后将矩形的Fill属性与viewModel中定义的属性绑定。
private SolidColorBrush rectangleFill;
public SolidColorBrush RectangleFill
{
get{ return rectangleFill;}
set{ rectangleFill=value;
NotifyPropertyChanged("RectangleFill");
}
}
//Xaml 代码:
<Rectangle Fill={Binding RectangleFill}>