Silverlight 渲染变换闪烁
参见下面的代码, 单击按钮后,listbox渲染了几次。 如何防止列表框闪烁? 是否可以告诉控件停止更新/渲染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
<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)),
}
);
}
}
}