से पता लगाने योग्य नहीं है इसलिए मैं जीयूआई पर 2 विचार लोड करने के लिए एमवीवीएम + डाटा टेम्पलेट विधि के साथ WPF 3.5 का उपयोग कर रहा हूं। मैंने देखा है कि आइटम नियंत्रण के आइटम कंटेनर के हिस्से के रूप में जेनरेट की गई वस्तुओं को स्मृति में पिन किया गया है और दृश्य को अनलोड होने के बाद भी जीसीड नहीं मिला है!जीसी के लिए पिन किए गए उदाहरण - मेरे प्रबंधित कोड
मैंने अभी परीक्षण चलाया और पाया कि यह कोड के सबसे सरल के लिए भी पुन: उत्पन्न होता है ... आप लोग स्वयं की जांच कर सकते हैं।
XAML:
<Window x:Class="ContentControlVMTest.Window2"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ContentControlVMTest"
Title="Window2" Height="300" Width="300">
<DockPanel LastChildFill="True">
<CheckBox Click="CheckBox_Click" Content="Test1?"
DockPanel.Dock="Top" Margin="5"/>
<ContentControl x:Name="contentControl">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type local:Test3}">
<TextBlock Text="{Binding C}" Margin="5"/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:Test1}">
<DockPanel LastChildFill="True" Margin="5">
<TextBlock Text="{Binding A}"
DockPanel.Dock="Top"
Margin="5"/>
<ListBox ItemsSource="{Binding Bs}"
DisplayMemberPath="B"
Margin="5"/>
</DockPanel>
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
</DockPanel>
</Window>
कोड के पीछे:
public class Test3
{
public string C { get; set; }
}
public class Test2
{
public string B { get; set; }
}
public class Test1
{
public string A { get; set; }
private List<Test2> _Bs;
public List<Test2> Bs
{
get
{
return _Bs;
}
set
{
_Bs = value;
}
}
}
public partial class Window2 : Window
{
public Window2()
{
InitializeComponent();
this.KeyDown += Window_KeyDown;
}
private void Window_KeyDown
(object sender, System.Windows.Input.KeyEventArgs e)
{
if (Keyboard.IsKeyDown(Key.LeftCtrl))
if (Keyboard.IsKeyDown(Key.LeftShift))
if (Keyboard.IsKeyDown(Key.LeftAlt))
if (Keyboard.IsKeyDown(Key.G))
{
GC.Collect(2, GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();
GC.Collect(2, GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();
GC.Collect(3, GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();
GC.Collect(3, GCCollectionMode.Forced);
}
}
private void CheckBox_Click(object sender, RoutedEventArgs e)
{
if (((CheckBox)sender).IsChecked.GetValueOrDefault(false))
{
var x = new Test1() { A = "Test1 A" };
x.Bs = new List<Test2>();
for (int i = 1; i < 10000; i++)
{
x.Bs.Add(new Test2() { B = "Test1 B " + i });
}
contentControl.Content = x;
}
else
{
contentControl.Content = new Test3() { C = "Test3 C" };
}
}
}
मैं वाम शिफ्ट द्वारा जीसी मजबूर प्रदर्शन + Alt + Ctrl + जी Test1
या Test3
दृश्य के लिए सभी वस्तुओं और मॉडल को सही ढंग से उतारने के बाद मृत हो जाता है। तो यह उम्मीद है।
लेकिन संग्रह Test1
मॉडल (जिसमें Test2
ऑब्जेक्ट्स) में उत्पन्न संग्रह है, स्मृति में पिन किया गया है। और यह इंगित करता है कि सरणी सूची बॉक्स के आइटम कंटेनर द्वारा उपयोग की जाती है क्योंकि यह सूची बॉक्स से डी-आभासी वस्तुओं की संख्या दिखाती है! Test1
दृश्य मोड में दृश्य को कम या पुनर्स्थापित करते समय यह पिन किया गया सरणी इसका आकार बदलती है! एक बार यह 16 आइटम था और अगली बार जब प्रोफाइल किया गया तो यह 69 आइटम था।
इस WPF आइटम नियंत्रण में उत्पन्न वस्तुओं के pinning करता है इसका मतलब है! क्या कोई इसे समझा सकता है? क्या इसमें कोई संदेहजनक कमी है?
Thx बहुत कुछ।
शायद एक 'CollectionView' संग्रह चारों ओर व्यतीत कर रहा है के लिए बनाया गया है। प्रतिक्रिया के लिए – user7116
thx। हाँ! यह आइटम कंटेनर से आइटम संग्रह है। लेकिन वह क्यों लटका होगा? दृश्य चला गया है। Listbox चला गया है। यादगार में डब्ल्यूपीएफ पिन संग्रह क्यों होगा? –
क्या आप पिन किए गए उदाहरण के लिए रूट पोस्ट कर सकते हैं। –