C# Windows RT应用程序中的图像闪烁
我有一个Windows RT应用程序,可以通过编程方式更改C# Windows RT应用程序中的图像闪烁,c#,.net,windows-8,windows-runtime,winrt-xaml,C#,.net,Windows 8,Windows Runtime,Winrt Xaml,我有一个Windows RT应用程序,可以通过编程方式更改图像组件中的位图。所有这些都可以很好地使用XAML和下面的代码,除了图像更改时我们看到的闪烁 我应该改变什么来消除闪烁 XAML: <Page x:Class="iSurfBrainViewProto01.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/w
图像
组件中的位图。所有这些都可以很好地使用XAML
和下面的代码,除了图像更改时我们看到的闪烁
我应该改变什么来消除闪烁
XAML
:
<Page
x:Class="iSurfBrainViewProto01.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:iSurfBrainViewProto01"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="8*"/>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="4*" />
</Grid.ColumnDefinitions>
<Grid HorizontalAlignment="Center" VerticalAlignment="Top"
Margin="20,20,0,20">
<Grid.RowDefinitions>
<RowDefinition Height="8*"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid HorizontalAlignment="Left" Height="768"
VerticalAlignment="Top" Width="768">
<Image x:Name="image1" Source="BrainImg/axis/ax-128.jpg"/>
<Image x:Name="image2" Source="BrainImg/axis/ax-128.png"/>
</Grid>
<Slider HorizontalAlignment="Left" VerticalAlignment="Top"
Width="768" Grid.Row="1" Maximum="255" Value="128"
x:Name="slider1" ValueChanged="Slider_ValueChanged_1"/>
</Grid>
<Grid HorizontalAlignment="Left" VerticalAlignment="Top"
Grid.Column="1" Margin="0,10" MinHeight="768">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Button HorizontalAlignment="Left" VerticalAlignment="Top" Width="85"
Height="100" BorderThickness="0">
<Image Source="ax-1.jpg" />
</Button>
<Button HorizontalAlignment="Center" VerticalAlignment="Top"
Grid.Row="1" Width="85" Height="100" BorderThickness="0">
<Image Source="ax-2.jpg" />
</Button>
<Button HorizontalAlignment="Right" VerticalAlignment="Top"
Grid.Row="2" Width="85" Height="100" BorderThickness="0">
<Image Source="ax-3.jpg" />
</Button>
<Button HorizontalAlignment="Left" VerticalAlignment="Top"
Grid.Row="3" Width="85" Height="100" BorderThickness="0">
<Image Source="ax-4.jpg" />
</Button>
<Button HorizontalAlignment="Center" VerticalAlignment="Top"
Grid.Row="4" Width="85" Height="100" BorderThickness="0">
<Image Source="ax-5.jpg" />
</Button>
<Button HorizontalAlignment="Right" VerticalAlignment="Top"
Grid.Row="5" Width="85" Height="100" BorderThickness="0">
<Image Source="ax-6.jpg" />
</Button>
</Grid>
<Grid HorizontalAlignment="Left" VerticalAlignment="Top"
Grid.Column="2" Margin="10,10,0,0">
<Grid.RowDefinitions>
<RowDefinition Height="1*" />
<RowDefinition Height="7*"/>
</Grid.RowDefinitions>
<TextBlock Text="Structure Selected: This Struct"
HorizontalAlignment="Left" MinHeight="50" FontSize="26" />
<WebView Source="http://www.mywebsite.com"
HorizontalAlignment="Left"
Grid.Row="1" MinWidth ="500" MinHeight="760" />
</Grid>
</Grid>
</Page>
我看到的第一件事是,在将图像源设置为新值之前,不必要地将其设置为null,尽管这实际上可能并不重要。问题是下载/解码图像需要一段时间。因此,您应该在开始使用之前预加载所有图像(这可能会占用太多内存,因此不可行)或者使用两个图像控件代替一个,并将它们用作一种交换链,其中有一个可见图像和一个隐藏图像,并且当您要切换显示的图像时-更新隐藏图像的源,并且仅在加载位图后切换图像的可视性。但这可能并不简单,因为BitmapImage可能在宿主图像控件可见之前不会开始加载,因此您可能需要将不透明度设置为0.01,而不是将其完全隐藏,或者尝试使其可见,然后在加载位图之前立即不可见。如果位图已经加载-其像素宽度将大于0。我找到了解决方案
IRandomAccessStream stream = await storageFile.OpenAsync(FileAccessMode.Read);
BitmapImage bitmapImage = new BitmapImage();
if (await bitmapImage.SetSourceAsync(stream))
{
image1.source = bitmapImage;
}
这种方式不会闪烁。您的图像会闪烁,因为每次滑块上的值发生变化时,您都会对其进行更新。是否有其他方法来交换此图像?我正在尝试将一个iOS iPad应用程序移植到Windows RTX,您可以创建一个自定义图像控件,如我所述交换它们。我不确定还有别的办法。在将image.Source设置为新值之前,您是否尝试过不将其设置为null?是。我试过了,但运气不好。不幸的是,在iOS中使用
UIImageView
一切都很简单:(我想你也可以使用故事板,如下所示:
IRandomAccessStream stream = await storageFile.OpenAsync(FileAccessMode.Read);
BitmapImage bitmapImage = new BitmapImage();
if (await bitmapImage.SetSourceAsync(stream))
{
image1.source = bitmapImage;
}