2010-01-05 16 views
7

WPF ListBox veya ListView'da işaretli onay kutularının titremesini nasıl önleyebilirim? Yenile düğmesine tıklayarak veya liste kutusunu kaydırarak aşağıdaki kodla çoğaltılabilir. IsChecked yanlışsa, titreme yapmaz.WPF: Bir CheckBox veya ListView'da işaretli onay kutularının titremesini nasıl önleyebilirim?

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; 
     } 
    } 
} 

cevap

2

onay kutusunu anlamına mı denetleniyor? Onay kutusunu işaretlediğinizde/ayarladığınızda animasyonu değiştirmeniz gerektiğini düşünüyorum.

O (Ben bir animasyon olduğunu düşünüyorum bu yüzden) Windows XP üzerinde oluşmaz, ben Vista :)

İyi şanslar test etmedim.

4

eski ItemsSource dışarı atma ve yenisini yaratıyor çünkü titriyor. Bu, tüm bağlanmanın yeniden yapılmasını gerektirir ve her öğeyi görüntüleyen şablonun yeniden oluşturulması gerekir. Tüm listeyi yeniden oluşturma performansının önüne geçmek için, mevcut ItemsSource'daki tek tek öğeleri değiştirin. Ardından, DataTemplate öğesinin değiştirilen özelliklere ve/veya öğelere bağlı kısmı, tüm liste görünümünü yeniden oluşturmaya gerek kalmadan otomatik olarak güncellenir. Bunu yapmak, gördüğünüz "titremeyi" ortadan kaldıracaktır.

codebehind için bu deneyin: Burada doğru cevabı vardır Snake'e

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.

Bu eklemek için:

CheckBox denetimi/kapalı iken kontrol durum değişiklikleri kontrol simgeyi canlandıran film şeridi animasyon ile bir kontrol şablonu vardır. Checked durumu, ObservableCollection'a bağlandığınız ve yeni Checkbox'ların oluşturulmasına neden olan (IsChecked = false ile) ve ViewModel'ınıza (muhtemelen IsChecked = True ile sonuçlanan) bağlı olan ItemsSource'unu yeniden oluştururken değişir.

bu 'özelliğini' Eğer bir ObservableCollection doldurmak nasıl değiştirebilir ya ya bu mümkün değil, sen Checkbox şablonu/stilini değiştirebilirsiniz devre dışı bırakın.

sadece CheckBox ControlTemplate (karışımını kullanarak, veya WPF temaları birini kullanarak) ve şu satırları bulmak üzerinde ters mühendislik. Eğer sıfır

<!-- 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> 
iki animasyonlar süresini ayarlamak gerekir