Xaml 在UWP中的代码隐藏中使用事件处理程序时,DataTemplate导致内存泄漏。有人知道为什么吗?

Xaml 在UWP中的代码隐藏中使用事件处理程序时,DataTemplate导致内存泄漏。有人知道为什么吗?,xaml,uwp,memory-leaks,datatemplate,Xaml,Uwp,Memory Leaks,Datatemplate,我有一个带有GridView的网格的页面。GridViews ItemTemplate设置为StaticResource DataTemplate。在DataTemplate中,我有几个到数据类型属性的绑定,但我也将DataTemplate网格控件中的DoubleTapped和RightTapped事件挂接到页面代码背后的处理程序。此设置导致页面永远无法获取GC'd 如果我从DataTemplate中删除这些事件,或者将处理程序方法直接放在数据类型对象本身中,GC工作正常,页面将被拾取 你知道为

我有一个带有GridView的网格的页面。GridViews ItemTemplate设置为StaticResource DataTemplate。在DataTemplate中,我有几个到数据类型属性的绑定,但我也将DataTemplate网格控件中的DoubleTapped和RightTapped事件挂接到页面代码背后的处理程序。此设置导致页面永远无法获取GC'd

如果我从DataTemplate中删除这些事件,或者将处理程序方法直接放在数据类型对象本身中,GC工作正常,页面将被拾取

你知道为什么将这些事件连接到生活在代码背后的处理程序会导致这个页面永远得不到GC吗?这可能是在转移视线,而问题可能在其他地方?下面是数据模板

  • 更新12/8/2020-因此,不仅上述解决方案可以让GC获取页面,我还发现使用数据模板选择器也可以纠正问题(为GC释放页面)!我仍然不明白为什么数据模板中的事件会导致这个问题,或者为什么这些解决方法可以解决这个问题。我希望有人能解释一下。此外,这个问题不是GridView独有的。我还发现,将该模板用于ListView和NavigationView时也会发生这种情况

          <DataTemplate x:Key="MyDataTemplate">
              <Grid Name="MyGrid" Margin="0" IsDoubleTapEnabled="True" DoubleTapped="OnDoubleTapped"  RightTapped="OnRightTapped">
    
                  <Grid.RowDefinitions>
                      <RowDefinition Height="30"/>
                      <RowDefinition Height="*"/>
                      <RowDefinition Height="24"/>
                      <RowDefinition Height="10"/>
                  </Grid.RowDefinitions>
    
                  <Border x:Name="MyBorder" Grid.Row="1" BorderThickness="0" Background="{ThemeResource SystemControlPageBackgroundChromeLowBrush}" Padding="0" 
                          Height="{Binding BorderHeight, Mode=OneWay}" Width="{Binding BorderWidth, Mode=OneWay}" Margin="0" 
                          HorizontalAlignment="Center" VerticalAlignment="Center">
                      <Image x:Name="Thumbnail" Grid.Row="1" Source="{Binding ThumbnailToDisplay, Mode=OneWay}" 
                             HorizontalAlignment="Center" VerticalAlignment="Center" Stretch="Uniform" Margin="0" 
                             Visibility="Visible" ToolTipService.ToolTip="{Binding ToolTip, Mode=OneWay}" 
                             RenderTransform="{Binding ThumbnailTransformer, Mode=OneWay}"  
                             RenderTransformOrigin="0.5,0.5"/>
                  </Border>
    
                  <TextBlock x:Name="MyTextBlock"
                             Grid.Row="2"
                             Margin="0"
                             Padding="0"
                             Text="{Binding PositionString, Mode=OneWay}"
                             TextWrapping="NoWrap" TextTrimming="WordEllipsis"
                             Style="{StaticResource MyTextBlockStyle}"
                             Visibility="{Binding MyTextBlockVisibility, Mode=OneWay, FallbackValue=Collapsed}"
                             VerticalAlignment="Bottom"
                             HorizontalAlignment="Center"/>
              </Grid>
          </DataTemplate>
    
    
    

通常,当对象没有更多引用时,对象将被释放。如果将处理程序放在页面代码中,则表示该页面已被使用,不会被释放。当您导航到其他页面以查看该页面是否将被释放时,请尝试删除处理程序。我可能误解了您的意思。我相信您所说的是,在页面代码中使用事件处理程序方法可以防止页面被GC破坏。我觉得这不可能是真的,否则,在代码背后使用处理程序的每个页面都会遇到他们没有遇到的问题。这些应该是弱引用,当页面被导航离开时,它将从可视树中删除,此时它将符合GC的条件。您可以简单地尝试确认这一点。请在离开页面之前删除处理程序,并查看是否发生了相同的行为。通常,当不再引用对象时,将释放该对象。如果将处理程序放在页面代码中,则表示该页面已被使用,不会被释放。当您导航到其他页面以查看该页面是否将被释放时,请尝试删除处理程序。我可能误解了您的意思。我相信您所说的是,在页面代码中使用事件处理程序方法可以防止页面被GC破坏。我觉得这不可能是真的,否则,在代码背后使用处理程序的每个页面都会遇到他们没有遇到的问题。这些应该是弱引用,当页面被导航离开时,它将从可视树中删除,此时它将符合GC的条件。您可以简单地尝试确认这一点。在离开页面之前删除处理程序,并查看是否发生相同的行为。