Освободить память при переключении TabItem - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть много TabItem в окне с Frame и загружают UserControls внутри Frame, когда TabItem нажимается, как вы можете видеть на картинке ниже: enter image description here

Проблема:

  1. При первом нажатии TabItem и загрузке «Sale UserControl» требуется память 121Mb .

  2. При переключении 2-го TabItem требуется 128Mb

  3. , затем снова переключается обратно на первый TabItem, который занимает 142Mb память.Тот же сценарий будет для других TabItems, каждый переключатель занимает память и не освобождается от последнего TabItem.

  4. Я переключил два TabItem 10 раз, потребление памяти кажется до 308MB , что вызывает тревогу.

Это увеличенная память, я думаю, направленная на утечки памяти.но я не могу понять откуда.пожалуйста, помогите,

Результат диагностического прибора:

enter image description here

Код:

<Window
        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:Inventory_Control"
        xmlns:view="clr-namespace:Inventory_Control.UserControls"
        x:Class="Inventory_Control.MainWindow"
        mc:Ignorable="d"
        Title="MainWindow" WindowState="Maximized" WindowStartupLocation="CenterScreen" Icon="Images/app_icon.png">
    <Grid>

        <Grid.Resources>
            <Style TargetType="{x:Type TabItem}">
                <Setter Property="Margin" Value="5"/>
            </Style>
            <Style TargetType="{x:Type StackPanel}">
                <Setter Property="Orientation" Value="Vertical"/>
                <Setter Property="MinWidth" Value="160"/>
                <Setter Property="MinHeight" Value="90"/>
            </Style>
            <Style TargetType="{x:Type Image}">
                <Setter Property="Margin" Value="10,10,5,0"/>
                <Setter Property="Width" Value="40"/>
                <Setter Property="Height" Value="40"/>
                <Setter Property="HorizontalAlignment" Value="Left"/>
            </Style>
            <Style TargetType="{x:Type TextBlock}">
                <Setter Property="VerticalAlignment" Value="Center"/>
                <Setter Property="Margin" Value="10,3,0,5"/>
                <Setter Property="Foreground" Value="White"/>
                <Setter Property="FontSize" Value="18"/>
            </Style>
        </Grid.Resources>

        <Grid.RowDefinitions>
            <RowDefinition Height="0.079*" />
            <RowDefinition Height="1*" />
        </Grid.RowDefinitions>

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*" />
            <!--<ColumnDefinition Width="0.2*" />-->
        </Grid.ColumnDefinitions>

        <Viewbox HorizontalAlignment="Left">
            <TabControl x:Name="TabControl" Padding="0" MouseUp="TabControl_MouseUp">

                <TabItem MouseUp="TabItem_MouseUp">
                    <TabItem.Header>
                        <StackPanel Orientation="Vertical" Background="#3e7038">
                            <Image Source="Images/sale.png"/>
                            <TextBlock Text="Sale" />
                        </StackPanel>
                    </TabItem.Header>
                </TabItem>

                <TabItem x:Name="ItemsTab" MouseUp="ItemsTab_MouseUp">
                    <TabItem.Header>
                        <StackPanel Background="#0073c4">
                            <Image Source="Images/product.png"/>
                            <TextBlock Text="Items"  />
                        </StackPanel>
                    </TabItem.Header>
                </TabItem>
                <TabItem x:Name="CategoryTab" MouseUp="CategoryTab_MouseUp">
                    <TabItem.Header>
                        <StackPanel  Background="#404040">
                            <Image Source="Images/category.png" />
                            <TextBlock Text="Category"  />
                        </StackPanel>
                    </TabItem.Header>
                </TabItem>
                <TabItem x:Name="TypeTab" MouseUp="TypeTab_MouseUp">
                    <TabItem.Header>
                        <StackPanel  Background="#404040">
                            <Image Source="Images/type.png" />
                            <TextBlock Text="Type"  />
                        </StackPanel>
                    </TabItem.Header>
                </TabItem>
                <TabItem x:Name="LocationTab" MouseUp="LocationTab_MouseUp">
                    <TabItem.Header>
                        <StackPanel  Background="#404040">
                            <Image Source="Images/location.png" />
                            <TextBlock Text="Location"  />
                        </StackPanel>
                    </TabItem.Header>
                </TabItem>
                <TabItem x:Name="CustomerTab" MouseUp="CustomerTab_MouseUp">
                    <TabItem.Header>
                        <StackPanel  Background="#FF364834">
                            <Image Source="Images/customer.png"/>
                            <TextBlock Text="Customer"  />
                        </StackPanel>
                    </TabItem.Header>
                </TabItem>
                <TabItem x:Name="SupplierTab" MouseUp="SupplierTab_MouseUp">
                    <TabItem.Header>
                        <StackPanel  Background="#FF364834">
                            <Image Source="Images/supplier.png"/>
                            <TextBlock Text="Supplier"  />
                        </StackPanel>
                    </TabItem.Header>
                </TabItem>
                <TabItem Name="LedgerTab">
                    <TabItem.Header>
                        <StackPanel  Background="#FF7F7C7C">
                            <Image Source="Images/ledger.png" />
                            <TextBlock Text="Ledger"  />
                        </StackPanel>
                    </TabItem.Header>
                </TabItem>


                <TabItem x:Name="UserTab" MouseUp="UserTab_MouseUp">
                    <TabItem.Header>
                        <StackPanel  Background="#FFB17369">
                            <Image Source="Images/user.png" />
                            <TextBlock Text="User" />
                        </StackPanel>
                    </TabItem.Header>
                </TabItem>
                <TabItem x:Name="ExpenseTab" MouseUp="AddExpenses_MouseUp">
                    <TabItem.Header>
                        <StackPanel  Background="#cc6d00">
                            <Image Source="Images/expense.png" />
                            <TextBlock Text="Expense" />
                        </StackPanel>
                    </TabItem.Header>
                </TabItem>
                <TabItem Name="ReportTab" MouseUp="TabItem_MouseUp_2">
                    <TabItem.Header>
                        <StackPanel  Background="#00879c">
                            <Image Source="Images/report.png" />
                            <TextBlock Text="Report"  />
                        </StackPanel>
                    </TabItem.Header>
                </TabItem>

                <TabItem x:Name="HistoryTab" MouseUp="HistoryTab_MouseUp">
                    <TabItem.Header>
                        <StackPanel  Background="#FF324F54">
                            <Image Source="Images/history.png" />
                            <TextBlock Text="History"  />
                        </StackPanel>
                    </TabItem.Header>
                </TabItem>

                <TabItem x:Name="InventoryTrailTab" MouseUp="InventoryTrailTab_MouseUp">
                    <TabItem.Header>
                        <StackPanel  Background="Tomato">
                            <Image Source="Images/history.png" />
                            <TextBlock Text="Inventory Trail"  />
                        </StackPanel>
                    </TabItem.Header>
                </TabItem>

            </TabControl>

        </Viewbox> 

        <!--<Button Name="LogoutBtn" Height="auto" MinWidth="50" Width="50" Content="Logout" Grid.Column="1"/>-->

        <Frame Grid.Row="1" Grid.ColumnSpan="2" x:Name="mainFrame" NavigationUIVisibility="Hidden"/>
    </Grid>


</Window>

cs:

using Inventory_Control.Classes;

namespace Inventory_Control
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        int selectedTab = 0;

        string userType = Util.GetUserType();

        public MainWindow()
        {
            InitializeComponent();
            mainFrame.Content = new FileTab();


            if (userType.Equals(Util.editor))
            {
                EditorPrivilidges();
            }

            if (userType.Equals(Util.salesman))
            {
                SalesmanPrevilidges();
            }
        }

        void SalesmanPrevilidges()
        {
            EditorPrivilidges();
            ItemsTab.Visibility = Visibility.Collapsed;
            CategoryTab.Visibility = Visibility.Collapsed;
            TypeTab.Visibility = Visibility.Collapsed;
            LocationTab.Visibility = Visibility.Collapsed;
            CustomerTab.Visibility = Visibility.Collapsed;
            SupplierTab.Visibility = Visibility.Collapsed;

        }

        void EditorPrivilidges()
        {
            ReportTab.Visibility = Visibility.Collapsed;
            HistoryTab.Visibility = Visibility.Collapsed;
            UserTab.Visibility = Visibility.Collapsed;
            ExpenseTab.Visibility = Visibility.Collapsed;
            LedgerTab.Visibility = Visibility.Collapsed;
        }

        private void TabItem_MouseUp(object sender, MouseButtonEventArgs e)
        {
            if (selectedTab != 0)
            {
                mainFrame.Content = new FileTab();
            }
        }

        private void SaleTab_MouseUp(object sender, MouseButtonEventArgs e)
        {

        }

        private void ItemsTab_MouseUp(object sender, MouseButtonEventArgs e)
        {
            if (selectedTab != 1)
            {
                mainFrame.Content = new ItemsTab();
            }
        }

        private void TabItem_MouseUp_1(object sender, MouseButtonEventArgs e)
        {

        }

        private void CategoryTab_MouseUp(object sender, MouseButtonEventArgs e)
        {
            if (selectedTab != 2)
            {
                mainFrame.Content = null;
                mainFrame.Content = new CategoryTab();
            }
        }

        private void TypeTab_MouseUp(object sender, MouseButtonEventArgs e)
        {
            if (selectedTab != 3)
            {
                mainFrame.Content = new TypeTab();
            }
        }

        private void LocationTab_MouseUp(object sender, MouseButtonEventArgs e)
        {
            if (selectedTab != 4)
            {
                mainFrame.Content = new LocationTab();
            }
        }

        private void CustomerTab_MouseUp(object sender, MouseButtonEventArgs e)
        {
            if (selectedTab != 5)
            {
                mainFrame.Content = new CustomerTab();
            }
        }

        private void SupplierTab_MouseUp(object sender, MouseButtonEventArgs e)
        {
            if (selectedTab != 6)
            {
                mainFrame.Content = new SupplierTab();
            }
        }

        private void UserTab_MouseUp(object sender, MouseButtonEventArgs e)
        {
            if (selectedTab != 8)
            {
                mainFrame.Content = new UserTab();
            }
        }

        private void TabItem_MouseUp_2(object sender, MouseButtonEventArgs e)
        {
            if (selectedTab != 10)
            {
                mainFrame.Content = new ReportTab();
            }
        }

        private void HistoryTab_MouseUp(object sender, MouseButtonEventArgs e)
        {
            if (selectedTab != 11)
            {
                mainFrame.Content = new HistoryTab();
            }
        }

        private void InventoryTrailTab_MouseUp(object sender, MouseButtonEventArgs e)
        {
            if (selectedTab != 12)
            {
                mainFrame.Content = new InventoryTrail();
            }
        }

        private void SalesmanTab_MouseUp(object sender, MouseButtonEventArgs e)
        {
            if (mainFrame.Content != new SalesmanTab())
            {
                mainFrame.Content = new SalesmanTab();
            }
        }



        private void AddExpenses_MouseUp(object sender, MouseButtonEventArgs e)
        {
            if (mainFrame.Content != new AddExpenses())
            {
                mainFrame.Content = new AddExpenses();
            }
        }

        private void TabControl_MouseUp(object sender, MouseButtonEventArgs e)
        {
            selectedTab = TabControl.SelectedIndex;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...