网格构造函数不是';t在添加到ListView时调用

本文关键字:添加 ListView 调用 构造函数 网格 | 更新日期: 2023-09-27 18:25:48

我正在开发一个Windows手机应用程序,我有这样的逻辑:

我有一个聊天视图,ListView包含视频或短信。我的视频消息是实现我的IPlayableMessage接口的自定义控件:

public class VideoMessage : Grid , IPlayableMessage
{
    public VideoMessage()
    {
        this.Loaded += Loaded;
    }
    private void Loaded(object sender, RoutedEventArgs e)
    {
        MessagePlayer.Sub(this);
    }
    public void Play()
    {
        //Some logic for video play
    }
    public Player MessagePlayer
    {
        get { return (Player)GetValue(MessagePlayerProperty); }
        set { SetValue(MessagePlayerProperty, value); }
    }
    public static readonly DependencyProperty MessagePlayerProperty =
        DependencyProperty.Register("MessagePlayer", typeof(Player), typeof(VideoMessage), null);
}

这是我的界面:

public interface IPlayableMessage
{
    void Play(Uri uri = null);
}

在构造函数中,我用这个参数调用Sub方法,它将在将来播放我的视频消息。这很好,但是,如果我向ListView添加一条新消息(我在视图中看到它),控件构造函数就不会被调用,这样我的对象就不会将其自身传递给Player。

为什么在向ListView添加新元素时不调用构造函数和Loaded事件?

当我上下滚动ListView并执行分页时,调用think的构造函数。。。。

  • 过了一段时间,我将注册转移到:

    protected override Size ArrangeOverride(Size finalSize)

它减少了未注册网格的数量,但每个对象都会调用多次,而且它也不能覆盖100%的项目。

如有任何帮助,我们将不胜感激。:)

网格构造函数不是';t在添加到ListView时调用

您是否尝试将回调添加到MessagePlayer属性并在那里处理操作?

public static readonly DependencyProperty MessagePlayerProperty = DependencyProperty.Register(
        "MessagePlayer", typeof (Player), typeof (VideoMessage), new PropertyMetadata(default(Player), PropertyChangedCallback));
private static void PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
       var control = d as VideoMessage;
       (e.NewValue as Player).Sub(control);
}