发布后图标无法使用

5

我有一个简单的应用程序。当你点击一个按钮时,任务栏图标会改变。当我从Visual Studio运行这个应用程序时,一切都正常,但是当我发布WPF应用程序时,任务栏图标不起作用(没有图标)。

构建操作设置为“嵌入资源/始终复制”,我已经测试过“资源”,但它不起作用。

var iconUri = new Uri("pack://application:,,,/images/internet_connection.ico", UriKind.RelativeOrAbsolute);
        this.Icon = BitmapFrame.Create(iconUri);

框架左上角的图标会发生变化,但任务栏中的图标没有变化。

有人能帮我吗?

@编辑,

多亏了@Pavel的评论,我已经解决了问题。但现在还存在一个问题:

当我在Visual Studio中运行它时,我这样做:

var iconUri = UriHelper.GetUri(this.GetType(), "images/local_network.ico");
        this.Icon = BitmapFrame.Create(iconUri);

图标会发生变化。但在发布版本中,它不会改变。
@@编辑,
好的,这是我按下按钮时的代码:
  var iconUri = UriHelper.GetUri(this.GetType(), "images/internet_connection.ico");
        this.Icon = BitmapFrame.Create(iconUri);
        mNotifyIcon = new NotifyIcon
        {
            BalloonTipText = "The app has been minimised. Click the tray icon to show.",
            BalloonTipTitle = "The App",
            Text = "The App",
            Icon = BitmapFrame.Create(iconUri)
        };

        BitmapImage image = new BitmapImage();
        image.BeginInit();
        image.UriSource = UriHelper.GetUri(this.GetType(), "images/internet_connection.png");
        image.EndInit();
        TaskbarItemInfo = new System.Windows.Shell.TaskbarItemInfo() { Overlay = image };

它是用来干什么的:

在从VS中运行时:任务栏中的图标会改变,叠加功能正常工作,应用程序右上角的图标也会改变。

在编译后运行exe时:任务栏中的图标不会改变,叠加功能正常工作,应用程序右上角的图标会改变。

有人能解释一下这是为什么吗?


我记得曾经有一个类似的问题,但是具体细节我不太记得了。好像跟包没有在 bin 文件夹里或者资源没有在包内的 bin 文件夹里有关。不过现在没时间查找了,抱歉。 - shawty
2个回答

2

尝试将构建操作设置为“资源”并使用助手:

public static class UriHelper
{
    /// <summary>
    /// Gets absulute URI for provided relative path
    /// </summary>
    /// <param name="baseType">Base type for ussage as URI root</param>
    /// <param name="relativePath">Relative path</param>
    /// <returns>Absolute Uri</returns>
    public static Uri GetUri(Type baseType, string relativePath)
    {
        Assembly oAssembly = Assembly.GetAssembly(baseType);
        AssemblyName oName = oAssembly.GetName();
        return new Uri( 
                String.Format(
                    "pack://application:,,,/{0};v{1};component/{2}",
                    oName.Name,
                    oName.Version.ToString(),
                    relativePath), 
                UriKind.Absolute);
    }
}

基本类型变量是什么? - Nealv
@Nealv baseType 是附加资源的程序集中的任何类型。 - Pavel Korsukov
好的,谢谢你已经完成了这项工作,但是我还有一个问题。你能帮忙检查一下我提问的编辑吗?拜托了。 - Nealv
@Nealv 你在发布之前是否重建了整个解决方案?在配置管理器中,发布构建配置的生成标志是否已经为你的项目勾选?看起来你在服务器上部署了旧的程序集。 - Pavel Korsukov
是的,我正在进行新构建,并且构建标志被选中。 - Nealv
@Nealv,我非常确定代码没有问题。发布问题总是与缓存有关。如果您使用click once进行应用程序交付,请确保正确设置缓存。如果您使用安装项目,请记得重新构建解决方案,然后重新构建和发布安装项目。无论如何,您都可以使用ILSpy检查已发布的程序集,以确保代码在发布后存在。 - Pavel Korsukov

2
我认为这行对你有用(你忘记了...;component/...):
var iconUri = new Uri("pack://application:,,,/YourProjectName;component/images/internet_connection.ico", UriKind.RelativeOrAbsolute);

关于图标的使用:

Build Action = Resource
Copy to OutputDirectory = Do not copy

这会导致错误,即使在 Visual Studio 运行时也是如此。以前它在 Visual Studio 中运作正常。 - Nealv
通过运行这一行:iconUri = new Uri("pack://application:,,,/SwitchLive;component/images/local_network.ico", UriKind.Relative); 我得到了以下错误信息:'SwitchLive.MainWindow' 类型的构造函数的调用与指定的绑定约束不符合,因此抛出异常。位于第3行,第9个位置。 - Nealv
那个问题已经解决了,我有一个新的问题,请问你能看一下我的@Edit吗? :) - Nealv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接