【问题标题】:Xamarin Forms trying to make content buttonXamarin Forms 尝试制作内容按钮
【发布时间】:2020-11-20 17:01:38
【问题描述】:

我正在尝试仅使用共享代码(没有本机项目代码,因此没有渲染器也没有效果)来制作内容按钮。 为此,我创建了一个带有经典按钮的 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 上

提前致谢

【问题讨论】:

  • 点击Button时好像Button覆盖了Label,为什么不在Button中添加Text呢?
  • 嗨,因为我已经为示例进行了简化,但我的最终想法是放置文本以外的内容。所以我不能使用 Button 的 Text 属性。而且我还想保持简单,并利用 Button 控件已经存在的所有逻辑,尤其是视觉逻辑。所以我不需要通过渲染器或效果器
  • 我找到了一种解决方法,将按钮背景更改为透明,然后您始终可以看到文字。

标签: android xamarin button xamarin.forms xamarin.android


【解决方案1】:

我根据@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;
        }
    }
}

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

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

【讨论】:

    【解决方案2】:

    您的问题与propertyChanged 事件有关,当正确的属性为BindableObject 时,您将对象作为发送者传递。

    这是正确的方法:

    public static readonly BindableProperty TextProperty = BindableProperty.Create(
        nameof(Text),
        typeof(string),
        typeof(ContentButton),
        propertyChanged: TextChanged
    );
    
    private static void TextChanged(BindableObject bindable, object oldValue, object newValue)
    {
        var contentButton = (ContentButton)bindable;
    
        contentButton.text.Text = (string)newValue;
    }
    

    另外,当您使用 BindableProperties 时,请始终记住用户直接转换,因为如果出现问题,它会抛出异常,使用 as 运算符进行转换可能会设置 null 并最终抛出 NullReferenceException

    【讨论】:

    • 嗨@FabriBertani,请回复。我现在不能尝试,但似乎不是问题。我的文字显示正确,但当我点击按钮时它消失了。另外,感谢您对演员表的建议
    • 我尝试根据您的建议进行更改,但无法解决我的问题。
    猜你喜欢
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 2019-01-16
    • 2018-11-10
    • 2020-02-24
    相关资源
    最近更新 更多