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

时间:2013-11-23 23:47:49

标签: c# wpf xaml visual-studio-2012

我在为XAML窗口指定图标时发现了WPF XAML中的错误,尝试运行该程序会在该行上生成错误消息:

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

发生XamlParseException

  

为'System.Windows.Baml2006.TypeConverterMarkupExtension'提供了一个异常。行号“5”和行位置“100”。

我在Always Create上将图标设置为Copy To Output Directory,但没有运气 我将图标从Resource更改为EmbeddedResource - 也没有运气。
我将它添加到项目的Resources - 仍然没有运气 我已经验证了文件,它的位置是100% 窗口的XAML正确,名称正确,路径正确。

Icon="Resources/VisualizerIcon.ico" 

Stumped - 在线论坛上说复制到输出目录是解决方案,但是,在构建解决方案之后,只复制了文件夹(即使我明确设置要复制的ICO文件)。

任何?

5 个答案:

答案 0 :(得分:4)

首先,我很高兴你找到了解决方案。似乎这里并不是很多人试图找到解决问题的方法,而是等待其他人找到问题。

话虽如此,为什么不使用项目设置进行设置(右键单击项目,然后选择“属性”)?

如截图所示: enter image description here

我发现它更简单,无需代码,而且有效......

答案 1 :(得分:1)

只需将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">

答案 2 :(得分:1)

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

enter image description here

我知道这是一篇旧帖子,只是想分享一个假的错误..

答案 3 :(得分:0)

这是我提出的(不优雅,但它有效) 在窗口的加载事件中:

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

辅助函数:

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

DeleteObject代码:

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

答案 4 :(得分:0)

尝试检查内部异常。如果呼叫站点如下:

  

在System.Windows.Media.Imaging.BitmapSource.CriticalCopyPixels(System.Windows.Int32Rect,IntPtr,Int32,Int32)     在System.Windows.Media.Imaging.BitmapSource.CriticalCopyPixels(System.Windows.Int32Rect,System.Array,Int32,Int32)     在System.Windows.Media.Imaging.BitmapSource.CopyPixels(System.Windows.Int32Rect,System.Array,Int32,Int32)     在System.Windows.Media.Imaging.BitmapSource.CopyPixels(System.Array,Int32,Int32)     在MS.Internal.AppModel.IconHelper.CreateIconHandleFromBitmapFrame(System.Windows.Media.Imaging.BitmapFrame)     在MS.Internal.AppModel.IconHelper.CreateIconHandleFromImageSource(System.Windows.Media.ImageSource,System.Windows.Size)     在MS.Internal.AppModel.IconHelper.GetIconHandlesFromImageSource(System.Windows.Media.ImageSource,IconHandle ByRef,IconHandle ByRef)     在System.Windows.Window.UpdateIcon()     在System.Windows.Window.SetupInitialState(Double,Double,Double,Double)     在System.Windows.Window.CreateSourceWindow(布尔)     在System.Windows.Window.ShowHelper(System.Object)     在System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate,System.Object,Int32)     在System.Windows.Threading.ExceptionWrapper.TryCatchWhen(System.Object,System.Delegate,System.Object,Int32,System.Delegate)     在System.Windows.Threading.DispatcherOperation.InvokeImpl()     在System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext,System.Threading.ContextCallback,System.Object,Boolean)     在System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext,System.Threading.ContextCallback,System.Object,Boolean)     在System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext,System.Threading.ContextCallback,System.Object)     在MS.Internal.CulturePreservingExecutionContext.Run(MS.Internal.CulturePreservingExecutionContext,System.Threading.ContextCallback,System.Object)     在System.Windows.Threading.DispatcherOperation.Invoke()     在System.Windows.Threading.Dispatcher.ProcessQueue()     在System.Windows.Threading.Dispatcher.WndProcHook(IntPtr,Int32,IntPtr,IntPtr,Boolean ByRef)     在MS.Win32.HwndWrapper.WndProc(IntPtr,Int32,IntPtr,IntPtr,Boolean ByRef)     在MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object)     在System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate,System.Object,Int32)     在System.Windows.Threading.ExceptionWrapper.TryCatchWhen(System.Object,System.Delegate,System.Object,Int32,System.Delegate)     在System.Windows.Threading.Dispatcher.LegacyInvokeImpl(System.Windows.Threading.DispatcherPriority,System.TimeSpan,System.Delegate,System.Object,Int32)     在MS.Win32.HwndSubclass.SubclassWndProc(IntPtr,Int32,IntPtr,IntPtr)     在MS.Win32.UnsafeNativeMethods.DispatchMessage(System.Windows.Interop.MSG ByRef)     在System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame)     在System.Windows.Application.RunDispatcher(System.Object)     在System.Windows.Application.RunInternal(System.Windows.Window)     在ClientLauncher.App.Main()

然后你可能遇到像this这样的bug,除了它可能发生在更新的操作系统上,比如Windows 10.我们的一些客户在Windows 10机器上遇到了这种崩溃。

解决方案是简化图标文件,不要让它包含大于64 * 64的帧,或者只是使用PNG作为窗口图标。话虽这么说,高分辨率图标仍然可以用作app图标。