0

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>

次に、対応する tabitem のコンテンツを設定します。

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

また、ユーザー コントロールのスクロールビューアーにコンテンツとして追加されるグリッドをそれぞれ含むカスタム オブジェクトがあります。

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 が a 内にあることに言及する必要があるかもしれませんが、Dictionary<string, MyClass>dispose を呼び出す前にそこからオブジェクトを削除します。

4

2 に答える 2

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
    }
}
于 2012-09-17T13:14:38.127 に答える
0

したがって、UI要素を削除してから、代わりにモデルを更新しようとしています。

UIをObservableCollectionオブジェクトのリストにバインドしてみませんか。次に、削除するには、モデルのリストから削除する必要があります(必要に応じて破棄します)が、UIに任せて、リストへの変更を反映させます。これが、WPFが最適に機能する方法です。

TabControl.ItemsSourceLikehereを読んでください。

于 2012-09-17T13:06:46.850 に答える