更改Xamarin.Forms按钮单击颜色

时间:2018-02-18 13:56:11

标签: xamarin.forms uwp xamarin.uwp

我正在开发一个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;
        });
    }

然而,就个人而言,我并不是非常喜欢这种方法而且我想知道是否有人可以就如何更好地完成这项工作给我任何想法。先感谢您!

3 个答案:

答案 0 :(得分:3)

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>

答案 1 :(得分:3)

一种更自然,更清洁的方法是使用pitest

VisualStateManager

您可以在here中了解更多信息。

答案 2 :(得分:1)

这是最简单的解决方案,但当然不是很干净。

这里的问题是每个平台都以不同方式实现“压缩”状态,而Xamarin.Forms没有任何内置方式来处理这个问题。

如果是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"];
    }
}

其他平台也会有类似的解决方案,但您肯定必须以特定于平台的方式实现它们,可能使用自定义渲染器。

有关自定义渲染器see the documentation的详细信息。您还可以在Xamarin.Forms Labs存储库中找到一些灵感。