我一直在寻找30分钟以上,但是我根本无法弄清楚问题出在哪里。 我有一个TabControl ,它的项目将由用户关闭。 由于每个TabItem都以某种方式连接到自定义控件和几个对象,每个对象都占用大量内存,因此我想处置与此TabItem一起使用的所有对象。

为了使其更清楚并在简化的情况下为您节省很多代码:

<UserControl x:Class="myProject.GridFour"
         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" 
         d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
        <ScrollViewer Height="Auto" Margin="0" Name="scrollViewer11" Width="Auto" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"></ScrollViewer>
        <ScrollViewer Grid.Column="1" Height="Auto" Name="scrollViewer12" Width="Auto"  Margin="0" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"></ScrollViewer>
        <ScrollViewer Grid.Row="1"> Height="Auto" Name="scrollViewer21" Width="Auto" Margin="0" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"></ScrollViewer>
        <ScrollViewer Height="Auto" Name="scrollViewer22" Width="Auto" Grid.Column="1" Margin="0" Grid.Row="1" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"></ScrollViewer>
    </Grid>
</UserControl>

现在,我设置相应选项的内容:

GridFour myControl = new GridFour();
myTabItem.Content = myControl;

我还有一些自定义对象,每个对象都包含一个网格,该网格作为内容添加到我的用户控件的scrollviewer中:

class MyClass
{
    internal Grid _grid = new Grid();
    internal Image _image = new Image() {Width = Double.NaN, Height = Double.NaN HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center, Stretch = Stretch.Fill};
    //... a lot of variables, data, images and methods...
}

MyClass[] myObject = new MyClass[4];

for(int i = 0; i < 4; i++)
{
    myObject[i] = new MyClass();
    myObject[i]._grid.Children.Add(_image); //that actually happens when I initialise the object, it is just to show how everything is connected
}

myControl.scrollViewer11.Content = myObject[0]._grid;
myControl.scrollViewer12.Content = myObject[1]._grid;
myControl.scrollViewer21.Content = myObject[2]._grid;
myControl.scrollViewer22.Content = myObject[3]._grid;

现在,当用户显然想要关闭列表项时,我也想摆脱myControl和每个对象myObject。 我试图通过IDisposable对其调用Dispose方法,但始终抛出NullReferenceException,我根本不知道为什么。

我也许应该提到,每个myObject都在Dictionary<string, MyClass>但是在调用dispose之前,我从那里删除了该对象。

#1楼 票数:1 已采纳

class MyClass : IDisposable
{ 
    internal Grid _grid = new Grid(); 
    internal Image _image = new Image() {Width = Double.NaN, Height = Double.NaN HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center, Stretch = Stretch.Fill}; 
    //... a lot of variables, data, images and methods... 

    public void Dispose()
    {
        // your custom disposing 
        _image = null; //or something like that
    }
}

#2楼 票数:0

因此,您要删除UI元素,然后尝试更新模型,而不是:

为什么不将UI绑定到对象的ObservableCollection列表。 然后要删除,您只需要从模型中的列表中删除(并根据需要进行处理)即可,但让UI来完成它的工作,然后简单地对列表进行更改即可。 这就是WPF最有效的方式。

这里一样在TabControl.ItemsSource上阅读

  ask by phil13131 translate from so

未解决问题?本站智能推荐:

3回复

如何正确管理DataContext的处置?

我有一个非常重视数据库访问的Web服务。 它在测试中运行良好,但是一旦我将其投入生产并增加了负载,它就会开始消除当有人在DataContext中调用方法时引发的错误。 该错误通常是以下之一: 你调用的对象是空的 无法访问已处置的对象。 对象名称:“在Dispose之后访问Dat
1回复

正确处置实现IDisposable的类

以下2个代码段中的哪一个未调用处理,因此是不好的做法: 要么 ?
3回复

使用Ninject处置或不处置可注射实例

我在解决方案中有以下代码块用于配置Ninject: 我的观点是,此处使用的一次性图案不是必需的。 IDependencyScope是IDisposable的,但是如果我在构造IDisposable成员,则应该只清理IDisposable成员,但是构造函数中注入的解析器不是我的类拥有(创建
1回复

无法处置控制(NotifyIcon)

在我的家庭作业申请中; 我需要创建一个应用程序,我还需要在其中使用 NotifyIcon。 我面临一个问题,我无法理解为什么代码永远不会到达处置事件。 我正在实施“IDisposable”; (为了能够在 NotifyIcon 上调用 Dispose)。 但是,在dispose事件中添加断点后;
4回复

处置对象(简化)

我在Mono重新实现加密转换时发现了这段代码。 我没有修改或简化任何事情 - 实际上它是这样的(有像@ // Dispose unmanaged objects评论,但实际上没有做任何事情)。 现在 - 与IDisposable相关的代码对我来说似乎是多余的。 这可以以某种方式完全简化
3回复

如何处置物件

如何处置我的物品? 我正在这样做。 怎么了 Obj.Dispose()函数似乎不正确。
1回复

处置包含流的派生流

我有以下类派生自流: 我正在寻找一种处置基流以及此类中所有流和资源的方法。 我已经了解了一些处置模式,并且由于流已经实现了IDisposable,我的想法是将其处置在此类中,我将执行以下操作: 处置基本流时应调用此方法,因为基本流IDisposable调用Close(),后者调用Dis
3回复

处理用户控件,真的是要编辑.designer.cs文件吗?

对于具有必须处理的内部数据结构的用户控件,是将该代码添加到.designer.cs文件中的Dispose方法的正确位置,还是存在我们打算使用的事件? 编辑 :这是一个winforms用户控件。