You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin.Forms中自定义VideoView渲染器OnElementChanged方法未执行的问题求助

Xamarin.Forms中自定义VideoView渲染器OnElementChanged方法未执行的问题求助

我最近做了个带VideoView的简单Xamarin.Forms应用,切换应用内的标签页时总会崩溃,报错提示“View is Null”。后来找了个自定义渲染器的解决方案,但把它加到项目里后遇到了新问题——自定义渲染器里的OnElementChanged方法完全没执行,连我加的Console.WriteLine("This will never run");都没输出,我肯定是对自定义渲染器的工作原理理解错了,想请教下各位大佬哪里出问题了。

先贴我的自定义渲染器代码:

using Android.Content;
using LibVLCSharp.Shared;
using LibVLCSharp.Forms.Platforms.Android;
using LibVLCSharp.Forms.Shared;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using System;

[assembly: ExportRenderer(typeof(VideoView), typeof(CustomVideoViewRenderer))]

namespace LibVLCSharp.Forms.Platforms.Android
{
    /// <summary>
    /// Xamarin.Forms custom renderer for the Android VideoView
    /// </summary>
    public class CustomVideoViewRenderer : ViewRenderer<LibVLCSharp.Forms.Shared.VideoView, LibVLCSharp.Platforms.Android.VideoView>
    {
        /// <summary>
        /// Main constructor (empty)
        /// </summary>
        /// <param name="context">Android context</param>
        public CustomVideoViewRenderer(Context context) : base(context)
        {
        }

        /// <summary>
        /// Native control management during lifecycle events
        /// </summary>
        /// <param name="e">lifecycle event</param>
        protected override void OnElementChanged(ElementChangedEventArgs<VideoView> e)
        {
            Console.WriteLine("This will never run");
            base.OnElementChanged(e);

            if (e.NewElement != null)
            {
                if (Control == null)
                {
                    SetNativeControl(new LibVLCSharp.Platforms.Android.VideoView(Context!));
                    e.NewElement.MediaPlayerChanging += OnMediaPlayerChanging;

                    if (Control!.MediaPlayer != e.NewElement.MediaPlayer)
                    {
                        OnMediaPlayerChanging(this, new MediaPlayerChangingEventArgs(Control!.MediaPlayer, e.NewElement.MediaPlayer));
                    }
                }
            }

            if (e.OldElement != null)
            {
                e.OldElement.MediaPlayerChanging -= OnMediaPlayerChanging;
            }
        }

        private void OnMediaPlayerChanging(object? sender, MediaPlayerChangingEventArgs e)
        {
            Control.MediaPlayer = e.NewMediaPlayer;
            Control.TriggerLayoutChangeListener();
        }
    }
}

再贴XAML里的使用代码:

<shared:VideoView x:Name="somevid" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Grid.Column="1"></shared:VideoView>

我原本以为自定义渲染器只要继承目标控件对应的渲染器基类,重写OnElementChanged方法,再加上ExportRenderer特性指定要替换的控件和自定义渲染器就会自动生效,但现在连方法都没触发,实在摸不着头脑,求各位大佬指点!

备注:内容来源于stack exchange,提问作者Jeffrey van Dijk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 14:23:03