当前位置: 首页 > news >正文

西安网站建设设计的好公司/磁力链

西安网站建设设计的好公司,磁力链,安徽建设监管网站,java如何做租房网网站这两天发现项目占用内存过高,突然就象检查一下各个页面的回收是否正常,最后定位到Silverlight Toolkit中的ContextMenu控件使得我的一个页面在离开的时候无法被正常的回收,这里记录一下定位的过程: 首先,重载页面的OnR…

这两天发现项目占用内存过高,突然就象检查一下各个页面的回收是否正常,最后定位到Silverlight Toolkit中的ContextMenu控件使得我的一个页面在离开的时候无法被正常的回收,这里记录一下定位的过程:

首先,重载页面的OnRemovedFromJournal函数,我们知道当以GoBack的方式回退到回退栈中的前一个页面时,这个函数会被首先执行,然后才是OnNavigatedFrom函数。

1 protected override void OnRemovedFromJournal(JournalEntryRemovedEventArgs e)
2 {
3 this.DataContext = null;
4
5 base.OnRemovedFromJournal(e);
6 }

在OnRemovedFromJournal函数中把页面绑定的DataContext置为null,防止和页面绑定的ViewModel导致页面无法回收。

然后,给页面加上析构函数,好让我知道在离开页面时,是否页面是否会被析构。

~MyTestPage()
{
System.Diagnostics.Debug.WriteLine("Finalizing " + this.GetType().FullName);
}

就是在析构函数中加上个输出语句,便于观察。

再然后就是加上断点,调试项目,跳转到MyTestPage,然后按BackKey进行回退,预料之中首先执行OnRemovedFromJournal函数,但是输出控制台并没有输出那句“Finalizing”,显然页面没有被销毁,它被阻碍了。

可以上网或者在MSDN上查,什么样的情况会导致页面无法回收。我了解的三个基本情况是:

  1. 页面的DataContext为置空,也就是说页面和ViewModel还关联着,这会导致页面无法回收。
  2. 页面中的部分控件会导致页面无法回收(原因有很多,后面会提到)。
  3. 页面中注册的一些事件,没有退订也会导致页面无法回收。

估摸着我碰到的情况应该在2.3中产生,我先尝试着能不能把情况3给排除掉。怎么排除呢,我把xaml中和cs中注册的事件在OnNavigatedFrom函数中全部退订一边,然后在调试程序,和上面一样的步骤看能不能在输出控制台中看见那句“Finalizing ”,然后答案是没有看见,很好,情况3就被排除了。

其实我也认为页面中的控件导致页面无法得到回收最为可能,情况3已经排除了,我就开始把xaml文件中的控件一个个的试(注释、调试、查看结果),好在页面的布局不是很复杂啊,最着定位到这样一个DataTemplate:

 1 <coding4fun:Tile Background="{Binding TileBackgroundBrush}" Margin="2,0,0,2" Click="Tile_Click" Loaded="Tile_Loaded">
2 <toolkit:ContextMenuService.ContextMenu>
3 <toolkit:ContextMenu IsZoomEnabled="False" Foreground="{StaticResource S_White}"
4 Background="{StaticResource PhoneAccentBrush}"
5 BorderBrush="{StaticResource PhoneAccentBrush}">
6 <toolkit:MenuItem Visibility="{Binding , Converter={StaticResource}}"
7 Header="{Binding, Source={StaticResource LocalizedStrings}}"
8 Command="{Binding}" Foreground="White" />
9 <toolkit:MenuItem Visibility="{Binding, Converter={StaticResource}}"
10 Header="{Binding, Source={StaticResource LocalizedStrings}}"
11 Command="{Binding}" Foreground="White" />
12 <toolkit:MenuItem Header="{Binding , Source={StaticResource LocalizedStrings}}"
13 Command="{Binding }" Foreground="White" />
14 </toolkit:ContextMenu>
15 </toolkit:ContextMenuService.ContextMenu>
16 </coding4fun:Tile>

再然后我就把这块代码给注释掉:

<toolkit:ContextMenuService.ContextMenu>
<toolkit:ContextMenu IsZoomEnabled="False" Foreground="{StaticResource S_White}"
Background="{StaticResource PhoneAccentBrush}"
BorderBrush="{StaticResource PhoneAccentBrush}">
<toolkit:MenuItem Visibility="{Binding , Converter={StaticResource}}"
Header="{Binding, Source={StaticResource LocalizedStrings}}"
Command="{Binding}" Foreground="White" />
<toolkit:MenuItem Visibility="{Binding, Converter={StaticResource}}"
Header="{Binding, Source={StaticResource LocalizedStrings}}"
Command="{Binding}" Foreground="White" />
<toolkit:MenuItem Header="{Binding , Source={StaticResource LocalizedStrings}}"
Command="{Binding }" Foreground="White" />
</toolkit:ContextMenu>
</toolkit:ContextMenuService.ContextMenu>

断点、调试,~MyTestPage函数执行了,也就是说页面被析构了,不过在这儿就能断定是ContextMenu的原因么?在MenuItem中还绑定了Command,Command对象虽然好用,不过也可能是元凶,先把它给删掉看是不是Command的原因,结果~MyTestPage木有执行,不是Command的原因,不过到这儿突然发现这个担心其实是多余的,我不是在OnRemovedFromJournal函数中把页面的DataContext置为null了么。

那结果就指向了toolkit:ContextMenu ,是它导致我的页面无法被析构和回收,但是我又不能把它删掉,因为他承载了我需要的功能。没办法只能旁敲侧击,抄小道消灭这个问题,我的解决方案是:

<coding4fun:Tile Background="{Binding TileBackgroundBrush}" Margin="2,0,0,2" Click="Tile_Click" Loaded="Tile_Loaded">

在Tile中注册个Tile_Loaded事件,把所有的Tile维护到一个List中,在页面的OnNavigatedFrom函数中这样写一下,就能把Tile中的ContextMenu给消除掉:

foreach (var item in Tiles)//移除所有的MenuItem否则该页面无法回收
{
var menuItem = ContextMenuService.GetContextMenu(item);
ContextMenuService.SetContextMenu(item,null);
}

再次断点、调试,这回~MyTestPage函数执行了,页面被析构了。

 

@me http://weibo.com/tianyutingxy






转载于:https://www.cnblogs.com/tianyutingxy/archive/2011/11/05/2237084.html

http://www.lbrq.cn/news/1443313.html

相关文章:

  • 网站背景图片怎么做/百度无锡营销中心
  • 做国际交友网站翻译/整合营销经典案例
  • phpmysql网站开发案例/网络营销的三种方式
  • 国外做黄漫的网站/地推一手项目平台
  • 做社交网站开发/怎样无货源开网店
  • 网站上传好了如何做定向/搜索引擎优化方法有哪些
  • 给网站写教案做课件一节课多少钱/公司网站设计要多少钱
  • 如何防止php网站被挂马/厦门seo
  • 已有网站如何做直播/黑帽seo寄生虫
  • 做海报找背景图有哪些网站/全球搜索
  • php发布post到wordpress/百度seo优
  • 政府网站手机版建设方案/推广一单500
  • 做网站劫持多少钱/做个网站
  • 网页微博如何退出登录/网站的优化公司
  • 广州市地铁线路最新全图/在线seo超级外链工具
  • crm系统是干什么的/廊坊seo排名外包
  • 网上商城项目设计方案/郑州seo网站有优化
  • 动易网站首页制作/最全的搜索引擎
  • 建电影网站教程/百度统计登录
  • 企业网站建设遵循的原则/网店运营流程步骤
  • 廊坊建站模板系统/广告推广方案
  • 在线考试类网站怎么做/百度网盘官网下载
  • 海淀网站建设联系方式/关键词排名优化流程
  • 做网站办公照片/百度视频推广怎么收费
  • 网站建设关键字/网站seo课程
  • 网站首页滚动图片用dw怎么做/国外独立网站如何建站
  • 服务型网站有哪些/友情链接网自动收录
  • 西安做网站的/百度官方网页
  • 网站宣传页/上海百度关键词优化公司
  • 河北斯皮尔网站建设/舆情网站直接打开
  • lesson36:MySQL从入门到精通:全面掌握数据库操作与核心原理
  • Python初学者笔记第二十四期 -- (面向对象编程)
  • 【Node.js从 0 到 1:入门实战与项目驱动】2.1 安装 Node.js 与 npm(Windows/macOS/Linux 系统的安装步骤)
  • 稠密检索:基于神经嵌入的高效语义搜索范式
  • redis(2)-java客户端使用(IDEA基于springboot)
  • 学习观察和行动:机器人操作中任务-觉察的视图规划