Вопрос по c#, mouseevent, image, wpf – «Не удается преобразовать строку в ImageSource». Как я могу это сделать?

5
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   ответов
2

BitmapSource, ЭтотСтатья MSDN есть пример того, как создатьBitmapSource из файла изображения.

0

поддерживающей 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;
}
3

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

<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 каждый раз, когда вы его используете (хотя в этом случае накладные расходы на это будут незначительными).

6

GetGlowingImage() метод, который вам нужно создать новыйImageSource

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

Редактировать:

Разница здесь в том, что в коде 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;
    }
К сожалению, WindowsForms имеет смысл и работает так, как вы ожидаете. WPF, с другой стороны, не делает ;-) Конечно, с WPF я могу сделать отличный интерфейс, но в большинстве случаев я обнаруживаю, что мне нужно прыгать через обручи, чтобы выполнить что-то простое. Cory Charlton
Хм ... Я тестировал код, очень похожий на этот в Windows Form. Я собираюсь отредактировать свой вопрос, и надеюсь, что мои намерения будут намного яснее. : D Sergio Tapia
Я не следую. Я создал новый ImageSource внутри метода, но все еще не могу добавить строковое значение, поэтому я вернулся к исходной точке. : D Sergio Tapia
В коде, который я вижу, вы возвращаете строку, а не новый ImageSource. Разве вы не включили часть своего кода, которая создает новый ImageSource? return "HeroGlowIcons / 64px-Andromeda.gif"; // <- возвращаем строку Cory Charlton
0

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

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

3

BitmapImage myBitmapImage = new BitmapImage(new Uri("../../../../Images/folder.png", UriKind.Relative));
myBitmapImage.CacheOption = BitmapCacheOption.OnLoad;
Image.Source = myBitmapImage;
Макет делает что-то похожее на это во время выполнения. Cory Charlton
Папуччино, это делает то же самое. Вы загружаете существующее изображение в BitmapImage. В любом случае, объект C # должен быть создан во время выполнения из файла. Will Eddins
Но если я сделаю это, я буду создавать новое растровое изображение и копировать его в новую переменную. Я просто хочу сослаться на него через строку, аналогичную той, которую я делал во время макета Image.Source = "blablabla", верно? Есть ли способ для меня, чтобы преобразовать строку в ImageSource? Sergio Tapia
Если его изображения находятся в ResourceDictionary, он может получить к ним доступ по имени, используя FindResource, без необходимости создания нового BitmapImage. (Конечно, WPF по-прежнему будет создавать все эти образы при загрузке ресурсов, но это единовременная плата - не нужно платить каждый раз, когда он переключается.) itowlson
0
var converter = new Xamarin.Forms.ImageSourceConverter();
var imgSource = (Xamarin.Forms.ImageSource) converter.ConvertFromInvariantString(item.Poster);
Было бы здорово добавить описание в ваш код, чтобы другие пользователи могли его понять. beerwin

Похожие вопросы