使用Xamarin Forms Entry的奇怪行为

时间:2016-04-15 11:51:47

标签: c# android xaml custom-controls xamarin-forms

我与Xamarin的冒险永远不会结束。

我在ListView中使用Entry控件时发现了一个问题。我的ContentPage中有一个带ViewCells的ListView。每个ViewCell都有一个CustomEntry(我已创建)。

如果用户将Entry留空,我想要控制。如果他将条目留空,我想留下条目的最后一个值。

对我来说最简单的解决方案是使用聚焦和非聚焦事件。但事件之间的行为非常奇怪。

public class CustomEntry : Entry
{
    private string oldValue;

    public CustomEntry()
    {
        this.oldValue = "1";            
        this.Focused += CustomEntry_Focused;
        this.Unfocused += CustomEntry_Unfocused;                        
    }

    private void CustomEntry_Focused(object sender, FocusEventArgs e)
    {
        if (this.Text != null)
        {
            this.oldValue = this.Text;
        }  
    }

    private void CustomEntry_Unfocused(object sender, FocusEventArgs e)
    {
        try
        {
            if (this.Text != null) { 
                //If the user leaves the field empty                
                if (this.Text.Trim().Equals(string.Empty))
                {
                    this.Text = this.oldValue;
                }
            }
        }
        catch (FormatException ex) { }
    }
}

MainPage.xaml的XAML代码:

  <Grid>
  <ListView x:Name="lst" BackgroundColor="Red" >
    <ListView.ItemTemplate>
      <DataTemplate>
        <ViewCell>            
          <StackLayout Orientation="Vertical" BackgroundColor="Yellow" >
            <local:CustomEntry BackgroundColor="Gray" FontSize="30" 
                 Keyboard="Numeric" Text="{Binding NumElements}" />
          </StackLayout>          
        </ViewCell>
      </DataTemplate>
    </ListView.ItemTemplate>
  </ListView>
</Grid>

最后是MainPage.xaml.cs:

public partial class MainPage : ContentPage
{
    private List<ItemModel> coleccio;

    public MainPage()
    {
        InitializeComponent();
        this.coleccio = new List<ItemModel>();
        this.coleccio.Add(new ItemModel("1")); //"1" value for NumElements property
        this.coleccio.Add(new ItemModel("2")); //"2" value for NumElements property
        this.coleccio.Add(new ItemModel("3")); //"3" value for NumElements property
        this.lst.ItemsSource = this.coleccio;
    }
}

重现问题:

  1. 首先选择CustomEntry
  2. 制表第二个CustomEntry
  3. 按键盘上的Del键
  4. 您将看到光标在CustomEntry的开头移动,但它不会删除文本。
  5. 调试跟踪是:

    1. 点按第一个CustomEntry
    2. 首先集中FireEntry事件
    3. 触发未聚焦的第一个CustomEntry事件
    4. 点按第二个CustomEntry
    5. 按键盘上的Del键
    6. Fires聚焦第二个CustomEntry事件
    7. 触发不专心的第二个CustomEntry事件
    8. 首先集中FireEntry事件
    9. 触发未聚焦的第一个CustomEntry事件
    10. Fires聚焦第二个CustomEntry事件
    11. 光标移动到CustomEntry的开头
    12. 我做错了什么?或者是关于Xamarin Entry控件的错误?

      我正在使用带有Android 6.0的Nexus 5设备进行调试。

0 个答案:

没有答案