如果更改输入字段值,如何在支持代码中触发方法?

时间:2017-08-28 13:23:29

标签: xamarin xamarin.forms

我有一个应用程序,其中使用Xamarin Entry字段来输入数字。这是我编码的内容:

<Entry 
   Keyboard="Numeric" 
   x:Name="dBtnPts"
   VerticalOptions="Center" HorizontalOptions="End" HorizontalTextAlignment="End"
   TextColor="Gray" Completed="dBtnPtsChanged"
   WidthRequest="55"/>



void dBtnPtsChanged(object sender, EventArgs e)
{
   App.DB.UpdateStringSetting(Settings.ABtnPoints, ((Entry)sender).Text);
}

当我在dBtnPtsChanged方法中放置一个断点时,它永远不会被调用。

有人能指出我可能出错的地方。

3 个答案:

答案 0 :(得分:2)

只有在文本更新完成后,才能扩展Entry以调用事件;例如:

public class CustomEntry : Entry
{
    public event EventHandler TextUpdated;

    private bool _isDirty = false;
    public CustomEntry()
    {
        Completed += CustomEntry_Completed;
        Unfocused += CustomEntry_Unfocused;
        TextChanged += CustomEntry_TextChanged;
    }

    private void CustomEntry_TextChanged(object sender, TextChangedEventArgs e)
    {
        _isDirty = true;
    }

    private void CustomEntry_Unfocused(object sender, FocusEventArgs e)
    {
        if (_isDirty)
        {
            _isDirty = false;
            TextUpdated?.Invoke(this, EventArgs.Empty);
        }
    }

    private void CustomEntry_Completed(object sender, EventArgs e)
    {
        if (_isDirty)
        {
            _isDirty = false;
            TextUpdated?.Invoke(this, EventArgs.Empty);
        }
    }
}

示例用法如下:

<local:CustomEntry 
  Keyboard="Numeric" 
  x:Name="dBtnPts"
  VerticalOptions="Center" HorizontalOptions="End" 
  HorizontalTextAlignment="End"
  TextColor="Gray" TextUpdated="dBtnPtsChanged"
  WidthRequest="55"/>

答案 1 :(得分:1)

只有在用户按下返回按钮时才会调用completed事件。例如,iOS软键盘上的蓝色完成按钮。

您可能希望查看TextChanged事件。

答案 2 :(得分:1)

单击完成按钮时会出现

completed

当我们点击键盘上的Enter时,它可以在PC上的触发器上触发,但是,当在真实设备上运行时,没有像完成返回的按钮在Xamarin.forms的键盘中。

作为临时解决方案,我们可以将tap事件添加到条目的父布局中。

XMAL中的代码:

<StackLayout >
    <StackLayout.GestureRecognizers>
        <TapGestureRecognizer Tapped = "Handle_Tapped" />
    </StackLayout.GestureRecognizers>

    <Entry Keyboard="Numeric" 
           x:Name="dBtnPts"
           VerticalOptions="Center" 
           HorizontalOptions="End"
           HorizontalTextAlignment="End"
           TextColor="Gray" 
           Completed = "Handle_Completed"
           WidthRequest="55"/>

</StackLayout>

代码背后:

void Handle_Tapped(object sender, System.EventArgs e)
{
    App.DB.UpdateStringSetting(Settings.ABtnPoints, ((Entry)dBtnPts).Text);
}

更新

正如SharadaGururaj所建议的那样,更好更简单的方法是分配Entry的事件Unfocused,并在其中运行db。当然我们可以在SharadaGururaj的答案中采用解决方案,它更具可控性和灵活性。