Xamarin.Forms自定义控件内嵌套Entry设置焦点及取值问题咨询
Xamarin.Forms 自定义控件问题解决方案
问题1:自定义ContentView内嵌套的Entry设置焦点不生效
失效原因
你在控件构造函数中调用Focus()方法时,自定义控件还未被加载到页面的视觉树中,内部Entry也未完成渲染,因此焦点设置操作不会生效。
解决方案
可以选择以下任意一种方案实现:
- 方案1:在自定义控件生命周期中触发
重写PackageCode控件的OnParentSet方法,等控件关联父容器后再设置焦点:protected override void OnParentSet() { base.OnParentSet(); // 切换到UI线程执行焦点设置 Dispatcher.Dispatch(() => txtPackageCode.Focus()); } - 方案2:由父页面控制触发时机
首先在PackageCode类中暴露公开的焦点设置方法:
给Main.xaml中引用的自定义控件添加名称标识:public void FocusInnerEntry() { txtPackageCode.Focus(); }
在MainPage的<local:PackageCode x:Name="PackageCodeControl"></local:PackageCode>OnAppearing方法中调用该方法:protected override void OnAppearing() { base.OnAppearing(); PackageCodeControl.FocusInnerEntry(); }
问题2:父页面提取自定义控件内Entry的输入值
可以根据使用场景选择以下方案:
- 方案1:简单直接取值
在PackageCode类中添加公开属性直接返回Entry的输入内容:
父页面需要取值时直接调用即可:public string PackageCodeText => txtPackageCode.Text;// 比如按钮点击事件中取值 private void Button_Clicked(object sender, EventArgs e) { var inputValue = PackageCodeControl.PackageCodeText; } - 方案2:支持MVVM双向绑定
如果你需要配合MVVM模式使用,可以添加可绑定属性:
首先在PackageCode类中定义可绑定属性:
然后修改PackageCode.xaml中Entry的绑定:public static readonly BindableProperty PackageCodeTextProperty = BindableProperty.Create( nameof(PackageCodeText), typeof(string), typeof(PackageCode), default(string), BindingMode.TwoWay); public string PackageCodeText { get => (string)GetValue(PackageCodeTextProperty); set => SetValue(PackageCodeTextProperty, value); }
之后父页面既可以直接读取<Entry x:Name="txtPackageCode" Text="{Binding PackageCodeText, Source={x:Reference this}}" Completed="txtPackageCode_Completed"> </Entry>PackageCodeControl.PackageCodeText取值,也可以直接在XAML中绑定该属性到ViewModel的对应字段。
内容的提问来源于stack exchange,提问作者Brocks404
相关产品推荐
相关产品推荐

