如果绑定的图片源为空,如何设置默认的图片源?

22

我正在使用数据绑定作为Image控件的源。

<Image Source="{Binding ImageUri}"/>

但是这个 ImageUri 可能为空,因此我想为它使用一个默认图像,一个占位符,例如可以在/Assets/PlaceHolder.png 中。

我该如何设置默认图像?谢谢。 (这是一个 WP8 应用程序,但不应与 WPF 不同)

7个回答

34

您可以通过设置TargetNullValue来实现。

<Image>
    <Image.Source>
        <Binding Path="ImageUri" >
            <Binding.TargetNullValue>
                <ImageSource>/Assets/PlaceHolder.png</ImageSource>
            </Binding.TargetNullValue>
        </Binding>
    </Image.Source>
</Image>

1
我有一个应用程序,它会加载数百张图片。如何在实际图片加载之前显示默认图片? - Arjun K R
@ArjunKR 你可能想访问http://stackoverflow.com/questions/19113141/is-it-possible-to-show-default-image-before-original-load-from-server - Fandi Susanto
太棒了!WPF 从简单优雅到令人沮丧的冗长,总能让我惊叹不已。 - Holf
1
只是为了补充一下,"ImageUri" 是绑定路径,指的是 Image 控件数据上下文中的属性 "ImageUri",可以更改为适当的路径 -- 它不是 ImageSource 的一部分。 我还必须将我的 ImageSource 指定为程序集 uri 才能使它正常工作:/AssemblyName;component/Images/Placeholder.png - Slate

4

在我的看法中,您可以采用更好的方式,即通过在Grid布局中使用两个Image控件,一个带有本地占位符源,另一个带有远程Binding。当您的远程绑定为null时,本地图像已经存在。但是,如果绑定不为null,则一旦它被呈现,它会自动覆盖本地占位符图像。

<Grid>
    <Image Source="Assets/Placeholder.png"/>
    <Image Source="{Binding ImageUri}"/>
</Grid>

这在理论上是可行的,但我的图像具有透明背景。这意味着我可以看到其他图像下面的图像。我该如何隐藏下面的图像? - Sweepster
@Sweepster 尝试使用绑定图像的 ImageOpened 事件。如果数据绑定事件的图像打开事件成功触发,则将占位符图像的不透明度设置为0! - Shikhar

3
您可以在图像上设置ImageFailed事件。
<Image Source="{Binding ImageUri}" ImageFailed="Image_ImageFailed"/>

使用以下C#代码来加载特定图像。

private void Image_ImageFailed(object sender, ExceptionRoutedEventArgs e)
{
    ((Image)sender).Source = new BitmapImage(new Uri("/Assets/MyDefaultImage.png", UriKind.Relative));
}

2
你可以尝试这样做:

最初的回答:

<Image>
    <Image.Source>
        <Binding Path="ImageUri">
            <Binding.TargetNullValue>
                <BitmapImage UriSource="/ProjName;component/Assets/PlaceHolder.png" />                    
            </Binding.TargetNullValue>
        </Binding>
    </Image.Source>
</Image>

1
你可以使用 ImageFailed 事件和 ChangePropertyAction
这段代码片段对我有用:
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"

<Image x:Name="GeologyMapsLegend" Stretch="Fill" Height="150">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="ImageFailed">
            <ei:ChangePropertyAction PropertyName="Source" TargetName="GeologyMapsLegend">
                <ei:ChangePropertyAction.Value>
                    <ImageSource>
                        /LanSysWebGIS;component/Pictures/Icon/NoImageAvailable.jpg
                    </ImageSource>
                </ei:ChangePropertyAction.Value>
            </ei:ChangePropertyAction>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Image>

我有一个应用程序,它会加载数百张图片。如何在实际图片加载之前显示默认图片? - Arjun K R

1

使用TargetNullValue属性。如果我不想显示任何图像,这非常有帮助。


-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接