繁体   English   中英

在WPF面板上添加和删除用户控件的正确方法

[英]Correct way to add and remove user controls on a panel on WPF

在面板上添加和删除用户控件的正确方法。

我对此有一些疑问:

  1. 这样做(更好)是正确的吗?
  2. 留下一些内存浪费一段时间后再运行应用程序?

目前,我有一个主窗口,如下所示:

<!-- MainWindow.xaml -->
<Window x:Class="Empresas.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Empresas" Height="480" Width="640"
        MinHeight="480" MinWidth="640">
    <DockPanel HorizontalAlignment="Stretch" Width="Auto" Margin="0">

        <!-- Menu -->
        <Menu x:Name="MainWindowClientesMenu" Width="Auto" Height="25"
              DockPanel.Dock="Top">
            <MenuItem Header="_Archivo">
                <MenuItem Header="Agregar _Nueva empresa" x:Name="MainWindowClientesAgregarEmpresa" Click="MainWindowClientesAgregarEmpresa_Click" />
                <Separator/>
                <MenuItem Header="Salir"/>
            </MenuItem>
        </Menu>
        <!-- Fin Menu -->

        <!-- Barra de Estado -->
        <StatusBar x:Name="MainWindowClientesStatusBar" Width="Auto" Height="25"
                   DockPanel.Dock="Bottom" Background="#ddd" HorizontalAlignment="Stretch">
            <StatusBarItem x:Name="MainWindowClientesCurrentAction" HorizontalContentAlignment="Right"
                           Margin="0 0 5 0"></StatusBarItem>
        </StatusBar>


        <StackPanel x:Name="MainWindowClientesContenido"></StackPanel>
        <!-- Fin Lista isquierda de Empresas/Clientes -->

    </DockPanel>
</Window>

我的用户控件如下

<!-- NuevaEmpresa.xaml -->
<UserControl x:Class="Empresas.View.NuevaEmpresa"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" Height="300" Width="350">
    <Grid>
        <Label Content="Razon Social" Height="28" HorizontalAlignment="Left" Margin="12,12,0,0" Name="label1" VerticalAlignment="Top" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="118,14,0,0" Name="NuevaEmpresaRazonSocialTxtBox" VerticalAlignment="Top" Width="220" />
        <Label Content="Nit" Height="28" HorizontalAlignment="Left" Margin="12,52,0,0" Name="label2" VerticalAlignment="Top" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="118,54,0,0" Name="NuevaEmpresaNitTxtBox" VerticalAlignment="Top" Width="220" />
        <Button Content="Crear Empresa" Height="23" HorizontalAlignment="Left" Margin="223,114,0,0" Name="NuevaEmpresaCrearButton" VerticalAlignment="Top" Width="115" Click="NuevaEmpresaCrearButton_Click" />
        <Button Content="Cancelar" Height="23" HorizontalAlignment="Left" Margin="93,114,0,0" Name="NuevaEmpresaCancelarButton" VerticalAlignment="Top" Width="115" Click="NuevaEmpresaCancelarButton_Click" />
    </Grid>
</UserControl>

以及它们如何添加和删除控件如下:

// MainWindow.xaml.cs
private void MainWindowClientesAgregarEmpresa_Click(object sender, RoutedEventArgs e)
        {
            MainWindowClientesContenido.Children.Add(new View.NuevaEmpresa(MainWindowClientesContenido));
        }

// NuevaEmpresa.xaml.cs
public partial class NuevaEmpresa : UserControl
{
    // ...
    private Panel _parent;    

    public NuevaEmpresa(Panel parent)
    {
        InitializeComponent();
        _parent = parent;
        // ...

    }

    // ...

    private void NuevaEmpresaCancelarButton_Click(object sender, RoutedEventArgs e)
    {
        _parent.Children.Clear();
    }
}

我不明白为什么这可能是错误的。 您正在设置其子项,然后清除它。 对我来说似乎很理智。 也看不到为什么可能会泄漏内存。 一旦父母清除了子女,则必须将其处置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM