मेरे पास एक WPF ListBox
ObservableCollection
से जुड़ा हुआ है। जब संग्रह में चीजें जोड़ दी जाती हैं, तो ListBox
अतिरिक्त प्रविष्टियों के आकार से स्क्रॉल स्थिति बदल जाती है। मैं स्क्रॉल स्थिति को संरक्षित करने में सक्षम होना चाहता हूं, ताकि सूची में चीजें जोड़े जाने के बावजूद, वर्तमान में देखे जाने वाले आइटम स्थानांतरित नहीं होते हैं। क्या इसको मदद देने का कोई तरीका है?संग्रह बदलते समय एक बाध्य WPF ListBox की स्क्रॉल स्थिति को संरक्षित करते हुए
उत्तर
मुझे यकीन नहीं है कि इसके लिए ओवरराइड है, लेकिन मुझे शक है।
जब संदेह में मैन्युअल बाध्यकारी उपयोग किया जाता है? : -} गंभीरता से, डिफ़ॉल्ट बाध्यकारी व्यवहार - अच्छी तरह से डिफ़ॉल्ट होगा, इसलिए यदि आपको विशेष व्यवहार मैन्युअल बाध्यकारी की आवश्यकता है तो बेहतर विकल्प है। मैन्युअल बाध्यकारी के साथ आप स्क्रॉल स्थिति को सहेज सकते हैं और आइटम जोड़ने के बाद इसे रीसेट कर सकते हैं।
जो एक स्पष्ट प्रश्न की ओर जाता है - मैं वर्तमान स्क्रॉल स्थिति कैसे निर्धारित करूं? –
संग्रह दृश्य बनाएं। इस प्रयास करें:
private ObservableCollection<int> m_Values;
private CollectionView m_View;
private void Bind()
{
m_Values = new ObservableCollection<int>();
m_View = new CollectionView(m_Values);
MyListBox.ItemsSource = m_View;
}
private void MyListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
Debug.WriteLine(m_View.CurrentItem);
Debug.WriteLine(m_View.CurrentPosition);
}
कृपया आगे की व्याख्या करें। यह उत्तर समस्या को हल करने के लिए प्रतीत नहीं होता है - यह केवल वर्तमान आइटम और स्थिति की रिपोर्ट करता है। मुझे एक वर्चुअलिंगस्टैकपैनल पर सेट किए गए आइटम्सपैनल के साथ एक सूची बॉक्स का उपयोग करके एक ही समस्या है। समस्या यह है कि मैं इसे देखता हूं कि सूची बॉक्स आइटम आगे बढ़ते रहते हैं क्योंकि नए आइटम अवलोकन संग्रह में जोड़े जाते हैं। हालांकि वस्तुओं को वापस ले जाना संभव है जहां वे एक नए आइटम के बाद थे (उदा।, चयनित इंडेक्स का उपयोग करके), यह एक झटकेदार गति बनाता है। स्क्रॉल की स्थिति को पहले स्थान पर बदलने से रोकने के लिए जरूरी चीज है क्योंकि नए आइटम जोड़े जाते हैं। – CyberMonk
मुझे एक ही समस्या है, लेकिन आपका समाधान मानता है कि somethig का चयन किया गया है। लेकिन क्या होगा यदि उपयोगकर्ता कुछ भी चुनना नहीं चाहता? बस कहीं स्क्रॉल करें और इसे छोड़ दें। – EvAlex
जब चीजें जोड़ रहे हैं आप नियंत्रित करते हैं? मेरा मतलब है कि आपके पास एक या दो परिभाषित बिंदु हैं जहां डेटा बदल जाता है? यदि ऐसा है, तो एक आसान समाधान (शायद सुरुचिपूर्ण नहीं) तो स्थानीय सूची चर को वर्तमान सूची बॉक्स को पकड़ने के लिए होगा। चयनित Index। डेटा परिवर्तन से ठीक पहले, चयनित इंडेक्स को इस चर में सहेजें और डेटा जोड़े जाने के बाद, सूची के चयनित इंडेक्स को इस चर के मान पर सेट करें।
सबसे पहले सूचीबॉक्स द्वारा चयनित स्थिति पाएं। चयन किए गए इंडेक्स और फिर ListBox.ScrollIntoView (/ * वर्तमान अनुक्रमणिका * /) का उपयोग करें। भले ही नए आइटम सूची में जोड़े गए हों, आपकी वर्तमान स्थिति और दृश्य वही होगा।
मुझे एक ही समस्या का सामना करना पड़ा और एक और प्रतिबंध: उपयोगकर्ता आइटम का चयन नहीं करता है, बल्कि केवल स्क्रॉल करता है। यही कारण है कि ScrollIntoView()
विधि बेकार है। मेरा समाधान यहाँ है।
पहले, मैं DependencyObject से पाने, प्रकार bool के एक संलग्न निर्भरता संपत्ति PreserveScroll
साथ वर्ग ScrollPreserver
बनाया:
public class ScrollPreserver : DependencyObject
{
public static readonly DependencyProperty PreserveScrollProperty =
DependencyProperty.RegisterAttached("PreserveScroll",
typeof(bool),
typeof(ScrollPreserver),
new PropertyMetadata(new PropertyChangedCallback(OnScrollGroupChanged)));
public static bool GetPreserveScroll(DependencyObject invoker)
{
return (bool)invoker.GetValue(PreserveScrollProperty);
}
public static void SetPreserveScroll(DependencyObject invoker, bool value)
{
invoker.SetValue(PreserveScrollProperty, value);
}
...
}
संपत्ति बदल कॉलबैक मान लिया गया संपत्ति ScrollViewer द्वारा निर्धारित है। कॉलबैक विधि निजी शब्दकोश को यह ScrollViewer कहते हैं और इसे करने के लिए ScrollChanged ईवेंट हैंडलर जोड़ता है:
private static Dictionary<ScrollViewer, bool> scrollViewers_States =
new Dictionary<ScrollViewer, bool>();
private static void OnScrollGroupChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ScrollViewer scrollViewer = d as ScrollViewer;
if (scrollViewer != null && (bool)e.NewValue == true)
{
if (!scrollViewers_States.ContainsKey(scrollViewer))
{
scrollViewer.ScrollChanged += new ScrollChangedEventHandler(scrollViewer_ScrollChanged);
scrollViewers_States.Add(scrollViewer, false);
}
}
}
इस शब्दकोश अनुप्रयोग में सभी ScrollViewers कि इस वर्ग का उपयोग करने के संदर्भ का आयोजन करेगा। मेरे मामले में आइटम संग्रह की शुरुआत में जोड़े गए हैं। समस्या यह है कि व्यूपोर्ट स्थिति बदलती नहीं है। यह ठीक है जब स्थिति 0 है: व्यूपोर्ट में पहला तत्व हमेशा पहला आइटम होगा। लेकिन जब व्यूपोर्ट में पहले तत्व में 0 से अधिक इंडेक्स होता है और नए आइटम जोड़े जाते हैं - उस तत्व की अनुक्रमणिका बढ़ जाती है तो यह नीचे स्क्रॉल हो जाती है। तो bool मूल्य 0. यह दर्शाता है कि ScrollViewer खड़ी की ऑफसेट है नहीं अगर यह 0 है कुछ भी करने को कोई जरूरत नहीं है, और अगर यह 0 नहीं है, यह व्यूपोर्ट में आइटम में अपनी स्थिति बनाए रखने के लिए आवश्यक है:
static void scrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
if (scrollViewers_States[sender as ScrollViewer])
(sender as ScrollViewer).ScrollToVerticalOffset(e.VerticalOffset + e.ExtentHeightChange);
scrollViewers_States[sender as ScrollViewer] = e.VerticalOffset != 0;
}
अतिरिक्त आइटम की मात्रा को इंगित करने के लिए ExtentHeightChange का उपयोग यहां किया जाता है। मेरे मामले में आइटम केवल संग्रह की शुरुआत में जोड़े जाते हैं, इसलिए मुझे इस मूल्य से स्क्रॉलव्यूयर के वर्टिकल ऑफसेट को बढ़ाने की ज़रूरत है। और आखिरी बात: उपयोग। लिस्टबॉक्स के लिए यहां उदाहरण दिया गया है:
<Listbox ...>
<ListBox.Resourses>
<Style TargetType="ScrollViewer">
<Setter Property="local:ScrollPreserver.PreserveScroll" Value="True" />
</Style>
</ListBox.Resourses>
</ListBox>
ता-दा!अच्छा काम करता है :)
क्या स्थैतिक क्षेत्र में शब्दकोश की वजह से यह स्मृति लीक नहीं है? – TcKs
निर्भरता प्रॉपर्टीज सभी स्थिर हैं। उदाहरण के लिए आप इसके बारे में यहां पढ़ सकते हैं: http://stackoverflow.com/questions/2989431/why-are- निर्भरता-properties-static – EvAlex
मुझे पता है। लेकिन "scrollViewers_States" फ़ील्ड निर्भरता संपत्ति के लिए शॉर्टकट नहीं है। यह स्क्रॉलव्यूअर के उदाहरणों को संग्रहीत करता है। क्या आपके पास कुछ कोड है जो शब्दकोश से पुरानी घटनाओं को हटा देता है? – TcKs
- 1. WPF Listbox ऑटो स्क्रॉल
- 2. अपडेट करने के लिए डेटा बाध्य WPF ListBox को मजबूर करने का एक बेहतर तरीका?
- 3. WPF ListBox आइटम की अनुक्रमणिका के लिए बाध्य
- 4. WPF ListBox
- 5. WPF ListBox आइटम्ससोर्स
- 6. बाध्य डेटा बदलते समय Winforms listbox अद्यतन नहीं हो रहा है
- 7. स्क्रॉल WPF SelectedItem एक दृश्य मॉडल
- 8. संपादन योग्य WPF ListBox
- 9. फोर्स TextBlock WPF ListBox
- 10. स्क्रॉल करते समय एक स्क्रॉलबार घटना?
- 11. बटनक्लिक पर बदलते हुए दृश्य
- 12. आईओएस पर सफारी में स्क्रॉल करते समय मैं स्क्रॉल स्थिति की निगरानी कैसे कर सकता हूं?
- 13. स्वचालित रूप से समाप्त होने के लिए WPF ListBox स्क्रॉल
- 14. कोनों को संरक्षित करते समय एक यूआईएममेज को खींचना
- 15. WPF Listbox Wrapping
- 16. wpf में एक अवलोकन संग्रह में TabControl की वस्तुओं को कैसे बाध्य करें?
- 17. संग्रह में आइटम पर बदलते अवलोकन संग्रह संपत्ति
- 18. Winforms में ListBox में शब्दकोश को कैसे बाध्य करें
- 19. बाध्य संपत्ति के मूल्य को बदलते समय टेक्स्टब्लॉक की पृष्ठभूमि को एनिमेट कैसे करें?
- 20. पेज स्क्रॉल करते समय पारदर्शी निश्चित स्थिति divs के पीछे स्क्रॉल करने योग्य सामग्री छुपाएं?
- 21. WPF ListBox ItemsSource StaticResource/बाध्यकारी प्रश्न
- 22. DataGrid.ItemsSource को बदलते समय एक ईवेंट कैसे बढ़ाया जाए
- 23. ListBox के नीचे स्क्रॉल कैसे करें?
- 24. UITextView, संपादन करते समय स्क्रॉल करें?
- 25. बफर स्विच करते समय विंडो रखें स्थिति
- 26. WPF में ListBox से आइटम हटाएं?
- 27. jquery - सूची में आइटम को प्रीपेड करते समय विंडो को स्क्रॉल स्थिति बदलने से रोकें?
- 28. चयन को संरक्षित करते समय QSqlTableModel को रीफ्रेश कैसे करें?
- 29. कैसे आप वर्ग का एक उदाहरण को देखते हुए WPF
- 30. PHP फ़ंक्शन को कॉल करते समय दायरे को संरक्षित करें
मैंने अभी तक एक सूची बॉक्स में एक बहुत ही सरल wpf डेटाबेसिंग किया है और जब मैं आइटम जोड़ता हूं तो दृश्यों को ध्यान में रखा गया था ... आप और क्या कर रहे हैं? – TheCodeMonk
संग्रह की बड़ी संख्या में नए आइटम जोड़ने का प्रयास करें। जिन आइटमों को आप देख रहे हैं वे व्यूपोर्ट से बाहर निकलते हैं क्योंकि नए आइटम जोड़े जाते हैं। आप 1 आइटम जोड़ते हैं - व्यूपोर्ट एक ही स्थिति (इंडेक्स-आधारित) पर रहता है जिसका अर्थ है कि 1 आइटम व्यूपोर्ट में प्रवेश करता है और 1 आइटम इसे छोड़ देता है। – EvAlex