更改 Xamarin.Forms 按钮点击的颜色
Change Xamarin.Forms button clicked colour
我正在开发 Xamarin.Forms UWP 应用程序,我想在按下按钮时更改按钮的背景颜色。我一直在网上搜索,我能找到的最直接的方法是:
private void Button_OnClicked(object s, EventArgs e)
{
var b = (Button) s;
var originalColour = b.BackgroundColor;
b.BackgroundColor = Color.DarkOrange;
Device.StartTimer(TimeSpan.FromSeconds(0.25), () =>
{
b.BackgroundColor = originalColour;
return false;
});
}
不过,就我个人而言,我不是很喜欢这种方式。如何才能做得更好?
这是最简单的解决方案,但当然不是很干净。
这里的问题是每个平台实现 "pressed" 状态的方式不同,Xamarin.Forms 没有任何 built-in 方法来处理这个问题。
对于 UWP,您有两个选择。首先,您可以创建一个将在整个应用程序中使用的新默认按钮样式。你可以找到默认的style here,然后复制它,修改Pressed
VisualState
并添加为默认资源:
<Style TargetType="Button">
<!-- ... your style -->
</Style>
但是,如果只在某些地方应用按下的按钮颜色,您应该创建一个派生自按钮的新视图,并在 UWP 上使用自定义渲染器,在 OnElementChanged
事件处理程序:
protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
{
base.OnElementChanged(e);
if (this.Element != null)
{
this.Control.Style = ( Style )Application.Current.Resources["CustomButtonStyle"];
}
}
其他平台也会有类似的解决方案,但您肯定必须以这种 platform-specific 方式实现它们,可能使用自定义渲染器。
有关自定义渲染器的更多信息 see the documentation. You may also find some inspiration in Xamarin.Forms Labs 存储库。
XAML中的一个EventTrigger解决方案:
在 MyAssembly
中执行以下操作,例如包含 App.xaml:
的便携式程序集
using Xamarin.Forms;
namespace MyNamespace
{
public class ButtonTriggerAction : TriggerAction<VisualElement>
{
public Color BackgroundColor { get; set; }
protected override void Invoke(VisualElement visual)
{
var button = visual as Button;
if (button == null) return;
if (BackgroundColor != null) button.BackgroundColor = BackgroundColor;
}
}
}
XAML:
xmlns:local="clr-namespace:MyNamespace;assembly=MyAssembly"
...
<Button Text="EventTrigger">
<Button.Triggers>
<EventTrigger Event="Pressed">
<local:ButtonTriggerAction BackgroundColor="Red" />
</EventTrigger>
<EventTrigger Event="Released">
<local:ButtonTriggerAction BackgroundColor="Default" />
</EventTrigger>
</Button.Triggers>
</Button>
一种更自然、更简洁的方法是使用 VisualStateManager
<Button Text="Click Me!">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal">
<VisualState.Setters>
<Setter Property="BackgroundColor" Value="Green" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Pressed">
<VisualState.Setters>
<Setter Property="BackgroundColor" Value="Red" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Button>
您可以在 here 中阅读更多信息。
我正在开发 Xamarin.Forms UWP 应用程序,我想在按下按钮时更改按钮的背景颜色。我一直在网上搜索,我能找到的最直接的方法是:
private void Button_OnClicked(object s, EventArgs e)
{
var b = (Button) s;
var originalColour = b.BackgroundColor;
b.BackgroundColor = Color.DarkOrange;
Device.StartTimer(TimeSpan.FromSeconds(0.25), () =>
{
b.BackgroundColor = originalColour;
return false;
});
}
不过,就我个人而言,我不是很喜欢这种方式。如何才能做得更好?
这是最简单的解决方案,但当然不是很干净。
这里的问题是每个平台实现 "pressed" 状态的方式不同,Xamarin.Forms 没有任何 built-in 方法来处理这个问题。
对于 UWP,您有两个选择。首先,您可以创建一个将在整个应用程序中使用的新默认按钮样式。你可以找到默认的style here,然后复制它,修改Pressed
VisualState
并添加为默认资源:
<Style TargetType="Button">
<!-- ... your style -->
</Style>
但是,如果只在某些地方应用按下的按钮颜色,您应该创建一个派生自按钮的新视图,并在 UWP 上使用自定义渲染器,在 OnElementChanged
事件处理程序:
protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
{
base.OnElementChanged(e);
if (this.Element != null)
{
this.Control.Style = ( Style )Application.Current.Resources["CustomButtonStyle"];
}
}
其他平台也会有类似的解决方案,但您肯定必须以这种 platform-specific 方式实现它们,可能使用自定义渲染器。
有关自定义渲染器的更多信息 see the documentation. You may also find some inspiration in Xamarin.Forms Labs 存储库。
XAML中的一个EventTrigger解决方案:
在 MyAssembly
中执行以下操作,例如包含 App.xaml:
using Xamarin.Forms;
namespace MyNamespace
{
public class ButtonTriggerAction : TriggerAction<VisualElement>
{
public Color BackgroundColor { get; set; }
protected override void Invoke(VisualElement visual)
{
var button = visual as Button;
if (button == null) return;
if (BackgroundColor != null) button.BackgroundColor = BackgroundColor;
}
}
}
XAML:
xmlns:local="clr-namespace:MyNamespace;assembly=MyAssembly"
...
<Button Text="EventTrigger">
<Button.Triggers>
<EventTrigger Event="Pressed">
<local:ButtonTriggerAction BackgroundColor="Red" />
</EventTrigger>
<EventTrigger Event="Released">
<local:ButtonTriggerAction BackgroundColor="Default" />
</EventTrigger>
</Button.Triggers>
</Button>
一种更自然、更简洁的方法是使用 VisualStateManager
<Button Text="Click Me!">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal">
<VisualState.Setters>
<Setter Property="BackgroundColor" Value="Green" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Pressed">
<VisualState.Setters>
<Setter Property="BackgroundColor" Value="Red" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Button>
您可以在 here 中阅读更多信息。