如何在在Windows store应用闪退的时候自动生成dump

    当开发者在测试或者用户使用Windows store 应用的时候,我们可能希望Windows store程序能够在发生异常的时候自动生成dump文件以便于以后分析。在写桌面应用的时候,我们可以通过调用API MiniDumpWriteDump来实现。但是这个API在Windows store应用中是不被支持的。那么有没有其他办法来生成dump了呢? 其实以前的Windows Error Reporting机制针对Windows store应用还是有效的,所以你可以通过改写注册表的办法让应用程序自动生成dump,具体步骤如下: 1)      运行REGEDIT.EXE 找到 “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps”. 如果该键不存在的话则新建LocalDumps 键,。 2)      创建一个与你的Windows store应用进程同名的子键,比如说MyApp.exe。 3)      在子键中创建一个名为DumpFolder,类型为REG_EXPAND_SZ的值,设置它的值为你需要生成dump的目录(保证要存在),比如说C:\Dumps。 4)      在同一个子键中创建一个名为DumpCount,类型为REG_DWORD的值,设置他的值为5 (生成dump的最大数目)。 5)      在同一个子键中创建一个名为DumpType,类型为REG_DWORD的值,设置他的值为2 (full dump)。 其结果如图所示:   这样在你的Windows store应用闪退的时候就可以自动得到full dump了。你可以将上述注册表键值放在一个注册表文件中,当用户有闪退的情况是,让用户倒入该注册表文件,然后将生成的dump文件上传。  


在MVVM架构下实现将基于ListViewBase控件的显示项滚动到可视范围内(Windows 8.1)

当我们在开发Windows Store应用的时候,一个常见的场景是,你需要在两个页面之间相互跳转,一个是项目列表页面,一个是详细信息页面。当你点击项目列表页面的某一个项目时,就会跳转到相应的详细信息页面,然后通过回退按钮,你就可以回到原来的项目列表页面。当项目列表的内容很多的时候,回退按钮就会把你带到第一个项目对应的视图上,这当然不是我们希望的,我们希望当页面会退的时候,项目列表页面还是能够显示刚才点击的那个项目。 这个问题很容易解决,Windows Store应用提供了两个API来实现这个功能:ScrollIntoView和MakeVisible。当基于LivstViewBase的控件,比如ListView, GridView单独使用的时候,那么就使用ScrollIntoView这个函数。如果基于ListViewBase的控件作为一个视图放在SemanticZoom控件中的时候,那么就使用MakeVisible函数。但是,这两个函数不是在什么时候调用都能够生效的,必须要等ListViewBase控件已经完成了布局以后才能够调用生效。在这里,比较保险的做法是在Page.Loaded事件处理函数中调用ScrollIntoView;在ListviewBase.Loaded事件处理函数中调用MakeVisible。这样的话,我们就需要将这些调用放在xaml的后台代码中,对于一个遵循MVVM设计模式的程序,这是需要尽量避免的。所以,这里我决定实现一个Behavior来完成将显示项滚动到可视范围内这个功能。 Behavior是Windows 8.1新支持的功能,为了实现Behavior,你需要定义一个实现了IBehavior接口的类,这个接口要求我们实现一个属性和两个函数: public interface IBehavior {     DependencyObject AssociatedObject { get; }     void Attach(DependencyObject associatedObject);     void Detach(); } AssociateObject属性很容易实现,它的值可以通过Attach函数得到,我们只需要实现标准的属性代码就可以了: private DependencyObject _associatedObject;         public DependencyObject AssociatedObject         {             get             {                 return _associatedObject;             }         } 为了实现Behavior的功能,这里我也定义了一个依赖属性LastFocusedItem,它用来设置最后得到焦点的那项,也就是我们需要滚动到显示范围内的那一项: private static readonly DependencyProperty LastFocusedItemProperty = DependencyProperty.Register(“LastFocusedItem”, typeof(object),…


Scroll into View for ListViewBase controls when using MVVM in Windows 8.1 Store apps

When you implement a windows store app which can navigate between the item list page and the item detail page, you may hope that the view can go to the last focused item when the page navigates from the item detail page to the item list page. Thus the end users don’t need to scroll the view…

1

一个由不合理布局导致Windows 8.1 store应用失去响应的例子

         如果我们忽视了Windows store应用的界面设计,通常你会得到一个糟糕的用户界面,然而你有没有想过在某种情况下却会导致应用程序失去响应甚至闪退,这里就有这样一个活生生的例子。          这个例子首先要从Windows 8 store应用的应用视图(application view)说起,Windows 8 Store应用有三种视图状态:full screen(程序填满整个屏幕), snapped(应用程序只占据了整个屏幕的一小部分),Fill(应用程序占据了snapped宽度剩余的区域)。所以在windows 8上设计Windows Store应用时,开发者通常会设计三种布局对应于这三种不同的视图。但是在Windows 8.1上取消了这三种视图状态,取而代之的是,应用商店程序可以在一定范围内任意调节应用的宽度,这个范围指的是应用程序有一个最小宽度设定,这通常是500个像素,您的Windows store应用至少要达到这个宽度,或者剩下空间至少有这个宽度。这样就给开发人员带来了挑战,我们不可能使用固定的布局,而是需要不同的宽度动态调整。如果不作调整的话,那么就有可能会发生下面这个问题。         为了重现这个问题,我们可以在Visual Studio  2013上创建一个基于Hub应用模板的Windows store应用,然后在ItemPage添加如下XAML代码: <Grid Grid.Row=”1″ x:Name=”contentRegion”> <Grid.ColumnDefinitions>      <ColumnDefinition x:Name=”firstColumn” Width=”600″/>      <ColumnDefinition x:Name=”secondColumn” Width=”*”/> </Grid.ColumnDefinitions>      <ScrollViewer Grid.Column=”1″ >           <TextBlock Margin=”40″ Text=”{Binding Content}” Style=”{StaticResource BaseTextBlockStyle}” />      </ScrollViewer> </Grid>         当你点击HubPage页面的项目时,应用就会跳转到ItemPage页面。在这个ItemPage页面会显示相应的文字。在全屏状态下,应用工作得很好很流畅。可是,如果你把应用的宽度调整到很小,比如500个像素,这时显示ItemPage页面时就会长时间失去响应,在一些极端的情况下甚至会应为失去响应时间过长而闪退。          实际上这个问题是由于Grid的第二列宽度太小而导致的。在这个页面里,你已经设置了第一个列的宽度为600,而出问题的时候应用的总宽度也不过500,这样留给第二列中的ScrollView里的TextBlock的宽度几乎就没有了。而在第二列中的这个TextBlock通常会有以下属性设置:            …


Improper UI layout cause windows store app busy hang in Windows 8.1

  Windows 8 store applications only need to maintain three application views: Full screen mode, snapped mode and filled mode. So the developers generally prepare three sets of UI layout. But in Windows 8.1, you can change the application width freely only if it’s large than the minimum width which is generally 500. It may…


[Fixed in the latest version]A memory leak issue in Media extensions sample (Windows 8.1)

Media extensions sample demonstrates how to write and use media foundation filter in windows store applications. But you may find that the destructor of CMPEG1Source isn’t called when video playback is stopped which causes a native memory leak issue. Actually this issue is caused by the unmatched reference count of the COM objects. When the…

1

Incremental update item data for ListViewBase controls in windows 8.1

Generally Listview and Gridview which based on ListViewBase class should process a large amount of data items. It may heavily impact the performance if we can’t handle it properly. We can utilize UI virtualization to solve parts of memory and performance issues. But we will still encounter the problem that the data items can’t be…


Windows 8.1下ListView和GridView的数据分步显示

通常基于ListViewBase类的ListView和GridView需要处理大量的数据项(date Item),如果处理不好的话,会对应用的性能产生严重影响。虽然UI virtualization帮助解决了显示大量Item时内存占用过多及初始化时间过长的问题,在用户进行平移操作的时候,如果每一个Item的内容比较复杂,仍然会出现Item加载过慢的问题,就好像幻灯片一样,每个Item一个一个的显示出来,使应用的流畅度大打折扣。为了进一步提高用户体验,Windows 8.1下为这两个控件的显示效果作了优化,主要表现在两个方面: 为基于ListViewBase类的控件的每个Item都添加了占位符,也就是说,当显示Item的时候,在数据没有加载完成之前,系统首先为每个Item都自动显示一个缺省的图标。您可以使用ShowsScrollingPlaceholders属性来启用或禁止这项功能。  为基于ListViewBase类的控件添加了一个新的事件(Event):ContainerContentChanging。这个Event会在加载的内容被改变的时候触发。您可以在这个Event的事件处理函数中加入代码来优化对Item的显示。 第一种方法的实现很简单,这里就不多说了,这里我就第二种方法做进一步的介绍。 ContainerContentChanging会在每一个Item被加载的时候触发,这时候你可以选择分步加载Item中的内容。比如说,我的GridView中有三个加载项: <DataTemplate x:Key=”ItemDataTemplate”>     <Grid>      <Grid.RowDefinitions           <RowDefinition Height=”*”/>           <RowDefinition Height=”160″/>           <RowDefinition Height=”*”/>       </Grid.RowDefinitions>       <TextBlock x:Name=”tbkName” Text=”{Binding Name}” />       <Image x:Name=”imgPhoto” Source=”{Binding ImageUri}” Grid.Row=”1″ />        <TextBlock x:Name=”tbkTakenTime” Text=”{Binding TakenTime}”Grid.Row=”2″/>     </Grid> </DataTemplate> 那么我们可以设定第一步先加载Name,第二步再加载TakenTime,最后一步才加载Photo。如果ShowsScrollingPlaceholders设为True的话,那么实际上在第一步之前系统会自动为每个Item加上一个灰色的占位符。如果你觉得这个占位符不好看,你也可以选择将这个属性设为False,然后手动的在ContainerContentChanging的第一步中加入占位符。那么这时候加载项就变为四个: <Image x:Name=”imgPlaceholder” Grid.RowSpan=”3″ Source=”ms-appx:///Placeholder.jpg” /> <TextBlock x:Name=”tbkName” Text=”{Binding Name}”…

4

在Windows 8.1 store 应用中使用Behavior

Behavior一直是广大Windows store应用开发者翘首以盼的一个功能。在理想的情况下,开发人员负责开发提供功能的Behavior库,设计人员就可以通过在XAML中选择相应的Behavior来完成需要的功能,这大大降低了UI代码和应用逻辑代码之间的耦合度。可是在Windows 8 store应用开发中却没有提供对Behavior的支持。虽然说有开发者采用附加依赖属性(Attached dependency property)给出了实现办法,例如Joost van Schaik的winrtbehaviors,但这毕竟不是一个正式的解决方案。幸运的是,最新发布的Blend for Visual Studio 2013 已经提供了为Windows 8.1 Store应用开发添加Behavior的功能,现在我们既可以方便的使用内置的behavior,也可以为您的应用添加自定义的behavior了。本文主要就Blend for Visual Studio 2013中内置Behavior和Action作一个简单的介绍。 所谓Behavior,就是用于附加在某个控件上的行为。既然是行为么,通常就有时间(什么时候触发),地点(在什么对象上触发),事件(有什么功能)。所以设定一个Behavior也无外乎确定这几个方面。 根据触发的时机不同,Blend for Visual studio 2013提供了三种不同的Behavior: EventTriggerBehavior:使用事件(event)来触发行为 DataTriggerBehavior:使用数据变化来触发行为 IncrementalUpdateBehavior:当GridView,ListView控件增量更新时触发的行为。增量更新是这两个控件在Windows 8.1中的新特性。 由于IncrementalUpdateBehavior比较特殊,需要联系到增量更新的功能来讲,我会在下一篇文章中介绍。本文中我们只讨论EventTriggerBehavior和DataTriggerBehavior的用法。 Action指的是某个特定的功能,通常需要和Behavior配合起来使用。Blend for Visual Studio 2013提供了七种不同的Action: CallMethodAction:调用某个特定的函数 ChangePropertyAction:改变某个属性的值 ControlStoryboardAction:控制动画的Storyboard GoToStateAction: 使控件进入某个状态 InvokeCommandAction:触发调用Command NavigateToPageAction: 导航到某个页面 PlaySoundAction:播放声音 以上这些Behavior和Action基本上涵盖了大多数使用Behavior的场合。当然如果上述Behavior和Action还不能满足你的要求,你也可以通过IBehavior接口和IAction接口来实现自己的Behavior和Action。 首先,让我们来看一下EventTriggerBehavior。EventTriggerBehavior在Blend中是缺省的Behavior,也就是说,当你在Blend中拖一个Action到控件上的时候,Blend会自动为这个Action加上一个EventTriggerBehavior。要使用这个EventTriggerBehavior,你需要设置三个属性:EventName, SourceObject和Actions。 EventName用来设定触发该Behavior的事件,你可以选择SourceObject中指定对象支持的任一事件。 SourceObject用来选择触发该事件的源对象。 Actions是个集合,用来设置当该事件发生时需要执行的Action,因为这是一个集合,所以对每个Behavior都可以设置一组动作。 DataTriggerBehavior与EventTriggerBehavior的区别在于触发方式的不同。DataTriggerBehavior通过属性值的变化来触发动作。所以,它除了有Actions属性以外,还有三个用于设置触发方式的属性: Binding用于设定需要比较的属性,这个属性需要实现INotifyPropertyChanged接口。 ComparationCondition用于设定比较条件 Value用于设定比较的值 无论是DataTriggerBehavior还是DataTriggerBehavior都需要设置Actions. Blend中内置了七种不同的Action,…

2