我正在使用 xamarin.forms 并在屏幕上显示可绑定(bind)选择器。
我正在使用以下代码更新 Picker contol 的初始文本。
public class MyCustomBindablePickerRenderer :PickerRenderer
{
// Override the OnElementChanged method so we can tweak this renderer post-initial setup
protected override void OnElementChanged (ElementChangedEventArgs<Picker> e)
{
base.OnElementChanged (e);
//Background = A Android.Graphics.Color.Rgb (0, 0, 0);
if (Control != null) {
// do whatever you want to the textField here!
Control.SetBackgroundColor(global::Android.Graphics.Color.Rgb(241,241,241));
//Control.ShadowRadius = 2;
//Control.SetCursorVisible = true;
var label = (TextView)Control; // for example
Typeface font = Typeface.CreateFromAsset (Forms.Context.Assets, "avenir-book.ttf");
label.Typeface = font;
label.TextSize = CustomFonts.EntryFontSize;
label.SetHintTextColor (global::Android.Graphics.Color.Rgb(162,162,162));
label.SetTextColor (global::Android.Graphics.Color.Rgb(162,162,162));
}
}
}
现在,我想增加单击文本时出现的弹出窗口的大小。
我用谷歌搜索并找到了事件 OnWindowFocusChanged,但该事件在弹出窗口出现后触发,因此我无法访问弹出窗口的高度。
当我单击选择器控件的文本框时,有人可以建议事件触发吗?
以及如何更改弹出窗口的高度?
最佳答案
您需要创建一个 SpinnerAdapter
,以便您可以自定义每个单元格。覆盖 GetDropDownView
方法,如下所示:
[assembly: ExportRenderer(typeof(UIPicker), typeof(UIPickerRenderer))]
namespace SampleApp.Android
{
public class UIPickerRenderer: ViewRenderer<UIPicker, Spinner>
{
bool initialized = false;
Spinner picker;
static int selectedIndex=-1;
protected override void OnElementChanged (ElementChangedEventArgs<UIPicker> e)
{
base.OnElementChanged (e);
if(e.OldElement == null)
{
Element.SelectedIndexChanged += NotifyVM;
selectedIndex = Element.SelectedIndex;
this.picker = new Spinner(Forms.Context, SpinnerMode.Dropdown);
var adapter = new SpinnerAdapter(Forms.Context, Android.Resource.Layout.SimpleSpinnerItem,Element.Items);
picker.Adapter = adapter;
picker.SetSelection(selectedIndex);
picker.ItemSelected += picker_ItemSelected;
this.SetNativeControl(picker);
Element.SelectedIndexChanged += (object s, EventArgs args) => {
if (picker.SelectedItemPosition != Element.SelectedIndex)
picker.SetSelection(Element.SelectedIndex);
};
}
}
private void picker_ItemSelected(object sender, AdapterView.ItemSelectedEventArgs e)
{
if(! initialized)
{
initialized = true;
return;
}
Element.SelectedIndex = picker.SelectedItemPosition;
var g = picker.SelectedItemPosition;
}
private async void NotifyVM(object sender, EventArgs e)
{
if (selectedIndex == Element.SelectedIndex)
return;
selectedIndex = Element.SelectedIndex;
if (Element.ParentView.BindingContext != null && Element.IsVisible && Element.ShouldUpdateServices)
{
//Do your binding things
}
}
internal class SpinnerAdapter : ArrayAdapter<string>
{
public SpinnerAdapter(Android.Content.Context context, int id, System.Collections.Generic.IList<string> items)
: base(context, id, items)
{
}
public override Android.Views.View GetDropDownView(int position, Android.Views.View convertView, Android.Views.ViewGroup parent)
{
convertView = base.GetDropDownView(position, convertView, parent);
convertView.Visibility = Android.Views.ViewStates.Visible;
FormsViewGroup.LayoutParams p = convertView.LayoutParameters;
p.Height = 60; //adjusting cell height
p.Width = 300; //Adjusting cell width
convertView.LayoutParameters = p;
return convertView;
}
}
}
}
关于android - Xamarin.Forms 中选取器的高度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32994044/