开发者

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

开发者 https://www.devze.com 2022-12-14 13:05 出处:网络
private void HeroMouseEnter(object sender, MouseEventArgs e) { ((Image)sender).Source = GetGlowingImage(((Image)sender).Name);
private void HeroMouseEnter(object sender, MouseEventArgs e)
    {
        ((Image)sender).Source = GetGlowingImage(((Image)sender).Name);            
    }

    public ImageSource GetGlowingImage(string name)
    {
        switch (name)
        {
            case "Andromeda":
                return "HeroGlowIcons/64px-Andromeda.gif";                
            default:
                return null;
        }
    }

I'm just trying to make an event to change the image according to where the mouse entered. But I cannot make this work.

Edit: I did this in Windows Forms and it work 100% like I want it to. How could I translate something like this in WPF?

v开发者_JAVA技巧oid HeroMouseEnter(object sender, EventArgs e)
    {
        ((PictureBox)sender).Image = GetGlowingImage(((PictureBox)sender).Name);           
    }


    public Image GetGlowingImage(string name)
    {
        switch (name)
        {
            case "Andromeda":
                return Properties.Resources._64px_Andromedahero___copia;
            case "Engineer":
                return Properties.Resources._64px_Engineerhero___copia;
            default:
                return null;
        }
    }


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;
    }


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).


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


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);
0

精彩评论

暂无评论...
验证码 换一张
取 消