在WPF XAML窗口上添加图标导致错误/崩溃VS 2012

yduiuuwa  于 2022-12-07  发布在  其他
关注(0)|答案(5)|浏览(167)

我在WPF XAML中发现了一个错误,当为XAML窗口指定图标时,尝试运行程序会生成一条错误消息,内容如下:

System.Windows.Application.LoadComponent(Me, resourceLocater)

发生XamlParseException
在“System.Windows.Baml2006.TypeConverterMarkupExtension”上提供值时引发了异常。行号为“5”,行位置为“100”。
我已经在Copy To Output Directory上将图标设置为Always Create,但没有成功。
我把图标从Resource改成了EmbeddedResource-也没有运气。
我把它添加到项目的Resources中-仍然没有运气。
我已经100%确认了文件和位置。
窗口的XAML正确,名称正确,路径正确。

Icon="Resources/VisualizerIcon.ico"

网上论坛说Copy to output Directory是解决方案,但是,在构建解决方案之后,只复制了文件夹(即使我明确设置了要复制的ICO文件)。
有没有人?

c3frrgcw

c3frrgcw1#

您只需要将实际图像/图标的构建操作设置为Resource,如属性窗口中所示。

我知道这是一个老职位,只是想分享一个虚拟错误。

s3fp2yjn

s3fp2yjn2#

您可以使用项目设置对其进行设置(右键单击项目,然后选择"属性")
如以下屏幕截图所示:

我发现它更简单,不需要代码,而且它很好用...

j2cgzkjk

j2cgzkjk3#

请尝试检查内部异常。如果调用位置类似于:
在系统. Windows.媒体.图像.位图源.关键副本像素(系统. Windows. Int32矩形,IntPtr,Int32,Int32)位于系统. Windows.媒体.图像处理.位图源.关键副本像素(系统. Windows. Int32矩形,系统.数组,Int32,Int32)位于系统. Windows.媒体.图像.位图源.复制像素(系统. Windows. Int32矩形,系统.数组,Int32,Int32)位于系统. Windows.媒体.图像.位图源.复制像素(系统.数组,Int32,Int32)在MS.内部.应用程序模型. IconHelper.从位图帧创建IconHandleFromBitmapFrame(系统. Windows.媒体.图像.位图帧)在MS.内部.应用程序模型.图标助手.从图像源创建图标句柄(系统.窗口.媒体.图像源,系统.窗口.大小)位于MS.内部.应用程序模型.图标助手.从图像源获取图标句柄(系统.窗口.媒体.图像源,按引用的图标句柄,按引用的图标句柄)在系统.窗口.窗口.更新图标()位于系统.窗口.窗口.设置初始状态(双、双、双、在系统.窗口.窗口.创建源窗口中双击(布尔值)在系统.窗口.窗口.显示助手(系统.对象)在系统.窗口.线程.异常 Package .内部RealCall(系统.委托,系统.对象,Int32)在系统.窗口.线程.异常 Package . TryCatchWhen(系统.对象,系统.委托,系统.对象,Int32,在系统.窗口.线程.调度程序操作.调用实现中()位于系统.线程.执行上下文.运行内部(系统.执行绪.执行内容,系统.执行绪.内容回呼,系统.对象,布林值)于系统.执行绪.执行(系统.执行绪.执行内容,系统.执行绪.内容回呼,系统.对象,布林值)于系统.执行绪.执行(系统.线程.执行上下文,系统.线程.上下文回调,系统.对象)位于MS.内部.区域性保留执行上下文.运行(MS.内部.文化保留执行上下文,系统.线程.上下文回调,系统.对象)在系统.窗口.线程.调度程序操作.调用()位于系统. Windows.线程.调度程序.进程队列()位于系统. Windows.线程.调度程序. WndProcHook在MS.Win32.HwndWrapper.WndProc中的(内部指针、内部32、内部指针、内部指针、布尔型ByRef)(内部指针,内部32,内部指针,内部指针,在MS.Win32.HwndSubclass.DispatcherCallbackOperation中的布尔型ByRef)(系统.对象)在系统.窗口.线程.异常 Package .内部RealCall(系统.委托,系统.对象,Int32)在系统.窗口.线程.异常 Package . TryCatchWhen(系统.对象,系统.委托,系统.对象,Int32,系统.委托)(系统. Windows.线程.调度程序优先级,系统.时间跨度,系统.委托,系统.对象,Int32)at MS.Win32.HwndSubclass.SubclassWndProc(内部指针、内部32、内部指针、在MS.Win32上的IntPtr)。不安全的本机方法。调度消息(系统.窗口.互操作.消息ByRef)位于系统.窗口.线程.调度程序. PushFrameImpl(系统. windows .执行绪.分派器框架)位于系统. windows .应用程序.执行分派器(系统.对象)在系统.窗口.应用程序.运行内部(系统.窗口.窗口)在客户端启动器.应用程序.主()
那么你可能会遇到像this这样的错误,除了它可能发生在更新的操作系统上,比如Windows 10。我们的一些客户端在Windows 10机器上有这种崩溃。
解决方案是简化图标文件,不要让它包含大于64 * 64的框架,或者简单地使用PNG作为窗口图标。尽管如此,高分辨率图标仍然可以用作应用图标。

nnt7mjpx

nnt7mjpx4#

只需将Resources compile属性设置为Resources。

<Image width="80" Height="80" Source="Resources/my_image.png"/>

或窗口图标

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:MyApplication" x:Name="Main_Window" x:Class="MainWindow"
    Title="MainWindow" Height="600" Width="800" Icon="Resources/icon.ico">
krugob8w

krugob8w5#

下面是我在窗口的loaded事件中想到的内容(不优雅,但很有效):

Private Sub TileLayout_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
    Me.winTileLayout.Icon = Bitmap2BitmapSource(My.Resources.VisualizerIcon.ToBitmap)
End Sub

和helper函数:

Public Shared Function Bitmap2BitmapSource(bmp As System.Drawing.Bitmap) As BitmapSource
    Dim retval As BitmapSource = Nothing
    Dim hBitmap As IntPtr = bmp.GetHbitmap()
    Try
        retval = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions())
    Catch ex As Win32Exception
        retval = Nothing
    Finally
        DeleteObject(hBitmap)
    End Try
    Return retval
End Function

删除对象代码:

<System.Runtime.InteropServices.DllImport("gdi32.dll")> _
Public Shared Function DeleteObject(hObject As IntPtr) As Boolean
End Function

相关问题