C# 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

我有一个Windows RT应用程序,可以通过编程方式更改
图像
组件中的位图。所有这些都可以很好地使用
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;
}