2009-12-15 1 views
4
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; 
     } 
    } 

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

Редактировать: Я сделал это в 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; 
     } 
    } 

ответ

6

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

Эта ссылка может помочь: Setting WPF image source in code

Edit:

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

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

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

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

I» м не следует. Я создал новый ImageSource внутри метода, но я все еще не могу добавить строковое значение, поэтому я возвращаюсь к квадрату. : D –

+2

В коде, который я вижу, вы возвращаете строку, а не новый ImageSource. Не включали ли вы часть кода, который создает новый ImageSource? возвращение «HeroGlowIcons/64px-Andromeda.gif»; // <- Возврат строки –

+0

Ум ... Я тестировал код, очень похожий на этот код в Windows Form. Я собираюсь изменить свой вопрос, и, надеюсь, мои намерения будут намного яснее. : D –

2

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

2

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

BitmapImage myBitmapImage = новый BitmapImage (новый Uri ("../../../../ Images/folder.png", UriKind.Relative));

myBitmapImage.CacheOption = BitmapCacheOption.OnLoad;

Image.Source = myBitmapImage;

+0

Но если я это сделаю, я бы создал новое растровое изображение и копировал его в новую переменную. Я просто хочу ссылаться на него с помощью строки, подобной той, что я делал во время компоновки Image.Source = "blablabla", правильно? Могу ли я преобразовать строку в ImageSource? –

+0

Макет делает что-то похожее на это во время выполнения. –

+0

Папучино, это то же самое. Вы загружаете существующее изображение в BitmapImage. В любом случае, объект C# должен быть создан во время выполнения из файла. –

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

0

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

This link would help

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; 
} 
0
var converter = new Xamarin.Forms.ImageSourceConverter(); 
var imgSource = (Xamarin.Forms.ImageSource) converter.ConvertFromInvariantString(item.Poster); 
+3

Было бы здорово добавить некоторое описание к вашему кода, поэтому другие пользователи могут это понять. – beerwin

 Смежные вопросы

  • Нет связанных вопросов^_^