我在为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文件)。
任何?
答案 0 :(得分:4)
首先,我很高兴你找到了解决方案。似乎这里并不是很多人试图找到解决问题的方法,而是等待其他人找到问题。
话虽如此,为什么不使用项目设置进行设置(右键单击项目,然后选择“属性”)?
如截图所示:
我发现它更简单,无需代码,而且有效......
答案 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)
答案 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图标。