我想在我的原生Android頁面控件中使用Xamarin.Form控件。在我的Android本地頁面中,是否有任何方法在我的Native Android Fragment或LinearLayout中加載Xamarin.Form頁面?如何使用Xamarin.Form控件和本機控件在同一頁
根據Xamarin這是可能的。但我無法找到如何實現這一點。
我想在我的原生Android頁面控件中使用Xamarin.Form控件。在我的Android本地頁面中,是否有任何方法在我的Native Android Fragment或LinearLayout中加載Xamarin.Form頁面?如何使用Xamarin.Form控件和本機控件在同一頁
根據Xamarin這是可能的。但我無法找到如何實現這一點。
有正在討論的幾件事情,我是如此的裸: -
的圖像片段,從我的理解: -
"Not only are Xamarin.Forms pages mixable with custom screens" ...
這就像@Stephane提到允許應用程序使用本機屏幕以及作爲Xamarin.Forms屏幕。每個平臺存根頁面可以在應用程序中的任何點處引入共享的Xamarin.Forms頁面。您不必使用Xamarin.Forms導航堆棧。
"but you can embed custom views built directly against Xamarin.IOS and Xamarin.Android into Xamarin.Forms pages."
這是@Sten提的是,在這裏,如果你創建平臺的具體ContentRenderers可以使任何類型的本地控制到現有Xamarin.Forms頁面,通過傳遞這個常見的查看給每個平臺渲染器。
所以,舉例來說,如果你有一個查看: -
public class MyView : ContentView
{
// Create some bindable properties here that can be used in your platform specific renderer,
// i.e. DisplayText etc.
}
您可以用上面的Xamarin.Forms頁面定義,然後創建平臺特定呈現那被稱爲以呈現內容。
從這些平臺的具體內容渲染器類,你可以在每個平臺上使用本地控制內。
例如在ContentRenderer,該事件OnElementChanged你可以做類似的以下的WindowsPhone: -
protected override void OnElementChanged(Xamarin.Forms.Platform.WinPhone.ElementChangedEventArgs<MyView> e)
{
base.onElementChanged(e);
...
System.Windows.Controls.TextBox objPlatformSpecificTextBox = new System.Windows.Controls.TextBox();
...
...
然而,什麼@Gulshan真的想要我相信是有本地頁面即中心階段與Xamarin.Forms正在呈現的內容轉化爲特定點,已經存在的本地頁面。
它有點顛倒,在思考,但是這仍然是可能的: -
要做到這一點,你需要刺激頁面代入一個臨時新的一頁。
例如在的WindowsPhone你會通過這樣做: -
PhoneApplicationPage objInnerPage_Temp = new PhoneApplicationPage();
UIElement objInnerContent = App.GetMainPage().ConvertPageToUIElement(objInnerPage_Temp);
的平臺特定的存根頁面上。
然後,您可以注入所呈現的內容爲機容器是合適的平臺上,即一個電網。
更新1: -
==========
雖然它很容易做到這一點的WindowsPhone的它似乎並不認爲這是可能的當嘗試類似的Android不幸的。
的的Android網頁製作非常鎖定,即你不能到私人領域獲得准入帆布和/或佈局,它在內部AndroidActivity使用。
如果這是可能的,那麼你可以重新使用,並採取呈現的內容和注入類似於對WindowsPhone的平臺的解決方案。
此外,平臺類被標記爲內部也,防止另一種方式來產生所呈現的內容。
人們希望我是從從片段實施產生活動到它的接近這一思想,這可能很好地工作 - 然而 - 這裏的問題是,在Xamarin.Forms實施正期望ActionBar可用,但它不是,並且如果爲空方案,它們不檢查如果它不可用,則允許繼續執行,因此它會引發異常,從而阻止頁面內容生成。
它並不因此看起來可能?除非他們AndroidActivity開拓佈局/帆布字段或解決動作條預期的問題。
是的,我知道自定義渲染器。但是使用渲染器,我想我只能在Xamarin.Forms頁面中使用本地控件。但我的要求完全相反。我想在一些Native控件中使用xamarin.Forms頁面。如果您查看已使用Xamarin.Forms頁面的Activity,則有一個方法「SetContentPage()」,它將XamarinForms頁面作爲輸入將其設置爲整個活動。我正在尋找的是,我可以在佈局或Fragement中設置我的XamarinForm頁面或控件的方式。或者,如果我可以將Xamarin.Forms.View轉換爲Android.Views.View。 – Gulshan 2014-09-08 04:05:20
我答案的最後部分確實突出了我相信你的真實意圖,並提出了一種方法。它可能通過** WindowsPhone **很容易,但是** Android **被鎖定。我已更新我的答案以反映新的發現(請參閱*更新1 *)。你在哪看到* SetContentPage()*爲* Android *,因爲我似乎無法找到這種方法? – Pete 2014-09-08 17:21:10
非常真實。我實際上在Android中尋找類似於Windows Phone中的「ConvertPageToUIElement」的方法。我已經提取了AndroidActivity的代碼。你說得對,平臺類被標記爲內部。所以現在可能是不可能的。 – Gulshan 2014-09-10 08:11:31
您可以創建一個由Xamarin.Forms
支持由Xamarin.Forms.Platform.Android.AndroidActivity
繼承了新Activity
和另一位在你的應用程序Xamarin.Android推出這一新的活動。
是的,我知道。問題是Xamarin.Forms.Platform.Android.AndroidActivity只有一個方法SetPage(Xamarin.Forms.Page頁面)全屏顯示Xamarin.Forms頁面。我想要的是,在我的Activity上,我有很多其他原生Android控件。在這些控件之間我想用我的一個Xamarin.Forms頁面或視圖。 – Gulshan 2014-09-05 12:16:00
您可能正在尋找自定義渲染器。
View
繼承(或其他合適的班級,說內容查看,如果你有孩子的意見等)ViewRenderer
[assembly: ExportRenderer (typeof(MyView), typeof(MyViewRenderer))]
base.SetNativeView(ctl)
這裏CTL是你的本地控制的實例,以在Xamarin's Forums看看Xamarin's guide
另一個資源。
看過這個問題並實現我自己的邊框後,我會說VisualElementRenderer<TElement>
是一個更好的渲染器。如果您使用所有您需要做的就是重寫OnElementChanged並執行NativeView.Add(customUIView)
並從MyView實例複製屬性。爲了處理這些屬性的動態變化覆蓋OnElementPropertyChanged和更新customUIView實例
是的,我知道自定義渲染器。但是使用渲染器,我想我只能在Xamarin.Forms頁面中使用本地控件。但我的要求完全相反。我想在一些Native控件中使用xamarin.Forms頁面。如果您查看已使用Xamarin.Forms頁面的Activity,則有一個方法「SetContentPage()」,它將XamarinForms頁面作爲輸入將其設置爲整個活動。我正在尋找的是,我可以在佈局或Fragement中設置我的XamarinForm頁面或控件的方式。或者,如果我可以將Xamarin.Forms.View轉換爲Android.Views.View。 – Gulshan 2014-09-08 04:09:03
如何在自定義渲染器中保存本地控件的Forms頁面以及可以將其視圖作爲本地子視圖移動的NativeChild自定義渲染器?我不認爲這是完全可以在一個完全原生的應用程序中實現的 – 2014-09-08 13:53:56
它可能在** WindowsPhone **中,但是** Android **太鎖定了它的出現。我目前還沒有在** iOS **上測試過這個。 – Pete 2014-09-08 18:25:27
如已經討論的是關於的iOS(與.CreateViewController())和WP(.ConvertPageToUIElement())相當簡單。
但在的Android沒有失去一切太:你可以使用.GetView()擴展方法從http://www.arturdr.ru/android/xamarin-forms-i-slozhnosti-integratsii-v-android-prilozheniya/
下面是有關如何使用該方法在Android的AlertDialog包裹Xamarin.Forms頁的例子: https://github.com/OlexaLe/XFPageAsAndroidDialog
Xamarin修改了它的網站,所以上面的圖片已經過時了。隨着Xamarin.Forms庫的發展,似乎混合Xamarin.Forms和特定於平臺的本地視圖變得更加困難。我不會推薦這樣做。高級用戶當然可以嘗試這種方式,但是我與其他開發人員的對話表明這會產生大量額外的工作和開銷。最好的路徑是使用Xamarin.Forms專門爲您的觀點,或使用特定於平臺的本機視圖。
下面是Xamarin的Xamarin.Forms頁(拍攝於2015年5月13日拍攝)截圖:
有一種方法破解這在任何人的情況下仍然需要。非常多的黑客攻擊,涉及反編譯和複製Xamarin.Forms框架中的幾個類,是由我的同事開發的,並在他的博客文章中描述過(http://www.arturdr.ru/android/xamarin-forms- I-slozhnosti-integratsii-v-機器人-prilozheniya /)。不幸的是,這篇文章是用俄語編寫的,但非常適合谷歌翻譯,並且您不需要閱讀任何內容來複制代碼或下載示例(請參閱下面的代碼.zip)。 – 2015-01-28 08:38:00
一個需要注意的就是始終使用.dispose()視圖,從受到攻擊的inflater中獲得 - 內存管理通常由Xamarin.Forms完成,並且不在外部工作。 – 2015-01-28 08:41:38
這仍然不可能嗎? – Curiousity 2017-07-07 04:03:28