未显示图像(位图)的 WPF 绑定到转换器

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/31276437/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-13 13:15:16  来源:igfitidea点击:

WPF Binding to converter for an Image (Bitmap) not showing

c#wpfdata-bindingconverterprism-5

提问by asuppa

I am having issues with an image not showing in a WPF control using a Converter to create the image from a local directory. Any direction on what I am doing wrong would be appreciated.

我在使用转换器从本地目录创建图像的 WPF 控件中未显示图像时遇到问题。任何关于我做错了什么的方向将不胜感激。

XAML

XAML

<UserControl x:Class="Coms.Views.ImageDetailView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:c="clr-namespace:Coms.Converter"
         mc:Ignorable="d" 
         d:DesignHeight="100" d:DesignWidth="300" Background="Wheat">
<Control.Resources>
    <c:ImageDetailConverter x:Key="converter" />
</Control.Resources>
<ListBox ItemsSource="{Binding icList}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Auto">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="100"/>
                    <ColumnDefinition Width="200"/>
                </Grid.ColumnDefinitions>
                <Image Name="imgBox" Width="auto" Height="auto" Grid.Column="0" Source="{Binding Converter={StaticResource converter}}" />
                <TextBlock Name="txtBlock2" Grid.Column="1" Text="{Binding coordinates}"/>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

class

班级

public class ImageDetail
{
    public string fileName { get; set; }
    public string coordinates { get; set; }
}

Converter

转换器

public class ImageDetailConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        IRuntimeConfigurations configs = ServiceLocator.Current.GetInstance<IRuntimeConfigurations>();
        return new Bitmap(Image.FromFile(Path.Combine(configs.rootImagePath, ((IImageDetail)value).fileName)));
    }
}

回答by Clemens

Your converter returns a System.Drawing.Bitmap, which is WinForms, not WPF.

您的转换器返回一个System.Drawing.Bitmap,它是 WinForms,而不是 WPF。

It should return a WPF ImageSource(e.g. a BitmapImage) instead:

它应该返回一个 WPF ImageSource(例如 a BitmapImage):

public object Convert(
    object value, Type targetType, object parameter, CultureInfo culture)
{
    var imageDetail = (ImageDetail)value;
    var configs = ServiceLocator.Current.GetInstance<IRuntimeConfigurations>();
    var path = Path.Combine(configs.rootImagePath, imageDetail.fileName);
    var uri = new Uri(path, UriKind.RelativeOrAbsolute);

    return new BitmapImage(uri);
}


Note also that WPF provides built-in type conversion from Uriand string(containing a valid URI) to ImageSource, so that your converter could also return the urior pathvalue.

另请注意,WPF 提供了从Uristring(包含有效的 URI)到 的内置类型转换ImageSource,因此您的转换器也可以返回uripath值。