2012-04-03 4 views
26

Sto usando 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#commentmessagefornire un valore su 'System.Windows.Markup.StaticResourceHolder' ha generato un'eccezione

esempio per mostrare gli elementi selezionati nella stessa casella combinata separati da virgola.

ma quando provo ad usare Usercontrol in wpfform sto ottenendo questa eccezione

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: 

risposta

7

Si prega di verificare se è stato specificato un convertitore in un Xaml che non esiste.

+0

Stesso errore quando si tenta di utilizzare uno stile che non è stato dichiarato – erem

4

Mi ero imbattuto in questo esatto problema. C'è un problema con il file XAML. SolidBorderBrush mancante da XAML. Aggiungendolo, l'esempio funziona correttamente.

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

Bellow segue il contenuto completo del file 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

Il problema è dovuto al fatto di ordine non corretto dei vostri stili. Voglio dire che se pubblichiamo stile pulsante con referrance sulla risorsa statica NormalBrush, che viene dichiarato sotto lo stile, in questo modo:

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

Questo codice vi darà tale errore. Ma se si cambia, come questo

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

Tutto funziona correttamente. Lo stesso si verifica se le risorse sono memorizzate in diversi file xaml e li si allega nel proprio ResourceDictionary. Ad esempio (cosideriamo il nostro NormalBrush in Colors.xaml e Button in Button.xaml). Questo dà l'errore:

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

Questo dovrebbe funzionare errore:

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

L'ordine causerà anche questo problema quando sto usando 'ResourceDictionary .MergedDictionaries'? –

+2

@DROPtableusers Sì. Ero sorpreso anch'io, ma sì. Suppongo che ciò avvenga perché il compilatore legge le risorse riga per riga. Quindi, se alcuni dei tuoi dettati fanno riferimento a uno, che è in avanti, semplicemente non riesce a trovarlo, perché non è ancora compilato. – Alex

+0

interessante, grazie per la vostra risposta. Stavo avendo un problema simile ma era perché stavo cercando di caricare una risorsa che non c'era (sorprendentemente questo non funziona ...) –

2

Utilizzando un DynamicResource invece di StaticResource, troverà la risorsa in fase di esecuzione, in modo da non dovete preoccuparvi di l'ordine delle dichiarazioni nello XAML.

Ci possono essere dei lati negativi di questo (?), Ma in casi particolarmente appiccicosi, questa è stata la risposta alle mie preghiere.

0

Verificare l'autorizzazione per il file resource.resx. Nella parte superiore del file troverai il menu a discesa noto come Modificatore di accesso: cambia il suo tipo in "Pubblico"