这是一种情况:
带有条目的XAML有一个链接到textchanged事件的方法。
在将UI组件(本例中的网格)封装在类中以提高代码的可维护性之后,我发现了下一个问题:
我无法将该方法的事件链接到网格上的特定按钮。问题是我正在调用这个方法(它有一个DisplayActionSheet函数,不能在一个简单的类中调用)。它应该来自于任何类型的Page的类或应用程序类)。
因此,我的第一种方法是将按钮封装在另一个类中。我在页面中创建了这个对象(按钮),链接到方法的事件(也在页面中编码)。现在我可以了,在Page的类中),并将这个对象传递给网格对象构造函数的一个新实例(另一个类)。最后,我将网格(与按钮正确地链接到它)添加到页面中。
恐怕这不是个好主意。我假设这可能是在“内存泄漏问题”(与删除内存中的对象有关的问题,以及那些在组成它们的不同类之间具有引用的问题,不是吗?),只是在不同类(网格、按钮和页面)之间创建引用。
经过研究,解决方案看起来像委托这个方法的事件。
但我无法做到这一点,这很容易(当你知道的时候),但这些例子并不是由我的案例准备的(或者我找不到)。你能帮个忙吗?
我发布了代码的想法,它是在ListView内部的Button上实现的,在网格中(稍微复杂一点,但我想简化它)。
//This code is called in CarouselPage
// ..............
//ButtonEstadoTarea is type Button
ButtonEstadoTarea bet = new ButtonEstadoTarea();
//OnStartClicked is allocated is this CarouselPage
//
bet.Clicked += this.OnStartClicked;
ListViewIntervencion lvi = new ListViewIntervencion();
lvi.ItemTapped += this.OnItemTapped;
lvi.ItemsSource = intervencion.Interv;
GridCabeceraIntervencion gci = new GridCabeceraIntervencion(intervencion, lvi);
var intervencionContent = new ContentPage
{
Content = gci,
};
this.Children.Add(intervencionContent);
async void OnStartClicked(object sender, EventArgs args)
{
var action = await DisplayActionSheet("Procesar Tarea", null, "Cancel", "Iniciar", "Pausar", "Bloquear", "Terminar");
// MORE MAGIC...
}谢谢你们。
发布于 2016-09-15 09:12:47
对于所有移动平台(ios、android、xamarin)来说,使用弱引用来存储(页面、活动、UIViewcontroller)是很好的做法。可以实现对页面的引用,如下所示:
WeakReference<Page> _pageReference;
public Page Page{
get {
Page _page = null;
_pageReference.TryGetTarget(out _page);
return _page;
}
set{
_pageReference = new WeakReference<Page>(value);
}
}在访问页面属性时,不要忘记检查null。这样您就不会有内存泄漏。要了解更多关于弱引用的信息,请阅读:https://msdn.microsoft.com/en-us/library/gg712738(v=vs.110).aspx
作为一种良好的实践,我建议使用MVVM方法使用FreshMvvm,绑定按钮命令建模,并使用CurrentPage参数显示操作表。
https://stackoverflow.com/questions/39507042
复制相似问题