Пустой ItemsControl вызывает утечку памяти в WPF - PullRequest
0 голосов
/ 19 сентября 2018

Я сталкиваюсь с немного странной проблемой с WPF.

Мы используем TabControl с ContentTemplateSelector для рендеринга различных страниц:

<Window x:Class="LeakTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:LeakTest"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800"
    DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Window.Resources>
    <local:TemplateSelector x:Key="TemplateSelector"/>

    <DataTemplate x:Key="Template0">
        <Grid>
            <TextBlock>Template0</TextBlock>
            <local:DebugControl/>
            <!-- DebugControl stops leaking if ItemsControl or AlternationCount attribute is removed -->
            <ItemsControl AlternationCount="10"/>
        </Grid>
    </DataTemplate>

    <DataTemplate x:Key="Template1">
        <TextBlock>Template1</TextBlock>
    </DataTemplate>
</Window.Resources>
<TabControl ItemsSource="{Binding TabItems, Mode=OneTime}" ContentTemplateSelector="{StaticResource TemplateSelector}">            
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=Index}"/>
        </DataTemplate>
    </TabControl.ItemTemplate>
</TabControl>        

С этимCodeBehind:

namespace LeakTest
{
    public class TabItem {
        public int Index {
            get; private set;
        }

        public TabItem(int index)
        {
            this.Index = index;
        }
    };

    public class TemplateSelector : DataTemplateSelector
    {
        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            TabItem i = (TabItem)item;

            Window win = Application.Current.MainWindow;
            return win.FindResource("Template"+i.Index) as DataTemplate;
        }
    }

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private List<TabItem> tabItems = new List<TabItem>() { new TabItem(0), new TabItem(1) };
        public IList<TabItem> TabItems => tabItems;
    }
}

DebugControl - это просто пустой UserControl.Как и ожидалось, новый экземпляр DebugControl создается каждый раз, когда открывается первая вкладка.Однако, как только я добавляю пустые ItemsControls на первую вкладку, экземпляр UserControl никогда не освобождается: Screenshot from VS memory profiler

Это ошибка в ItemsControl или я делаю что-то еще неправильночто вызывает это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...