gpt4 book ai didi

xamarin - 尝试在 Xamarin Forms 中创建自定义选择器

转载 作者:行者123 更新时间:2023-12-02 21:30:19 25 4
gpt4 key购买 nike

我正在尝试创建一个包含 3 个组件的自定义选择器。我按照 Xamarin 网站 here 上的教程进行操作。我让控件正常工作,除非我单击选择器上的“完成”按钮(这是默认的“完成”按钮)。我收到以下异常:

System.InvalidCastException:无法将类型“myproj.iOS.MyPickerModel”的对象转换为类型“Xamarin.Forms.Platform.iOS.PickerRenderer+PickerSource”。

这是我的代码:

在共享项目中:

public class MyPicker: Picker {}

在 iOS 项目中:

[assembly: ExportRenderer(typeof(MyPicker), typeof(MyPickerRenderer))]

public class MyPickerRenderer: PickerRenderer
{
// Override the OnElementChanged method so we can tweak this renderer post-initial setup
protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
{
base.OnElementChanged(e);

if (Control != null)
{
var picker = (UIPickerView)this.Control.InputView;
picker.BackgroundColor = UIColor.White;
picker.Model = new MyPickerModel();
}

和模型:

public class MyPickerModel : UIPickerViewModel
{
private string[] array1 = new string [] {
"1","2","3","4"
};
private string[] array2 = new string [] {
"1a","2a","3a","4a"
};

private string[] array3 = new string [] {
"a","b","c","d"
};

public override nint GetComponentCount (UIPickerView pickerView)
{
return 3;
}

public override nint GetRowsInComponent (UIPickerView pickerView, nint component)
{
// Returns
switch (component) {
case 0: return array1.Length;
case 1: return array2.Length;
case 2: return array3.Length;
default:break;
}
return 0;
}

public override string GetTitle (UIPickerView pickerView, nint row, nint component)
{
// Returns
switch (component)
{
case 0: return array1[row];
case 1: return array2[row];
case 2: return array3[row];
default: break;
}
return null;
}

public override nfloat GetComponentWidth (UIPickerView pickerView, nint component)
{
switch (component)
{
case 0: return 100.0f;
case 1: return 100.0f;
case 2: return 100.0f;
default: break;
}

return 0;
}

public override nfloat GetRowHeight (UIPickerView pickerView, nint component)
{
return 40f;
}
}

最后是我的页面:

public class MyPage : ContentPage
{
public MyPage()
{
MyPicker picker = new MyPicker
{
Title = "Color",
VerticalOptions = LayoutOptions.CenterAndExpand
};

picker.SelectedIndexChanged += (sender, args) =>
{

};

var mainLayout = new StackLayout
{
Orientation = StackOrientation.Vertical,
Children =
{
picker

}
};


// Accomodate iPhone status bar.
this.Padding = new Thickness(0, Device.OnPlatform(20, 0, 0), 0, 0);
this.BackgroundImage = "background.png";

// Build the page.
this.Content = mainLayout;
}
}

我不明白为什么它试图将 MyPickerModel 转换为 PickerRenderer+PickerSource

谢谢!

最佳答案

你就快到了...只需创建一个 UIPickerView 的新实例,为其分配自定义模型 (MyPickerModel),然后分配 UIPickerView Control.InputView。渲染器中的 OnElementChanged 将如下所示:

protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
{
base.OnElementChanged(e);

if (Control != null)
{
var myPickerModel = new MyPickerModel();
var myPickerView = new UIPickerView
{
Model = myPickerModel
};
//Assign your picker view
Control.InputView = myPickerView;

//You can also create an event in your model to react on user actions like e.g. "SelectedValueChanged"...
myPickerModel.SelectedValueChanged += (sender, eventArgs) =>
{
//...to set the selected value as title of the picker element
e.NewElement.Title = myPickerModel.SelectedValue;
};
}
}

关于xamarin - 尝试在 Xamarin Forms 中创建自定义选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29313597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com