问题
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?
void 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;
}
}
回答1:
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;
}
回答2:
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).
回答3:
Something like:
BitmapImage myBitmapImage = new BitmapImage(new Uri("../../../../Images/folder.png", UriKind.Relative));
myBitmapImage.CacheOption = BitmapCacheOption.OnLoad;
Image.Source = myBitmapImage;
回答4:
You probably want to return a BitmapSource. This MSDN article has an example of how to create a BitmapSource from an image file.
回答5:
Consider using an EventTrigger to do this completely in XAML instead of messing with magic strings in the code behind.
This link would help
回答6:
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;
}
回答7:
var converter = new Xamarin.Forms.ImageSourceConverter();
var imgSource = (Xamarin.Forms.ImageSource) converter.ConvertFromInvariantString(item.Poster);
来源:https://stackoverflow.com/questions/1904956/cannot-convert-string-to-imagesource-how-can-i-do-this