Silverlight 渲染变换闪烁

Silverlight 渲染变换闪烁,silverlight,Silverlight,参见下面的代码, 单击按钮后,listbox渲染了几次。 如何防止列表框闪烁? 是否可以告诉控件停止更新/渲染 <UserControl x:Class="SilverlightApplication52.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/x

参见下面的代码, 单击按钮后,listbox渲染了几次。 如何防止列表框闪烁? 是否可以告诉控件停止更新/渲染

<UserControl x:Class="SilverlightApplication52.MainPage"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         mc:Ignorable="d"
         d:DesignHeight="300"
         d:DesignWidth="400">

<Grid x:Name="LayoutRoot"
      Background="Gray"
      HorizontalAlignment="Stretch"
      VerticalAlignment="Stretch">
    <ListBox x:Name="listbox"
             Background="White"
             Margin="100">
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas />
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">

            </Style>
        </ListBox.ItemContainerStyle>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Rectangle Width="{Binding Width}"
                           Height="{Binding Height}"
                           Fill="{Binding Background}"
                           RenderTransformOrigin="0.5,0.5">
                    <Rectangle.RenderTransform>
                        <TransformGroup>
                            <ScaleTransform ScaleX="{Binding Scale}"
                                            ScaleY="{Binding Scale}" />
                            <RotateTransform Angle="{Binding Angle}" />
                            <TranslateTransform X="{Binding Left}"
                                                Y="{Binding Top}" />
                        </TransformGroup>
                    </Rectangle.RenderTransform>
                </Rectangle>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    <Button Content="test"
            Width="50"
            Height="50"
            Click="Button_Click" />
</Grid>

public部分类主页面:UserControl
{
公共类ItemInfo
{
公共双左{get;set;}
公共双顶部{get;set;}
公共双宽度{get;set;}
公共双倍高度{get;set;}
公共双角度{get;set;}
公共双刻度{get;set;}
公共笔刷背景{get;set;}
}
ObservableCollection_items=新的ObservableCollection();
公共主页()
{
初始化组件();
listbox.ItemsSource=\u项;
}
随机=新随机();
私有无效按钮\u单击(对象发送者,路由目标e)
{
_items.Clear();
对于(int i=0;i<2000;i++)
{
字节r=(字节)(random.NextDouble()*255);
字节g=(字节)(random.NextDouble()*255);
字节b=(字节)(random.NextDouble()*255);
_项目。添加(
新项目信息
{
左=随机.NextDouble()*500,
Top=random.NextDouble()*500,
宽度=random.NextDouble()*1000,
高度=随机.NextDouble()*1000,
角度=随机.NextDouble()*359,
Scale=random.NextDouble()*1,
背景=新的SolidColorBrush(Color.FromArgb(255,r,g,b)),
}
);
}
}
}

尝试添加到该循环中的单独ObservableCollection(未引用/绑定到列表框)。然后,循环完成后,将listbox项资源分配给新的observablecollection。

谢谢,我尝试将listbox项资源分配给新的observablecollection。但这并没有帮助。看起来闪烁是由RenderTransform引起的,ListBox将在RenderTransform的绑定获得正确的绑定值(使用绑定的回退值)之前渲染一次,并再次使用更新的绑定值进行渲染。但是仍然不知道如何解决这个问题。发现了类似的问题
public partial class MainPage : UserControl
{
    public class ItemInfo
    {
        public double Left { get; set; }
        public double Top { get; set; }
        public double Width { get; set; }
        public double Height { get; set; }
        public double Angle { get; set; }
        public double Scale { get; set; }
        public Brush Background { get; set; }
    }

    ObservableCollection<ItemInfo> _items = new ObservableCollection<ItemInfo>();
    public MainPage()
    {
        InitializeComponent();
        listbox.ItemsSource = _items;

    }

    Random random = new Random();
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        _items.Clear();
        for (int i = 0; i < 2000; i++)
        {
            byte r = (byte)(random.NextDouble()*255);
            byte g = (byte)(random.NextDouble()*255);
            byte b = (byte)(random.NextDouble()*255);
            _items.Add(
                new ItemInfo
                {
                    Left = random.NextDouble() * 500,
                    Top = random.NextDouble() * 500,
                    Width = random.NextDouble() * 1000,
                    Height = random.NextDouble() * 1000,
                    Angle = random.NextDouble() * 359,
                    Scale = random.NextDouble() * 1,
                    Background = new SolidColorBrush(Color.FromArgb(255,r,g,b)),
                }
            );
        }
    }
}