列表框内的内存清理问题/分离触发器问题

时间:2011-05-18 05:44:24

标签: windows-phone-7

        <listbox> 
            <ListBox.ItemTemplate>
                <DataTemplate>

                    <Grid Height="120" Width="480" VerticalAlignment="Top">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="110"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <Border 
                            Height="105" 
                            Width="110" 
                            BorderBrush="White" 
                            Grid.Column="0" 
                            BorderThickness="2">
                            <Image 
                                delay:LowProfileImageLoader.UriSource="{Binding Path=Avatar}" 
                                Source="/Image/default-thumb-groups.png">
                            </Image>
                        </Border>

                        <Grid Grid.Column="1">

                            <Grid.RowDefinitions>
                                <RowDefinition Height="4"/>
                                <RowDefinition Height="35"/>
                                <RowDefinition Height="50"/>
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>

                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="10" />
                                <ColumnDefinition Width="*" />
                            </Grid.ColumnDefinitions>

                            <TextBlock 
                                Text="{Binding Path=Name,Mode=TwoWay}"  
                                Grid.Column="1" 
                                Grid.Row="1" 
                                FontFamily="Segoe WP Light" 
                                FontSize="26"
                                Foreground="{StaticResource PhoneForegroundBrush}" 
                                TextWrapping="Wrap">
                            </TextBlock>

                            <TextBlock 
                                Text="{Binding Path=Members,Mode=TwoWay}"   
                                Grid.Column="2"  
                                Grid.Row="2" 
                                FontFamily="Segoe WP Light" 
                                HorizontalAlignment="Left" 
                                FontSize="20" Opacity="0.91"
                                Foreground="{StaticResource PhoneForegroundBrush}" 
                                TextWrapping="Wrap">
                            </TextBlock>

                            <toolkit:ContextMenuService.ContextMenu>
                                <toolkit:ContextMenu 
                                    Name="DeleteGroup" 
                                    IsZoomEnabled="False" 
                                    Tag="{Binding Nid,Mode=TwoWay}" 
                                    Visibility="{Binding ElementName=GroupList,  Path=DataContext.DeleteStatus,Mode=TwoWay, Converter=
                                               {StaticResource booleanToVisibility}}" Opened="DeleteGroup_Opened" Closed="DeleteGroup_Opened">

                                    <toolkit:MenuItem Header="delete group">
                                        <Interactivity:Interaction.Triggers>
                                            <Interactivity:EventTrigger EventName="Click">
                                                <Command:EventToCommand Command="{Binding ElementName=GroupList, 
                                                    Path=DataContext.DeleteCommand,Mode=TwoWay}"  CommandParameter="{Binding 
                                                    ElementName=DeleteGroup}" PassEventArgsToCommand="True"/>
                                            </Interactivity:EventTrigger>
                                        </Interactivity:Interaction.Triggers>
                                    </toolkit:MenuItem>
                                </toolkit:ContextMenu>
                            </toolkit:ContextMenuService.ContextMenu>
                        </Grid>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

在尝试清理时;上下文菜单的触发器不是分离;因此,即使在从页面导航后页面也不会死亡。这导致我们页面中的救世主记忆问题。请帮我解决这个问题

1 个答案:

答案 0 :(得分:0)

从未使用Toolkit ContextMenu,但注意到您并不是唯一一个有类似问题的人。例如this article证明“ContextMenu控件通过鼠标事件处理程序将自身附加到RootVisual,因此永远不会得到GC;更糟糕的是,它所放置的可视树也保持活着”。即使那篇文章谈论桌面,WP7上的症状可能也是一样。

我会尝试以编程方式创建/销毁菜单。 This article演示了可以使用的技术。

另一种可能性是自定义列表框:

  • 覆盖PrepareContainerForItemOverride:调用base.PrepareContainerForItemOverride()以获取标准ListBoxItem并手动将ContextMenu添加到其中。
  • 覆盖ClearContainerForItemOverride以清除菜单参考。

(从未尝试过,但它应该有效。)

侧面评论

您的Xaml似乎对我来说过于复杂。如果没有别的,那么在ListBoxItem中使用嵌套网格(它反过来嵌入到ListBox面板(VirtualizingStackPanel)中,它在页面级别的至少一个面板中)必须具有可怕的性能影响。 即使我忘记了内部4x2网格只使用2个单元格(也许你简化了Xaml),外部网格的目的是什么?通过在第一列上使用单个网格和列跨度,可以实现相同的效果。