2012-04-03 69 views
26

Tôi đang sử dụng 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#commentmessageCung cấp giá trị trên 'System.Windows.Markup.StaticResourceHolder' ném một ngoại lệ

ví dụ để hiển thị các mục được chọn trong combobox cùng tách bởi dấu phẩy.

nhưng khi tôi cố gắng sử dụng UserControl trong wpfform tôi đang nhận được ngoại lệ này

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: 

Trả lời

7

Hãy kiểm tra xem bạn đã xác định một chuyển đổi trong một XAML không tồn tại.

+0

Lỗi tương tự khi cố gắng sử dụng kiểu không được khai báo – erem

4

Tôi đã tình cờ gặp vấn đề chính xác này. Đã xảy ra sự cố với tệp XAML. SolidBorderBrush bị thiếu trong XAML. Bằng cách thêm nó, mẫu hoạt động tốt.

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

Dưới đây là nội dung đầy đủ của tệp 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> 

41

Vấn đề là vì trật tự không đúng phong cách của bạn. Tôi có nghĩa là nếu chúng tôi công bố nút phong cách với referrance về tài nguyên tĩnh NormalBrush, được công bố theo phong cách, như thế này:

<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> 

Mã này sẽ cung cấp cho bạn báo lỗi như vậy. Nhưng nếu bạn thay đổi, như thế này

<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> 

Mọi thứ đều hoạt động tốt. Điều này cũng xảy ra nếu tài nguyên của bạn được lưu trữ trong các tệp xaml khác nhau và bạn đính kèm chúng trong ResourceDictionary của mình. Ví dụ (cosider chúng tôi lưu trữ NormalBrush của chúng tôi trong Colors.xaml và Button trong Button.xaml). Điều này cho phép lỗi:

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

này nên hoạt động báo lỗi:

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

Đơn đặt hàng cũng sẽ gây ra sự cố này khi tôi đang sử dụng 'ResourceDictionary .MergedDictionaries'? –

+2

@DROPtableusers Có. Tôi là bản thân mình, nhưng có. Tôi cho rằng điều này là do trình biên dịch đọc dòng tài nguyên theo dòng. Vì vậy, nếu một số độc tài của bạn tham khảo một, đó là chuyển tiếp ,, nó chỉ đơn giản là không thể tìm thấy nó, bởi vì nó chưa được biên soạn. – Alex

+0

thú vị, cảm ơn phản hồi của bạn. Tôi đã có một vấn đề tương tự nhưng đó là bởi vì tôi đã cố gắng để tải một nguồn lực mà không có ở đó (đáng ngạc nhiên là không hoạt động ...) –

2

Bằng cách sử dụng một DynamicResource thay vì StaticResource, nó sẽ tìm thấy tài nguyên khi chạy, do đó bạn không phải lo lắng về thứ tự của các khai báo trong XAML.

Có thể có những nhược điểm này (?), Nhưng trong trường hợp đặc biệt dính, đây là câu trả lời cho lời cầu nguyện của tôi.

0

Kiểm tra quyền cho tệp resource.resx của bạn. Ở đầu tệp của bạn, bạn sẽ tìm thấy trình đơn thả xuống được gọi là Công cụ sửa đổi truy cập: thay đổi loại thành 'Công khai'

Các vấn đề liên quan