首页 > 解决方案 > Xamarin Forms 尝试制作内容按钮

问题描述

我正在尝试仅使用共享代码(没有本机项目代码,因此没有渲染器也没有效果)来做一个内容按钮。为此,我创建了一个带有经典按钮的 ContentView,如下所示:(为简单起见,我只添加了一个标签作为内容)

<Grid>
    <Button x:Name="button"
            Released="button_Released"/>

    <Label x:Name="text"
           VerticalOptions="Center"
           HorizontalOptions="Center"
           InputTransparent="True"/>
</Grid>

我还创建了一个这样的文本可绑定属性:

public static readonly BindableProperty TextProperty = BindableProperty.Create(nameof(Text), typeof(string), typeof(ContentButton), propertyChanged: TextChanged);

public string Text
{
    get => (string)GetValue(TextProperty);
    set => SetValue(TextProperty, value);
}

private static void TextChanged(object sender, object oldValue, object newValue)
{
    var button = sender as ContentButton;
    button.text.Text = newValue as string;
}

接下来,我使用我的 ContentButton 如下:

<controls:ContentButton Text="Some text"/>

按钮显示正确。但是当我点击它时,它似乎从我的标签前面经过,从那一刻起,文本不再可见。我发现解决此问题的唯一解决方法是将此代码放在按钮的已释放事件中:

await Task.Delay(200);
text.IsVisible = false;
text.IsVisible = true;

但显然这不是一个合适的解决方案。

此问题出现在带有 Xamarin Forms 4.8.0.1687 的 Android 9 上

提前致谢

标签: androidxamarinbuttonxamarin.formsxamarin.android

解决方案


我根据@Cherry BU 的评论结束了这个问题。我在按钮上放了一个透明的背景颜色,并在下面添加了一个 BoxView 来管理真实的背景颜色和可能的 CornerRadius。因为我使用 Material Visual,所以我还创建了一个自定义渲染器来移除默认按钮阴影,如下所示:

class ExtendedMaterialButtonRenderer : MaterialButtonRenderer
{
    public ExtendedMaterialButtonRenderer(Context context)
        : base(context)
    {

    }

    protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e)
    {
        base.OnElementChanged(e);

        if (e.NewElement != null)
        {
            Control.StateListAnimator = null;
        }
    }
}

我还在按钮的 Pressed 和 Released 事件上的 ContentButton 控件上添加了缩放动画。

我将此问题标记为已回答,但如果有更好的解决方案可以提供,我仍对其他解决方案持开放态度


推荐阅读