在“System.Windows.Markup.StaticResourceHolder”上提供值引发异常

Posted

技术标签:

【中文标题】在“System.Windows.Markup.StaticResourceHolder”上提供值引发异常【英文标题】:Provide value on 'System.Windows.Markup.StaticResourceHolder' threw an exception 【发布时间】:2012-04-17 03:38:30 【问题描述】:

我正在使用http://blogs.microsoft.co.il/blogs/justguy/archive/2009/01/19/wpf-combobox-with-checkboxes-as-items-it-will-even-update-on-the-fly.aspx?CommentPosted=true#commentmessage

在同一组合框中显示所选项目的示例,用逗号分隔。

但是当我尝试在 wpfform 中使用 Usercontrol 时,我得到了这个异常

System.Windows.Markup.XamlParseException was unhandled
Message=Provide value on 'System.Windows.Markup.StaticResourceHolder' threw an exception.
Source=PresentationFramework
LineNumber=0
LinePosition=0
StackTrace:
   at System.Windows.Markup.XamlReader.RewrapException(Exception e, Uri baseUri)
   at System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlReader templateReader,   XamlObjectWriter currentWriter)
   at System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlObjectWriter objectWriter)
   at System.Windows.FrameworkTemplate.LoadOptimizedTemplateContent(DependencyObject container, IComponentConnector componentConnector, IStyleConnector styleConnector, List`1 affectedChildren, UncommonField`1 templatedNonFeChildrenField)
   at System.Windows.FrameworkTemplate.LoadContent(DependencyObject container, List`1 affectedChildren)
   at System.Windows.StyleHelper.ApplyTemplateContent(UncommonField`1 dataField, DependencyObject container, FrameworkElementFactory templateRoot, Int32 lastChildIndex, HybridDictionary childIndexFromChildID, FrameworkTemplate frameworkTemplate)
   at System.Windows.FrameworkTemplate.ApplyTemplateContent(UncommonField`1 templateDataField, FrameworkElement container)
   at System.Windows.FrameworkElement.ApplyTemplate()
   at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   at System.Windows.UIElement.Measure(Size availableSize)
   at MS.Internal.Helper.MeasureElementWithSingleChild(UIElement element, Size constraint)
   at System.Windows.Controls.ContentPresenter.MeasureOverride(Size constraint)
   at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   at System.Windows.UIElement.Measure(Size availableSize)
   at System.Windows.Controls.Border.MeasureOverride(Size constraint)
   at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   at System.Windows.UIElement.Measure(Size availableSize)
   at System.Windows.Controls.Control.MeasureOverride(Size constraint)
   at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   at System.Windows.UIElement.Measure(Size availableSize)
   at MS.Internal.Helper.MeasureElementWithSingleChild(UIElement element, Size constraint)
   at System.Windows.Controls.ContentPresenter.MeasureOverride(Size constraint)
   at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   at System.Windows.UIElement.Measure(Size availableSize)
   at System.Windows.Documents.AdornerDecorator.MeasureOverride(Size constraint)
   at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   at System.Windows.UIElement.Measure(Size availableSize)
   at System.Windows.Controls.Border.MeasureOverride(Size constraint)
   at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   at System.Windows.UIElement.Measure(Size availableSize)
   at System.Windows.Window.MeasureOverrideHelper(Size constraint)
   at System.Windows.Window.MeasureOverride(Size availableSize)
   at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
   at System.Windows.UIElement.Measure(Size availableSize)
   at System.Windows.Interop.HwndSource.SetLayoutSize()
   at System.Windows.Interop.HwndSource.set_RootVisualInternal(Visual value)
   at System.Windows.Interop.HwndSource.set_RootVisual(Visual value)
   at System.Windows.Window.SetRootVisual()
   at System.Windows.Window.SetRootVisualAndUpdateSTC()
   at System.Windows.Window.SetupInitialState(Double requestedTop, Double requestedLeft, Double requestedWidth, Double requestedHeight)
   at System.Windows.Window.CreateSourceWindow(Boolean duringShow)
   at System.Windows.Window.CreateSourceWindowDuringShow()
   at System.Windows.Window.SafeCreateWindowDuringShow()
   at System.Windows.Window.ShowHelper(Object booleanBox)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
   at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
   at System.Threading.ExecutionContext.runTryCode(Object userData)
   at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.ProcessQueue()
   at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
   at System.Windows.Threading.Dispatcher.Run()
   at System.Windows.Application.RunDispatcher(Object ignore)
   at System.Windows.Application.RunInternal(Window window)
   at System.Windows.Application.Run(Window window)
   at System.Windows.Application.Run()
   at CheckboxInComboboxWpf.App.Main() in C:\test\CheckboxInComboboxWpf\CheckboxInComboboxWpf\obj\x86\Debug\App.g.cs:line 0
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext,  ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()
   InnerException: 
   Message=Cannot find resource named 'SolidBorderBrush'. Resource names are case sensitive.
   Source=PresentationFramework
   StackTrace:
        at System.Windows.StaticResourceExtension.ProvideValueInternal(IServiceProvider serviceProvider, Boolean allowDeferredReference)
        at System.Windows.StaticResourceExtension.ProvideValue(IServiceProvider serviceProvider)
        at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CallProvideValue(MarkupExtension me, IServiceProvider serviceProvider)
   InnerException: 

【问题讨论】:

【参考方案1】:

问题是因为您的样式顺序不正确。我的意思是,如果我们在静态资源NormalBrush 上发布按钮样式,并在样式下声明,如下所示:

 <Style TargetType="x:Type Button">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="x:Type Button">
                <Border Background="StaticResource NormalBrush" >
                    <ContentPresenter Name="ButtonCont"></ContentPresenter>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>       
</Style>

<LinearGradientBrush x:Key="NormalBrush" StartPoint="0,0" EndPoint="0,1">
    <GradientBrush.GradientStops>
        <GradientStopCollection>
            <GradientStop Color="#FFF" Offset="0.0"/>
            <GradientStop Color="#CCC" Offset="1.0"/>
        </GradientStopCollection>
    </GradientBrush.GradientStops>
</LinearGradientBrush>

这段代码会给你这样的错误。但是如果你改变了,像这样

<LinearGradientBrush x:Key="NormalBrush" StartPoint="0,0" EndPoint="0,1">
    <GradientBrush.GradientStops>
        <GradientStopCollection>
            <GradientStop Color="#FFF" Offset="0.0"/>
            <GradientStop Color="#CCC" Offset="1.0"/>
        </GradientStopCollection>
    </GradientBrush.GradientStops>
</LinearGradientBrush>

 <Style TargetType="x:Type Button">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="x:Type Button">
                <Border Background="StaticResource ButtonBackground" >
                    <ContentPresenter Name="ButtonCont"></ContentPresenter>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>       
</Style>

一切正常。如果您的资源存储在不同的 xaml 文件中并且您将它们附加到您的 ResourceDictionary 中,也会发生同样的情况。例如(考虑我们将NormalBrush 存储在Colors.xamlButtonButton.xaml)。这给出了错误:

<ResourceDictionary Source="Resources\Button.xaml" />
<ResourceDictionary Source="Resources\Colors.xaml" />

这应该工作错误:

<ResourceDictionary Source="Resources\Colors.xaml" />
<ResourceDictionary Source="Resources\Button.xaml" />

【讨论】:

在我使用ResourceDictionary.MergedDictionaries时,订单是否也会导致这个问题? @DROPtableusers 是的。我自己被高估了,但是是的。我想这是因为编译器逐行读取资源。因此,如果您的某些字典引用了向前的字典,它根本找不到它,因为它还没有编译。 很有趣,感谢您的回复。我遇到了类似的问题,但这是因为我试图加载一个不存在的资源(令人惊讶的是它不起作用......)【参考方案2】:

请检查您是否在不存在的 Xaml 中指定了转换器。

【讨论】:

尝试使用未声明的样式时出现同样的错误 在我的情况下,它是我的资源文件 App.xaml 中不存在的 StaticResource(一种颜色)【参考方案3】:

我偶然发现了这个确切的问题。 XAML 文件有问题。 XAML 中缺少SolidBorderBrush。通过添加它,示例可以正常工作。

<SolidColorBrush x:Key="SolidBorderBrush" Color="#000" />

下面是 XAML 文件的完整内容。

<UserControl x:Class="Controls.ComboWithCheckboxes"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
Height="22" Width="120"
x:Name="UserControl"
>

<UserControl.Resources>
    <LinearGradientBrush x:Key="NormalBrush" StartPoint="0,0" EndPoint="0,1">
        <GradientBrush.GradientStops>
            <GradientStopCollection>
                <GradientStop Color="#FFF" Offset="0.0"/>
                <GradientStop Color="#CCC" Offset="1.0"/>
            </GradientStopCollection>
        </GradientBrush.GradientStops>
    </LinearGradientBrush>

    <LinearGradientBrush x:Key="NormalBorderBrush" StartPoint="0,0" EndPoint="0,1">
        <GradientBrush.GradientStops>
            <GradientStopCollection>
                <GradientStop Color="#CCC" Offset="0.0"/>
                <GradientStop Color="#444" Offset="1.0"/>
            </GradientStopCollection>
        </GradientBrush.GradientStops>
    </LinearGradientBrush>

    <SolidColorBrush x:Key="GlyphBrush" Color="#444" />

    <LinearGradientBrush x:Key="DarkBrush" StartPoint="0,0" EndPoint="0,1">
        <GradientBrush.GradientStops>
            <GradientStopCollection>
                <GradientStop Color="#FFF" Offset="0.0"/>
                <GradientStop Color="#AAA" Offset="1.0"/>
            </GradientStopCollection>
        </GradientBrush.GradientStops>
    </LinearGradientBrush>

    <LinearGradientBrush x:Key="PressedBrush" StartPoint="0,0" EndPoint="0,1">
        <GradientBrush.GradientStops>
            <GradientStopCollection>
                <GradientStop Color="#BBB" Offset="0.0"/>
                <GradientStop Color="#EEE" Offset="0.1"/>
                <GradientStop Color="#EEE" Offset="0.9"/>
                <GradientStop Color="#FFF" Offset="1.0"/>
            </GradientStopCollection>
        </GradientBrush.GradientStops>
    </LinearGradientBrush>

    <SolidColorBrush x:Key="SolidBorderBrush" Color="#000" />

    <SolidColorBrush x:Key="DisabledForegroundBrush" Color="#888" />

    <SolidColorBrush x:Key="DisabledBackgroundBrush" Color="#EEE" />

    <SolidColorBrush x:Key="WindowBackgroundBrush" Color="#FFF" />

    <SolidColorBrush x:Key="SelectedBackgroundBrush" Color="#DDD" />

    <ControlTemplate x:Key="ComboBoxToggleButton" TargetType="ToggleButton">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition Width="20" />
            </Grid.ColumnDefinitions>
            <Border
              x:Name="Border" 
              Grid.ColumnSpan="2"
              CornerRadius="2"
              Background="StaticResource NormalBrush"
              BorderBrush="StaticResource NormalBorderBrush"
              BorderThickness="1" />
            <Border 
              Grid.Column="0"
              CornerRadius="2,0,0,2" 
              Margin="1" 
              Background="StaticResource WindowBackgroundBrush" 
              BorderBrush="StaticResource NormalBorderBrush"
              BorderThickness="0,0,1,0" />
            <Path 
              x:Name="Arrow"
              Grid.Column="1"     
              Fill="StaticResource GlyphBrush"
              HorizontalAlignment="Center"
              VerticalAlignment="Center"
              Data="M 0 0 L 4 4 L 8 0 Z"/>
        </Grid>
        <ControlTemplate.Triggers>
            <Trigger Property="ToggleButton.IsMouseOver" Value="true">
                <Setter TargetName="Border" Property="Background" Value="StaticResource DarkBrush" />
            </Trigger>
            <Trigger Property="ToggleButton.IsChecked" Value="true">
                <Setter TargetName="Border" Property="Background" Value="StaticResource PressedBrush" />
            </Trigger>
            <Trigger Property="IsEnabled" Value="False">
                <Setter TargetName="Border" Property="Background" Value="StaticResource DisabledBackgroundBrush" />
                <Setter TargetName="Border" Property="BorderBrush" Value="StaticResource DisabledBorderBrush" />
                <Setter Property="Foreground" Value="StaticResource DisabledForegroundBrush"/>
                <Setter TargetName="Arrow" Property="Fill" Value="StaticResource DisabledForegroundBrush" />
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>

    <ControlTemplate x:Key="ComboBoxTextBox" TargetType="TextBox">
        <Border x:Name="PART_ContentHost" Focusable="False" Background="TemplateBinding Background" />
    </ControlTemplate>

    <Style x:Key="x:Type ComboBoxItem" TargetType="ComboBoxItem">
        <Setter Property="SnapsToDevicePixels" Value="true"/>
        <Setter Property="OverridesDefaultStyle" Value="true"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ComboBoxItem">
                    <Border 
                      Name="Border"
                      Padding="2"
                      SnapsToDevicePixels="true">
                        <ContentPresenter />
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsHighlighted" Value="true">
                            <Setter TargetName="Border" Property="Background" Value="StaticResource SelectedBackgroundBrush"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="StaticResource DisabledForegroundBrush"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>

<ComboBox
    x:Name="CheckableCombo"
    SnapsToDevicePixels="True"
    OverridesDefaultStyle="True"
    ScrollViewer.HorizontalScrollBarVisibility="Auto"
    ScrollViewer.VerticalScrollBarVisibility="Auto"
    ScrollViewer.CanContentScroll="True"
    IsSynchronizedWithCurrentItem="True"
    MinWidth="120"
    MinHeight="20"
    ItemsSource="Binding ElementName=UserControl, Path=ItemsSource"
    DataContext="Binding ElementName=UserControl, Path=DataContext"
    >
    <ComboBox.ItemTemplate>
        <HierarchicalDataTemplate>
            <CheckBox Content="Binding Title"
                      IsChecked="Binding Path=IsSelected, Mode=TwoWay"
                      Tag="RelativeSource FindAncestor, AncestorType=x:Type ComboBox"
                      Click="CheckBox_Click"
                      />
        </HierarchicalDataTemplate>
    </ComboBox.ItemTemplate>

    <ComboBox.Template>
        <ControlTemplate TargetType="ComboBox">
            <Grid>
                <ToggleButton 
                    Name="ToggleButton" 
                    Template="StaticResource ComboBoxToggleButton" 
                    Grid.Column="2" 
                    Focusable="false"
                    IsChecked="Binding Path=IsDropDownOpen,Mode=TwoWay,RelativeSource=RelativeSource TemplatedParent"
                    ClickMode="Press">
                </ToggleButton>
                <ContentPresenter
                    x:Name="Presenter"
                    IsHitTestVisible="False" 
                    Margin="3,3,23,3"
                    VerticalAlignment="Center"
                    HorizontalAlignment="Left">
                    <ContentPresenter.Content>
                        <TextBlock TextTrimming="CharacterEllipsis"
                                   Text="Binding Path=Text,Mode=TwoWay,RelativeSource=RelativeSource Mode=FindAncestor, AncestorType=UserControl" />
                    </ContentPresenter.Content>
                </ContentPresenter>
                <TextBox x:Name="EditableTextBox"
                    Style="x:Null" 
                    Template="StaticResource ComboBoxTextBox" 
                    HorizontalAlignment="Left" 
                    VerticalAlignment="Center" 
                    Margin="3,3,23,3"
                    Focusable="True" 
                    Background="Transparent"
                    Visibility="Hidden"
                    IsReadOnly="TemplateBinding IsReadOnly"/>
                <Popup 
                    Name="Popup"
                    Placement="Bottom"
                    IsOpen="TemplateBinding IsDropDownOpen"
                    AllowsTransparency="True" 
                    Focusable="False"
                    PopupAnimation="Slide">
                    <Grid 
                              Name="DropDown"
                              SnapsToDevicePixels="True"                
                              MinWidth="TemplateBinding ActualWidth"
                              MaxHeight="TemplateBinding MaxDropDownHeight">
                        <Border 
                                x:Name="DropDownBorder"
                                Background="StaticResource WindowBackgroundBrush"
                                BorderThickness="1"
                                BorderBrush="StaticResource SolidBorderBrush"/>
                        <ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True" DataContext="Binding">
                            <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" />
                        </ScrollViewer>
                    </Grid>
                </Popup>
            </Grid>
            <ControlTemplate.Triggers>
                <Trigger Property="HasItems" Value="false">
                    <Setter TargetName="DropDownBorder" Property="MinHeight" Value="95"/>
                </Trigger>
                <Trigger Property="IsEnabled" Value="false">
                    <Setter Property="Foreground" Value="StaticResource DisabledForegroundBrush"/>
                </Trigger>
                <Trigger Property="IsGrouping" Value="true">
                    <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
                </Trigger>
                <Trigger SourceName="Popup" Property="Popup.AllowsTransparency" Value="true">
                    <Setter TargetName="DropDownBorder" Property="CornerRadius" Value="4"/>
                    <Setter TargetName="DropDownBorder" Property="Margin" Value="0,2,0,0"/>
                </Trigger>
                <Trigger Property="IsEditable"
               Value="true">
                    <Setter Property="IsTabStop" Value="false"/>
                    <Setter TargetName="EditableTextBox" Property="Visibility"    Value="Visible"/>
                    <Setter TargetName="Presenter" Property="Visibility" Value="Hidden"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </ComboBox.Template>
</ComboBox>

【讨论】:

【参考方案4】:

通过使用DynamicResource而不是StaticResource,它将在运行时找到资源,因此您不必担心 XAML 中声明的顺序。

这可能有缺点(?),但在特别棘手的情况下,这是我祈祷的答案。

【讨论】:

【参考方案5】:

检查您的 resource.resx 文件的权限。在您的文件顶部,您会发现称为访问修饰符的下拉列表:将其类型更改为“公共”

【讨论】:

以上是关于在“System.Windows.Markup.StaticResourceHolder”上提供值引发异常的主要内容,如果未能解决你的问题,请参考以下文章

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?

存储在 plist 中的数据在模拟器中有效,但在设备中无效

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据