c# - 运行时未找到资源 key ?

标签 c# wpf xaml resources

我的一个 WPF 应用程序有一个相当特殊的问题:

我将 ControlTemplate 声明为静态资源,我可以在 Visual Studio 设计器中使用它 - 但是在运行时找不到该资源。

我的 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={...}-Attribute
  • 我在 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".

最佳答案

我有一个 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} 解决了这个问题。

关于c# - 运行时未找到资源 key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34754918/

相关文章:

c# - 如何使用 Xamarin.Forms 显示相机流。是否可以?

c# - TransactionScope 在某些机器上自动升级到 MSDTC?

wpf - WPF 是我应用程序的安全选择吗?

c# - WPF 使用 x :Name as a key 绑定(bind)到字典

wpf - 控件模板中的模板绑定(bind)

c# - 如何在 WPF 中使用关闭按钮关闭选项卡?

c# - WPF,将键盘焦点提供给以前折叠的控件

c# - 关于 [ThreadStatic()] c#

wpf - 从 TabControl 的 DataTemplate 绑定(bind)到主 DataContext

c# - 有没有办法将 Keyboard.FocusedElement 设置为特定元素?