我的一个WPF应用程序存在一个相当奇怪的问题:
我将ControlTemplate
声明为静态资源,我可以在Visual Studio Designer中使用它 - 但在运行时,无法找到资源。
我的WPF代码(缩写):
<Window xmlns:PlatformUI="clr-namespace:Microsoft.Internal.VisualStudio.PlatformUI;assembly=Microsoft.VisualStudio.Shell.12.0"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
...
x:Class="U6656.WebWindow"
... >
<Window.Resources>
<ControlTemplate x:Key="tmplt" x:Name="tmplt" TargetType="Label">
<Label .... >
....
</Label>
</ControlTemplate>
</Window.Resources>
<Grid>
<Label x:Name="lb_test" Template="{StaticResource tmplt}"/>
</Grid>
</Window>
提到 - 它在设计师内部完美运行并且编译没有问题。
但是,我得到XAMLParseException
(基础异常为KeyNotFoundException
)。
我也试过以下(仍然没有运气):
Template={...}
- 属性
我在InitializeComponent()
之后添加了以下代码 - 致电:
lb_test.Template = this.TryFindResource(“tmplt”)as ControlTemplate;
现在真的很奇怪:
IntelliSense指示,字段this.Resources
不为空 - 而且:它具有应有的资源。尽管如此 - 上面的小行再次以KeyNotFoundException
失败。
编辑№1:以下是异常转储:
System.Collections.Generic.KeyNotFoundException wurde nicht behandelt.
HResult=-2146232969
Message=Der angegebene Schlüssel war nicht im Wörterbuch angegeben.
Source=PresentationFramework
StackTrace:
bei System.Windows.Baml2006.Baml2006SchemaContext.GetDependencyProperty(Int16 propertyId)
bei System.Windows.Baml2006.Baml2006Reader.Process_PropertyWithExtension()
bei System.Windows.Baml2006.Baml2006Reader.Process_OneBamlRecord()
bei System.Windows.Baml2006.Baml2006Reader.ReadObject(KeyRecord record)
bei System.Windows.ResourceDictionary.CreateObject(KeyRecord key)
bei System.Windows.ResourceDictionary.OnGettingValue(Object key, Object& value, Boolean& canCache)
bei System.Windows.ResourceDictionary.OnGettingValuePrivate(Object key, Object& value, Boolean& canCache)
bei System.Windows.ResourceDictionary.GetValueWithoutLock(Object key, Boolean& canCache)
bei System.Windows.ResourceDictionary.GetValue(Object key, Boolean& canCache)
bei System.Windows.ResourceDictionary.get_Item(Object key)
bei U6656.WebWindow..ctor()
bei U6656.App.InnerStartUp(StartupEventArgs e)
bei U6656.App.OnStartup(StartupEventArgs e)
bei System.Windows.Application.<.ctor>b__1(Object unused)
bei System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
bei MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
bei System.Windows.Threading.DispatcherOperation.InvokeImpl()
bei System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Windows.Threading.DispatcherOperation.Invoke()
bei System.Windows.Threading.Dispatcher.ProcessQueue()
bei System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
bei MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
bei MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
bei System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
bei MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
bei System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
bei MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
bei MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
bei System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
bei System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
bei System.Windows.Threading.Dispatcher.Run()
bei System.Windows.Application.RunDispatcher(Object ignore)
bei System.Windows.Application.RunInternal(Window window)
bei System.Windows.Application.Run(Window window)
bei System.Windows.Application.Run()
bei U6656.App.Main()
InnerException:
编辑№2:使用IntelliSense观察this.Resources
的值时,我得到以下例外:
XAML-Knotenstream: StartObject fehlt vor StartMember
"System.Windows.Controls.ContentControl.Content".
表示
XAML node stream: StartObject is missing before StartMember
"System.Windows.Controls.ContentControl.Content".
答案 0 :(得分:1)
我有一个KeyNotFoundException,它带有一个在generic.xaml中定义的控件模板
引发的异常:PresentationFramework.dll中的“ System.Collections.Generic.KeyNotFoundException” 引发异常:System.Xaml.dll中的“ System.Xaml.XamlObjectWriterException” 抛出异常:PresentationFramework.dll中的“ System.Windows.Markup.XamlParseException”
从TemplateBinding切换到Binding RelativeSource = {RelativeSource TemplatedParent}解决了该问题。
答案 1 :(得分:0)
我想要,如果其他人找到了解决其他开发人员遇到同样问题的答案..... , 但我自己通过使用UserControl而不是模板控件来解决它。