“Cannot convert string to ImageSource.” How can I do this?

流过昼夜 提交于 2019-12-01 06:38:58
Cory Charlton

In your GetGlowingImage() method you need to generate a new ImageSource

This link might help: Setting WPF image source in code

Edit:

See the difference here is that in the WindowsForms code you have the Properties.Resources._64px_Andromedahero___copia is the name of an Image variable that contains the image data. In your WPF code the string "filename...." is not an image or image source it's just a string that represents the path to the file. You need to load the image file using that path.

I know it doesn't make sense because at design time you can specify a filename and it builds the ImageSource for you. In code you need to create the ImageSource (or derived object, ie: BitmapSource) and load the appropriate image into it.

Edit: Try this, untested (and check my link above):

    public ImageSource GetGlowingImage(string name)
    {
        string fileName = string.Empty;

        switch (name)
        {
            case "Andromeda":
                {
                    fileName = "HeroGlowIcons/64px-Andromeda.gif";
                    break;
                }
        }

        BitmapImage glowIcon = new BitmapImage();


        glowIcon.BeginInit();
        glowIcon.UriSource = new Uri("pack://application:,,,/ApplicationName;component/" + fileName);
        glowIcon.EndInit();

        return glowIcon;
    }
itowlson

Going by your edit, you are happy to have a static set of images in resources. If that's correct, you can do this:

<Application.Resources>
  <BitmapImage x:Key="andromeda64" UriSource="andromeda_64px.jpg" />
</Application.Resources>

then load it as:

public ImageSource GetGlowingImage(string name)
{
  switch (name)
  {
    case "Andromeda":
      return (ImageSource)FindResource("andromeda64");
    default:
      return null;
  }
}

FindResource requires you to be in code-behind for something in the visual tree (e.g. an event handler). If this isn't the case, or if you want to be able to load things that aren't in a resource dictionary, see Cory's answer. The advantage of using and reusing resources is that you don't need to create a BitmapImage each time you use it (though in this case the overhead cost of doing so will be insignificant).

Daniel

Something like:

BitmapImage myBitmapImage = new BitmapImage(new Uri("../../../../Images/folder.png", UriKind.Relative));
myBitmapImage.CacheOption = BitmapCacheOption.OnLoad;
Image.Source = myBitmapImage;

You probably want to return a BitmapSource. This MSDN article has an example of how to create a BitmapSource from an image file.

Consider using an EventTrigger to do this completely in XAML instead of messing with magic strings in the code behind.

This link would help

abbaty48

for more if you intent to change the background of a Grid or other Panel that support System.Windows.Media.Brush with a click of a button

private void btnBackgroundImage_Click(object sender, RoutedEventArgs e)
{
    OpenFileDialog dlg = new OpenFileDialog();
    dlg.Filter = "Image Files (*.bmp;*.png;*.jpg;)|*.bmp;*.png;*.jpg";
    dlg.Multiselect = false;
    dlg.RestoreDirectory = true;

    if (dlg.ShowDialog() == true)
    {
        txtBackImageName.Text = dlg.FileName;
        _layoutRoot.Background = new System.Windows.Media.ImageBrush(GetImageSource(dlg.FileName));
    }
}


public ImageSource GetImageSource(string filename)
{
    string _fileName = filename;

    BitmapImage glowIcon = new BitmapImage();

    glowIcon.BeginInit();
    glowIcon.UriSource = new Uri(_fileName);
    glowIcon.EndInit();

    return glowIcon;
}
var converter = new Xamarin.Forms.ImageSourceConverter();
var imgSource = (Xamarin.Forms.ImageSource) converter.ConvertFromInvariantString(item.Poster);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!