Используя общие проекты, вы можете определить собственные представления в XAML, а затем получить к ним доступ в коде (это в основном является обязательным требованием, поскольку собственные элементы управления Android | iOS не привязываются напрямую, а в большинстве есть вызовы методов для настройки функций, которыебудет недоступен через XAML (т. е. VideoView имеет метод .SetVideoURI
, который не имеет свойства оболочки на основе Xamarin, поэтому для воспроизведения видео необходимо выполнить этот метод).
XAML:
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:androidWidget="clr-namespace:Android.Widget;assembly=Mono.Android;targetPlatform=Android"
xmlns:androidGraphics="clr-namespace:Android.Graphics;assembly=Mono.Android;targetPlatform=Android"
xmlns:androidContext="clr-namespace:Forms40Shared.Droid;assembly=Forms40Shared.Android;targetPlatform=Android"
x:Class="Forms40Shared.NativeEmbedPage" >
<ContentPage.Content>
<StackLayout Margin="20">
<androidWidget:TextView x:Arguments="{x:Static androidContext:MainActivity.Instance}" Text="Welcome to Forms!" TextSize="24" View.HorizontalOptions="Center" >
<androidWidget:TextView.Typeface>
<androidGraphics:Typeface x:FactoryMethod="Create">
<x:Arguments>
<x:String>cursive</x:String>
<androidGraphics:TypefaceStyle>Normal</androidGraphics:TypefaceStyle>
</x:Arguments>
</androidGraphics:Typeface>
</androidWidget:TextView.Typeface>
</androidWidget:TextView>
<ContentView x:Name="contentView" HorizontalOptions="FillAndExpand" VerticalOptions="Center" HeightRequest="200" >
<androidWidget:VideoView x:Arguments="{x:Static androidContext:MainActivity.Instance}" />
</ContentView>
</StackLayout>
</ContentPage.Content>
</ContentPage>
Примечание : Не включайте XamlCompilation
на глобальном уровне сборки или на страницах XAML, которые содержат собственные представления, так как это не будет работать (и при компиляции или при ошибках нетво время выполнения, представления просто не отображаются, поскольку они были удалены) ...
MainActivity
[Activity(Label ~~~~
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
internal static MainActivity Instance { get; private set; }
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
Instance = this;
~~~
}
Код сзади:
#if __ANDROID__
var videoView = (contentView as NativeViewWrapper).NativeView as VideoView;
videoView.SetVideoURI(Android.Net.Uri.Parse($"android.resource://{Android.App.Application.Context.PackageName}/raw/fireplace"));
videoView.Start();
#elif __IOS__
~~~
#endif
Выход: