“无法将字符串转换为ImageSource。”我怎样才能做到这一点?

时间:2009-12-15 03:14:49

标签: c# wpf image mouseevent

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窗体中执行此操作,它可以像我想要的那样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 个答案:

答案 0 :(得分:6)

GetGlowingImage()方法中,您需要生成新的ImageSource

此链接可能有所帮助:Setting WPF image source in code

修改

这里的区别在于,在WindowsForms代码中,您有Properties.Resources._64px_Andromedahero ___ copia是包含图像数据的Image变量的名称。在您的WPF代码中,字符串“filename ....”不是图像或图像源,它只是表示文件路径的字符串。您需要使用该路径加载图像文件。

我知道这没有意义,因为在设计时你可以指定文件名并为你构建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;
    }

答案 1 :(得分:3)

类似的东西:

BitmapImage myBitmapImage = new BitmapImage(new Uri("../../../../Images/folder.png", UriKind.Relative));
myBitmapImage.CacheOption = BitmapCacheOption.OnLoad;
Image.Source = myBitmapImage;

答案 2 :(得分: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(尽管在这种情况下,这样做的开销成本是微不足道的。)

答案 3 :(得分:2)

您可能想要返回BitmapSource。这个MSDN article有一个如何从图像文件创建BitmapSource的示例。

答案 4 :(得分:0)

考虑使用EventTrigger在XAML中完全执行此操作,而不是在后面的代码中弄乱魔术字符串。

This link would help

答案 5 :(得分:0)

如果您打算通过单击按钮更改支持System.Windows.Media.Brush的Grid或其他Panel的背景,可获取更多信息

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

答案 6 :(得分:0)

var converter = new Xamarin.Forms.ImageSourceConverter();
var imgSource = (Xamarin.Forms.ImageSource) converter.ConvertFromInvariantString(item.Poster);