是否可以判断条目上的文本更改是来自代码还是来自 UI?
Is it possible to tell if the Text change on an entry was from code or from the UI?
我正在做一个 Xamarin
项目,我需要能够判断 Entry
视图中文本发生的更改是来自代码还是来自 UI,这在 Xamarin
中可能吗?或者是否有已知的解决方法来做到这一点。
我知道 OnTextChanged
事件,但这只是告诉您 Text
属性 已更改,并且您可以访问 [=15] 的旧值和新值=] 属性。它不区分文本更改的不同原因。
您可以使用 EntryRenderer 来检测按键事件,并使用该标志通过代码或 UI 来检测更改。
步骤如下:
- 使用新事件 OnTextChangeByUI 扩展您的输入控制
- 为两个平台编写自定义渲染
例如 android 会是这样的
public class ExtendedEntryRender : EntryRenderer
{
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (Control != null)
{
Control.KeyPress += ((Entry)Element).OnTextChangeByUI;
}
}
}
你可以从this thread中得到一些想法,检查条目是否聚焦以区分文本更改的不同原因:
public MainPage()
{
InitializeComponent();
myEntry.TextChanged += MyEntry_TextChanged;
}
private void MyEntry_TextChanged(object sender, TextChangedEventArgs e)
{
var entry = sender as Entry;
if (entry.IsFocused)
{
//change from UI
Console.WriteLine("change from UI");
}
else{
//change from code
Console.WriteLine("change from code");
}
}
更新:解决操作问题的更好方法:
您可以自己设置一个标志,告诉您的代码忽略该事件。例如:
private bool ignoreTextChanged;
private void textNazwa_TextCanged(object sender, EventArgs e)
{
if (ignoreTextChanged) return;
}
创建一个方法并使用它来设置文本,而不是仅仅调用 Text = "...";::
private void SetTextBoxText(TextBox box, string text)
{
ignoreTextChanged = true;
box.Text = text;
ignoreTextChanged = false;
}
参考:ignoreTextChanged
我正在做一个 Xamarin
项目,我需要能够判断 Entry
视图中文本发生的更改是来自代码还是来自 UI,这在 Xamarin
中可能吗?或者是否有已知的解决方法来做到这一点。
我知道 OnTextChanged
事件,但这只是告诉您 Text
属性 已更改,并且您可以访问 [=15] 的旧值和新值=] 属性。它不区分文本更改的不同原因。
您可以使用 EntryRenderer 来检测按键事件,并使用该标志通过代码或 UI 来检测更改。
步骤如下: - 使用新事件 OnTextChangeByUI 扩展您的输入控制 - 为两个平台编写自定义渲染
例如 android 会是这样的
public class ExtendedEntryRender : EntryRenderer
{
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (Control != null)
{
Control.KeyPress += ((Entry)Element).OnTextChangeByUI;
}
}
}
你可以从this thread中得到一些想法,检查条目是否聚焦以区分文本更改的不同原因:
public MainPage()
{
InitializeComponent();
myEntry.TextChanged += MyEntry_TextChanged;
}
private void MyEntry_TextChanged(object sender, TextChangedEventArgs e)
{
var entry = sender as Entry;
if (entry.IsFocused)
{
//change from UI
Console.WriteLine("change from UI");
}
else{
//change from code
Console.WriteLine("change from code");
}
}
更新:解决操作问题的更好方法:
您可以自己设置一个标志,告诉您的代码忽略该事件。例如:
private bool ignoreTextChanged;
private void textNazwa_TextCanged(object sender, EventArgs e)
{
if (ignoreTextChanged) return;
}
创建一个方法并使用它来设置文本,而不是仅仅调用 Text = "...";::
private void SetTextBoxText(TextBox box, string text)
{
ignoreTextChanged = true;
box.Text = text;
ignoreTextChanged = false;
}
参考:ignoreTextChanged