"Невозможно преобразовать строку в ImageSource." Как я могу это сделать? - PullRequest
5 голосов
/ 15 декабря 2009
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;
        }
    }

Я просто пытаюсь создать событие, чтобы изменить изображение в соответствии с тем, куда вошла мышь. Но я не могу заставить эту работу.

Редактировать: я сделал это в Windows Forms, и он работает на 100%, как я хочу. Как я мог перевести что-то подобное в 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;
        }
    }

Ответы [ 7 ]

6 голосов
/ 15 декабря 2009

В вашем GetGlowingImage() методе вам нужно сгенерировать новый ImageSource

Эта ссылка может помочь: Настройка источника изображения WPF в коде

Edit:

Обратите внимание на то, что в коде WindowsForms у вас есть Properties.Resources._64px_Andromedahero ___ copia - это имя переменной Image, которая содержит данные изображения. В вашем коде WPF строка «имя файла ....» не является изображением или источником изображения, это просто строка, представляющая путь к файлу. Вам необходимо загрузить файл изображения, используя этот путь.

Я знаю, что это не имеет смысла, потому что во время разработки вы можете указать имя файла, и он создаст ImageSource для вас. В коде вам нужно создать ImageSource (или производный объект, т.е. BitmapSource) и загрузить в него соответствующее изображение.

Редактировать: Попробуйте это, не проверено (и проверьте мою ссылку выше):

    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;
    }
3 голосов
/ 15 декабря 2009

Исходя из ваших правок, вы счастливы иметь статический набор изображений в ресурсах. Если это правильно, вы можете сделать это:

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

затем загрузите его как:

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

FindResource требует, чтобы вы находились в выделенном коде для чего-то в визуальном дереве (например, обработчик событий). Если это не так, или если вы хотите иметь возможность загружать вещи, которых нет в словаре ресурсов, см. ответ Кори . Преимущество использования и повторного использования ресурсов состоит в том, что вам не нужно создавать BitmapImage каждый раз, когда вы его используете (хотя в этом случае накладные расходы будут незначительными).

3 голосов
/ 15 декабря 2009

Что-то вроде:

BitmapImage myBitmapImage = new BitmapImage(new Uri("../../../../Images/folder.png", UriKind.Relative));
myBitmapImage.CacheOption = BitmapCacheOption.OnLoad;
Image.Source = myBitmapImage;
2 голосов
/ 15 декабря 2009

Вы, вероятно, хотите вернуть BitmapSource. В этой статье MSDN приведен пример создания BitmapSource из файла изображения.

0 голосов
/ 29 ноября 2016
var converter = new Xamarin.Forms.ImageSourceConverter();
var imgSource = (Xamarin.Forms.ImageSource) converter.ConvertFromInvariantString(item.Poster);
0 голосов
/ 25 ноября 2015

, если вы хотите изменить фон сетки или другой панели, поддерживающей System.Windows.Media.Brush, одним нажатием кнопки

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;
}
0 голосов
/ 15 декабря 2009

Подумайте об использовании EventTrigger, чтобы сделать это полностью в XAML, вместо того, чтобы возиться с волшебными строками в коде.

Эта ссылка поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...