2010-01-05 4 views
7

मैं एक WPF ListBox या ListView में चेक किए गए चेकबॉक्स की चंचलता कैसे बच सकते हैं? इसे ताज़ा करें बटन पर क्लिक करके या सूची बॉक्स को स्क्रॉल करके नीचे दिए गए कोड के साथ पुन: उत्पन्न किया जा सकता है। यदि Ischecked गलत है, तो यह झिलमिलाहट नहीं है।WPF: मैं एक ListBox या एक ListView में चेक किए गए चेकबॉक्स की चंचलता कैसे बच सकते हैं?

Window1.xaml:

<Window x:Class="WpfApplication6.Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Window1" Height="300" Width="300"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition/> 
      <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 
     <ListBox Name="listBox"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <CheckBox IsChecked="True" 
            VerticalAlignment="Center"/> 
         <Label Padding="3" 
           Content="{Binding}"/> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
     <Button Content="Refresh" 
       Grid.Column="1" 
       VerticalAlignment="Top" 
       Click="Button_Click"/> 
    </Grid> 
</Window> 

Window1.xaml.cs:

using System.Windows; 

namespace WpfApplication6 
{ 
    partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
      Button_Click(null, null); 
     } 

     void Button_Click(object sender, RoutedEventArgs e) 
     { 
      var items = new int[10000]; 
      for (int i = 0; i < items.Length; i++) 
       items[i] = i + 1; 
      listBox.ItemsSource = items; 
     } 
    } 
} 

उत्तर

2

आप चेकबॉक्स मतलब है की जाँच की जा रही है? मुझे लगता है कि जब आप चेकबॉक्स को चेक/चेक करते हैं तो आपको एनीमेशन बदलने की जरूरत है।

यह Windows XP पर नहीं होती है (यही कारण है कि मुझे लगता है कि यह एक एनीमेशन है), मैं विस्टा :)

गुड लक परीक्षण नहीं किया।

4

यह झिलमिलाते है क्योंकि आप पुराने ItemsSource बाहर फेंक रहे हैं और एक नया बनाने। इसके लिए सभी बाइंडिंग को फिर से करने की आवश्यकता होती है, और प्रत्येक आइटम को प्रदर्शित करने वाले टेम्पलेट को फिर से बनाया जाना आवश्यक है। पूरी सूची को पुनर्निर्माण के प्रदर्शन ओवरहेड से बचने के लिए, मौजूदा आइटम्स स्रोत में केवल व्यक्तिगत तत्वों को संशोधित करें। फिर डेटा टेम्पलेट का हिस्सा जो बदले गए गुणों और/या आइटम से जुड़ा हुआ है, पूरी सूची दृश्य को फिर से बनाने के बिना स्वचालित रूप से अपडेट हो जाएगा। ऐसा करने से आप "झिलमिलाहट" को देख सकेंगे।

codebehind लिए यह प्रयास करें:

public partial class MainWindow : Window 
{ 
    private ObservableCollection<object> _items; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     _items = new ObservableCollection<object>(); 
     for (int i = 0; i < 10000; i++) 
      _items.Add(i + 1); 
     listBox.ItemsSource = _items; 

    } 

    void Button_Click(object sender, RoutedEventArgs e) 
    { 
     for (int i = 0; i < _items.Count;i++) 
     { 
      if (!(_items[i] is int)) continue; 
      _items[i] = (int)_items[i] + 1; 
     } 
    } 
} 
1

नाग जो सही जवाब यहाँ है के लिए +1।

यह करने के लिए जोड़ने के लिए:

चेक बॉक्स नियंत्रण जो/बंद जब जाँच की स्थिति परिवर्तन पर जाँच आइकन एनिमेट होने स्टोरीबोर्ड एनिमेशन के साथ एक नियंत्रण टेम्पलेट है। चेक किए गए राज्य में परिवर्तन के रूप में आप ObservableCollection के लिए बाध्य कर रहे हैं और ItemsSource जो खड़ी कर रहा है नई स बनाया जाना पुनः (IsChecked = false साथ) और अपने ViewModel (जो शायद IsChecked = सच में परिणाम है) करने के लिए बाध्य।

इस 'सुविधा' आप संशोधित कर सकते हैं या तो आप कैसे एक ObservableCollection भरने, या अगर यह संभव नहीं है, तो आप चेकबॉक्स का टेम्पलेट/शैली को बदल सकते हैं अक्षम करने के लिए।

बस चेकबॉक्स के नियंत्रण टेम्पलेट (मिश्रण का उपयोग करके, या WPF थीम्स में से किसी एक का उपयोग करके) को रिवर्स इंजीनियर करें और इन पंक्तियों को ढूंढें। आप शून्य

<!-- Inside the CheckBoxTemplate ControlTemplate --> 
<Storyboard x:Key="CheckedTrue"> 
    <DoubleAnimationUsingKeyFrames Storyboard.TargetName="CheckIcon" 
          Storyboard.TargetProperty="(UIElement.Opacity)"> 
     <SplineDoubleKeyFrame KeyTime="00:00:00.1000000" Value="1" /> 
    </DoubleAnimationUsingKeyFrames> 
</Storyboard> 
<Storyboard x:Key="CheckedFalse"> 
    <DoubleAnimationUsingKeyFrames Storyboard.TargetName="CheckIcon" 
          Storyboard.TargetProperty="(UIElement.Opacity)"> 
     <SplineDoubleKeyFrame KeyTime="00:00:00.4000000" Value="0" /> 
    </DoubleAnimationUsingKeyFrames> 
</Storyboard> 
करने के लिए दो एनिमेशन की अवधि निर्धारित करने की आवश्यकता
संबंधित मुद्दे