Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin 当输入字段值更改时,如何在支持代码中触发方法?_Xamarin_Xamarin.forms - Fatal编程技术网

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

Xamarin 当输入字段值更改时,如何在支持代码中触发方法?,xamarin,xamarin.forms,Xamarin,Xamarin.forms,我有一个应用程序,其中Xamarin输入字段用于允许输入数字。以下是我编写的代码: <Entry Keyboard="Numeric" x:Name="dBtnPts" VerticalOptions="Center" HorizontalOptions="End" HorizontalTextAlignment="End" TextColor="Gray" Completed="dBtnPtsChanged" WidthRequest="55"/>

我有一个应用程序,其中Xamarin输入字段用于允许输入数字。以下是我编写的代码:

<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);
}

void dBtnPtsChanged(对象发送方,事件参数e)
{
App.DB.UpdateStringSetting(Settings.ABtnPoints,((条目)sender.Text);
}
当我在dBtnPtsChanged方法中放置断点时,它从未被调用


有人能告诉我哪里可能出错。

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


您可能想查看
TextChanged
事件。

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


您可能想查看
TextChanged
事件。

completed
在单击“完成”按钮时发生

当我们点击键盘上的
Enter
时,它可以在PC上的sumilator上触发,但是,当在真实设备上运行时,Xamarin.forms中的键盘上没有类似DoneReturn的按钮

因此,作为临时解决方案,我们可以将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>
更新:
正如SharadaGururaj所建议的,一种更好、更简单的方法是分配条目的事件
未聚焦
,并在其中操作db。当然,我们可以采用Sharadaguraj回答中的解决方案,它更加可控和灵活。

completed
在单击“完成”按钮时出现

当我们点击键盘上的
Enter
时,它可以在PC上的sumilator上触发,但是,当在真实设备上运行时,Xamarin.forms中的键盘上没有类似DoneReturn的按钮

因此,作为临时解决方案,我们可以将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>
更新:
正如SharadaGururaj所建议的,一种更好、更简单的方法是分配条目的事件
未聚焦
,并在其中操作db。当然,我们可以采用Sharadaguraj答案中的解决方案,它更加可控和灵活。

您可以扩展
条目
以仅在文本更新完成时调用事件;例如:

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"/>

您可以扩展
条目
以仅在文本更新完成时调用事件;例如:

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"/>


对于数字输入,我没有看到“完成”按钮出现。我可以清除屏幕的唯一方法是单击屏幕的另一部分,然后我看到新条目停留在窗口中。TextChanged的问题是每次按下数字都会触发它。因此,如果我输入123作为数字,它将被触发(并更新数据库)三次。我不确定,但你试过按键盘上的实际返回键吗?无论如何,我认为这对你来说不是一个解决办法。您可能正在寻找焦点丢失时触发的事件。您将需要一个自定义的渲染器。尽管这也很危险。如果用户在没有失去焦点的情况下离开屏幕该怎么办?每个数字的触发可以通过执行一些超时来防止。如果在某个时间段内按下另一个数字,则取消触发DB更新的超时。对于数字输入,我看不到出现“完成”按钮。我可以清除屏幕的唯一方法是单击屏幕的另一部分,然后我看到新条目停留在窗口中。TextChanged的问题是每次按下数字都会触发它。因此,如果我输入123作为数字,它将被触发(并更新数据库)三次。我不确定,但你试过按键盘上的实际返回键吗?无论如何,我认为这对你来说不是一个解决办法。您可能正在寻找焦点丢失时触发的事件。您将需要一个自定义的渲染器。尽管这也很危险。如果用户在没有失去焦点的情况下离开屏幕该怎么办?每个数字的触发可以通过执行一些超时来防止。如果在某个时间段内按下另一个数字,则取消触发DB更新的超时。可能我遗漏了什么-但您不认为每次点击页面时都会调用
句柄
,而不管
条目是否有任何更改吗?此外,如果在同一页面上有多个
条目
控件,这将是一个更大的问题。否?@Sharadaguraj是的,你是对的,我们每次点击页面时它都会调用,但正如我上面所说的,设备上永远不会触发事件
已完成
,因此无需扩展条目,只需分配事件
未聚焦
,并在其中执行db操作。同意,仅仅处理
未聚焦的
事件可能有效;但是
Unfocused
事件本身无法传达文本是否已更改,并且最终仍会导致不必要的DB操作。不管怎样,我只是想和你分享我的评估。希望有帮助!也许我遗漏了什么-但是你不认为每次点击页面时都会调用
句柄_Tapped
,不管
条目是否有任何更改吗?此外,如果在同一页面上有多个
条目
控件,这将是一个更大的问题。否?@Sharadaguraj是的,你是对的,我们每次点击页面时它都会调用,但正如我上面所说的,设备上永远不会触发事件
已完成
,因此无需扩展条目,只需分配事件
未聚焦
,并在其中执行db操作。同意,仅仅处理
未聚焦的
事件可能有效;但是
没有焦点
e