Xamarin 当输入字段值更改时,如何在支持代码中触发方法?
我有一个应用程序,其中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"/>
<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中的键盘上没有类似Done或Return的按钮
因此,作为临时解决方案,我们可以将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中的键盘上没有类似Done或Return的按钮
因此,作为临时解决方案,我们可以将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