Xamarin Forms 拯救UWP开发者

mye****412 UID.74390
2017-08-22 发表

本帖最后由 myeyes1412 于 2017-8-22 18:17 编辑

Xamarin Forms 拯救UWP开发者!{:6_224:} 分分钟移植UWP程序到Android和iOS,还在犹豫什么!赶紧脱坑!

***附件停止解析***

几乎不用修改VM M的代码就能将原UWP程序移植到Android和iOS,下面是小米手机的应用截图

***附件停止解析******附件停止解析***

欢迎加入Xamarin Q-Q群 分享技术 :230099477


下面是UWP截图:

***附件停止解析***

敬告:
为防止不可控的内容风险,本站已关闭新用户注册,新贴的发表及评论;
你现在看到的内容只是互联网用户曾经发表的言论快照,仅用于老用户留存纪念,且仅与科技行业相关,全部内容不代表本站观点及立场;
本站重新开放前已针对包括用户隐私、版权保护、信息安全、国家政策在内的各种互联网法律法规要求,执行了隐患内容的自查、屏蔽和删除;
本站目前所属个人主体,未有任何盈利安排与计划,且与原WFUN.COM所属公司不存在任何关联关系;
如果本帖内容或者相关资源侵犯到您的合法权益,或者您认为存在问题,那么请您务必点此举报或投诉!
全部回复:
704528373 UID.2856014
2017-08-22 使用 Lumia 950 XL 回复

然而安卓苹果有官方正版 不需要uwp

Mr****in UID.2850453
2017-08-22 使用 Lumia 950 XL 回复

能不能反过来?{:4_161:}

vbfool UID.352791
2017-08-22 回复

Quote***链接停止解析***
然而安卓苹果有官方正版 不需要uwp


你要知道这东西是干嘛的才好。
这东西简单来说,就是开发者写一遍,就能出iOS安卓UWP3个app。

海****旗 UID.2915324
2017-08-22 回复

辣鸡App,专门怼你

麦****徒 UID.944863
2017-08-22 回复

厉害了,一次出三平台的。

TonyDeng UID.2870126
2017-08-22 使用 Lumia 950 回复

其他平台不装UWP支持库可以运行这样写出来的程序?

mye****412 UID.74390
2017-08-22 回复

Quote***链接停止解析***
其他平台不装UWP支持库可以运行这样写出来的程序?


当然可以

AFAN-World UID.2879093
2017-08-23 使用 Lumia 640 XL 回复

xf对于xaml来说确实不错,但ui就233了 xamarin框架里面也有不少其他的技术。 顺便问一句,你的“赶紧脱坑”是什么意思?我就问问

西来圣境 UID.1005572
2017-08-23 使用 Lumia 950 回复

哈哈,你真6

mye****412 UID.74390
2017-08-23 回复

Quote***链接停止解析***
xf对于xaml来说确实不错,但ui就233了
xamarin框架里面也有不少其他的技术。
顺便问一句,你的“赶紧脱坑”是 ...


做UWP,注定是个死

AFAN-World UID.2879093
2017-08-23 回复

Quotemyeyes1412 发表于 2017-8-23 12:47
做UWP,注定是个死


这倒是实话。。。。。。。 唉好吧我果然是靠情怀支撑住的

tmp00000 UID.995403
2017-08-23 回复

我这边比较有前途的 UWP 项目 两个用了 Win2D, 一个用了 Windows 打印 API, 三个用了大量 Composition API, 两个有 PInvoke, 一个用了相机控件, 四个用了一堆 StoryBoard 和 VisualStateManager。 说移植就移植?

tmp00000 UID.995403
2017-08-23 回复

PInvoke 那个基本绕不过去。某些逻辑我为了实现 Microsoft.VisualBasic.Strings.StrConv(String,VbStrConv,Int32) 写了 PInvoke 去调用 LcMapStringEx。这个函数 Xamarin 上面没有, 因为它是 Windows 独占的。

tmp00000 UID.995403
2017-08-23 回复

Win2D 和 打印 也是绕不过去的。Win2D 用来写视频滤镜和位图生成逻辑,在 OpenGL 没有等效的方法实现视频滤镜。打印更糟糕, 找遍安卓开发教程都没找到一个正常的实现方式。

tmp00000 UID.995403
2017-08-23 回复

还有 Speech API 在其它平台也没找到非常有效的实现方式。Windows 上总是稳定的,安卓跟打印一样要跟插件通信,写出来基本上不能用。

tmp00000 UID.995403
2017-08-23 回复

Xamarin 就连一个基本的 FileOpenPicker 都没有。安卓上用法非常**,居然采用 OpenFileAndContinue 的逻辑。一个在 Windows Phone 8 时代的写法,安卓开发者仍然在忍受,简直不能想象。打开一个指定拓展名的文件还要先去查 MimeType, 找不到了还得改清单,太麻烦了。

qa****ak UID.1104291
2017-08-24 回复

Xamarin 到底用过没有你? Xamarin上编译UWP简直就是一坨屎. Xamarin的Bugzilla上都不知道为了UWP各种奇葩错误和内存泄漏问题,提交了不知多少个BUG. 有些都超过1年了, 人家都懒得修改. 直接在Github上提交代码又迟迟不通过. UWP连Xamarin都不重视, 还有个屁用!

tmp00000 UID.995403
2017-08-24 使用 Lumia 950 XL 回复

Quoteqakmak 发表于 2017-8-24 04:47
Xamarin 到底用过没有你? Xamarin上编译UWP简直就是一坨屎. Xamarin的Bugzilla上都不知道为了UWP各种奇葩 ...


还有嵌入的资源不能加载的问题。UWP 上 Debug 编译好好的,Release 取出来是空的。

tmp00000 UID.995403
2017-08-24 使用 Lumia 950 XL 回复

Quoteqakmak 发表于 2017-8-24 04:47
Xamarin 到底用过没有你? Xamarin上编译UWP简直就是一坨屎. Xamarin的Bugzilla上都不知道为了UWP各种奇葩 ...


他们非常轻视用户反馈。反馈区排了好几年第二或第一的 VB我工具支持到现在都没开工。实在想不通一个配套的调试器,一个xaml.g.vb代码生成器,几个项目模板有什么好磨蹭的。一个人几个星期就能写完的东西,拖了好几年。

重头儿再来 UID.356529
2017-08-24 回复

Quote***链接停止解析***
我这边比较有前途的 UWP 项目 两个用了 Win2D, 一个用了 Windows 打印 API, 三个用了大量 Composition API, ...


这些项目都是你开发的吗?现在商店里有吗?开发用了多长时间?谢谢

mye****412 UID.74390
2017-08-24 回复

UWP注定是个死,Xamarin是让你别做UWP了,赶紧脱坑。至于那些UWP上的功能,用Xamarin.Native可以重写,干嘛要移植!

mye****412 UID.74390
2017-08-24 回复

Xamarin forms可以方便移植UWP的项目,我可没说特定平台API的功能,想移植花时间重写!

mye****412 UID.74390
2017-08-24 回复

本帖最后由 myeyes1412 于 2017-8-24 10:44 编辑

Quote***链接停止解析***
PInvoke 那个基本绕不过去。某些逻辑我为了实现 Microsoft.VisualBasic.Strings.StrConv(String,VbStrConv, ...


你不会用 DependencyService.Get<Interface>().Method() 去调用不同平台的接口实现啊!用过Xamarin吗。可以对不同平台写特定代码的。
选择新建项目的适合不需要选择PCL还可以选择SharedProject,调用不同平台代码用宏,更灵活

mye****412 UID.74390
2017-08-24 回复

某些人连Xamarin怎么用都没搞懂,就瞎评论。真实悲哀!

vbfool UID.352791
2017-08-24 回复

晚上试试看你们纠结的地方到底问题是啥。

我还只是拿Xamarin.Android做了项目,Xamarin.Forms还没搞过。

tmp00000 UID.995403
2017-08-24 使用 Lumia 950 XL 回复

Quote重头儿再来 发表于 2017-8-24 09:26
这些项目都是你开发的吗?现在商店里有吗?开发用了多长时间?谢谢


是我自己写的。时间最长的持续一年多。大多数仍然在我自己的电脑上。因为完成它们需要解决复杂的算法问题和 Release Build 下的 Bug。

tmp00000 UID.995403
2017-08-24 使用 Lumia 950 XL 回复

Quotemyeyes1412 发表于 2017-8-24 10:43
你不会用 DependencyService.Get().Method() 去调用不同平台的接口实现啊!用过Xamarin吗。可以对不同平 ...


那这个 StrConv 函数在安卓怎么实现?Xamarin 根本没有 vb 运行库,也就不可能提供与 LcMapStringEx 等效的函数。

tmp00000 UID.995403
2017-08-24 使用 Lumia 950 XL 回复

Quotemyeyes1412 发表于 2017-8-24 10:43
你不会用 DependencyService.Get().Method() 去调用不同平台的接口实现啊!用过Xamarin吗。可以对不同平 ...


不选 pcl 或 .net standard 不行的。我这边UWP项目加起来有2万行 VB 代码,但是 Xamarin 不支持 VB。

tmp00000 UID.995403
2017-08-24 使用 Lumia 950 XL 回复

Quotemyeyes1412 发表于 2017-8-24 10:40
Xamarin forms可以方便移植UWP的项目,我可没说特定平台API的功能,想移植花时间重写! ...


我的代码对平台依赖非常重。甚至某些程序因为用了 ILGenerator 和 CodeDom 只做出了 WPF 版本。

tmp00000 UID.995403
2017-08-24 使用 Lumia 950 XL 回复

Quotemyeyes1412 发表于 2017-8-24 10:43 你不会用 DependencyService.Get().Method() 去调用不同平台的接口实现啊!用过Xamarin吗。可以对不同平 ...
那个 DependencyService 我自己实现了更好用的。可移植类库里面直接写一个 VB 模块,把平台相关的东西定义成属性和事件。在各个平台的 C# 项目读写那个 VB 模块里的属性,或者订阅里面的事件,同样可以写平台特定的代码。 现在的问题是 iOS 不支持动态编译,安卓不能打印并且视频滤镜 API 在 Xamarin 没有,整个 Xamarin 没有实现 LcMapStringEx 这样的 Windows 专用 API,用其它的库又没有等效实现。

tmp00000 UID.995403
2017-08-24 使用 Lumia 950 XL 回复

Quotevbfool 发表于 2017-8-24 18:34
晚上试试看你们纠结的地方到底问题是啥。

我还只是拿Xamarin.Android做了项目,Xamarin.Forms还没搞过。


Xamarin 看起来很美好,实际深入使用能踩到不少坑。尤其是苹果的平台,一段正常的使用泛型类型的代码在 Android 和 UWP 都没问题,就 iOS 出稀奇古怪的错误。

重头儿再来 UID.356529
2017-08-24 回复

Quote***链接停止解析***
是我自己写的。时间最长的持续一年多。大多数仍然在我自己的电脑上。因为完成它们需要解决复杂的算法问题 ...


谢谢回复,您是专职从事uwp开发吗?另外,win2d使用起来方便吗?

tmp00000 UID.995403
2017-08-24 回复

Quote重头儿再来 发表于 2017-8-24 21:00
谢谢回复,您是专职从事uwp开发吗?另外,win2d使用起来方便吗?


不是专职。Win2D 比 SharpDX 好用。

vbfool UID.352791
2017-08-24 回复

Quote***链接停止解析***
Xamarin 就连一个基本的 FileOpenPicker 都没有。安卓上用法非常**,居然采用 OpenFileAndContinue 的逻辑 ...


文件选择器这事,刚才随便搜了一下,发现,iOS根本就没这概念,人家连给你选择文件的功能都没有……
安卓那个属于打开一个新页面,然后在原来页面接收值,其实比起WP8时代来说还是好一点的,WP8是在app类里接收返回值的,安卓好歹是在当前页面,不过通过requestcode来区分,实在是有些说不过去,这只能让使用者自己提供requestcode了,还好这个参数提供了UWP也还能接受。

视频滤镜那个,我看是没指望了,MF这玩意儿是Windows的杀手级功能,其它平台原生哪有这么完整的多媒体处理架构,只能自己配合FFMPEG封装了。
这一类的功能,你都只能把它们大块的封装成各自对应库的控件,也就是zxing.mobile的行事方式。

至于StrConv那个,类似的开源库,估计真未必会有,Xamarin原生是不可能会提供的,只能是找找Linux下有没有解决方案了。

tmp00000 UID.995403
2017-08-24 回复

本帖最后由 tmp00000 于 2017-8-24 23:01 编辑

Quotevbfool 发表于 2017-8-24 22:00
文件选择器这事,刚才随便搜了一下,发现,iOS根本就没这概念,人家连给你选择文件的功能都没有……
安卓 ...


Request Code 我用了递增的方式。一开始是 0, 每用一次之后加1。
这样可以封装出传入 MimeType, 传出任务的那种文件选择器类。
[mw_shl_code=vbnet,true]Imports System.IO
Imports Android.App
Imports Android.Content

Public Class AndroidFilePicker
Private Shared s_requestCode As Integer
Private Shared s_activityReturned As Boolean = True
Private Shared s_lastFileStream As Stream

Public Async Function PickAndOpenStreamForReadAsync(Optional mimeType As String = "*/*") As Task(Of Stream)
If String.IsNullOrEmpty(mimeType) Then
Throw New ArgumentNullException(NameOf(mimeType))
End If
If Not s_activityReturned Then
Throw New InvalidOperationException("上一次请求还没有返回。")
End If
Dim intent As New Intent(Intent.ActionGetContent)
intent.SetType(mimeType)
intent.AddCategory(Intent.CategoryOpenable)
Try
s_activityReturned = False
CurrentActivity.StartActivityForResult(Intent.CreateChooser(intent, "选择一个文件。"), s_requestCode)
Do Until s_activityReturned
Await Task.Delay(500)
Loop
Return s_lastFileStream
Catch ex As ActivityNotFoundException
Return Nothing
End Try
End Function

Public Shared Sub OnActivityResult(requestCode%, resultCode As Result, data As Intent)
If requestCode = s_requestCode Then
s_requestCode += 1
s_lastFileStream = Nothing
If resultCode = Android.App.Result.Ok Then
Dim uri = data.Data
s_lastFileStream = CurrentActivity.ContentResolver.OpenInputStream(uri)
End If
s_activityReturned = True
End If
End Sub
End Class
[/mw_shl_code]
[mw_shl_code=csharp,true] protected override void OnCreate(Bundle bundle)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;

base.OnCreate(bundle);

global::Xamarin.Forms.Forms.Init(this, bundle);

PlatformInfo.CurrentActivity = this;
LoadApplication(new App());
}

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
AndroidFilePicker.OnActivityResult(requestCode, resultCode, data);
base.OnActivityResult(requestCode, resultCode, data);
}[/mw_shl_code]

vbfool UID.352791
2017-08-24 回复

Quote***链接停止解析***
Request Code 我用了递增的方式。一开始是 0, 每用一次之后加1。
这样可以封装出传入 MimeType, 传出任务 ...


这玩意儿我推荐统一管理,你可不能保证只有文件选择器会去调用,反正是池化大概是最好的。

tmp00000 UID.995403
2017-08-24 回复

Quotevbfool 发表于 2017-8-24 23:01
这玩意儿我推荐统一管理,你可不能保证只有文件选择器会去调用,反正是池化大概是最好的。 ...


嗯,或许需要一些位运算区分这是文件选取器的 Request Code 还是其它的。加一些标志位就行。完全使用过的 Request Code 可以被释放掉,可以重用。

本站使用Golang构建,点击此处申请开源鄂ICP备18029942号-4联系站长投诉/举报