2011-01-05 3 views
2

Я всегда использовал этот код, чтобы удалить тень от ScatterViewItem:Удаление тени от ScatterViewItem не работает

ScatterViewItem svi = new ScatterViewItem(); 
svi.ApplyTemplate(); 
svi.Background = new SolidColorBrush(Colors.Transparent); 
svi.ShowsActivationEffects = false; 
svi.BorderBrush = System.Windows.Media.Brushes.Transparent; 
Microsoft.Surface.Presentation.Generic.SurfaceShadowChrome ssc; 
ssc = svi.Template.FindName("shadow", svi) as Microsoft.Surface.Presentation.Generic.SurfaceShadowChrome; 
ssc.Visibility = Visibility.Hidden; 

Но в последнее время это больше не работает. Я всегда получаю это исключение:

System.NullReferenceException was unhandled 
    Message=Object reference not set to an instance of an object. 
    Source=Prototype_Concept_2 
    StackTrace: 
     at Prototype_Concept_2.PackageView.expand(Package pck) in C:\Users\Roflcoptr\Documents\Visual Studio 2008\Projects\Prototype_Concept_2\Prototype_Concept_2\PackageView.xaml.cs:line 45 
     at Prototype_Concept_2.PackageView..ctor(SourceFile focus) in C:\Users\Roflcoptr\Documents\Visual Studio 2008\Projects\Prototype_Concept_2\Prototype_Concept_2\PackageView.xaml.cs:line 31 
     at Prototype_Concept_2.DetailChooser.ShowPackage_PreviewContactDown(Object sender, ContactEventArgs e) in C:\Users\Roflcoptr\Documents\Visual Studio 2008\Projects\Prototype_Concept_2\Prototype_Concept_2\DetailChooser.xaml.cs:line 213 
     at Microsoft.Surface.Presentation.ContactEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget) 
     at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target) 
     at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs) 
     at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) 
     at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) 
     at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted) 
     at System.Windows.Input.InputManager.ProcessStagingArea() 
     at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input) 
     at Microsoft.Surface.Presentation.InputSurfaceProviderBase.DoProcessInput(Object obj) 
     at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter) 
     at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler) 
     at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Boolean isSingleParameter, 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) 
     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, Boolean isSingleParameter) 
     at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler) 
     at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler) 
     at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Boolean isSingleParameter) 
     at System.Windows.Threading.Dispatcher.Invoke(DispatcherPriority priority, Delegate method, Object arg) 
     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 Prototype_Concept_2.App.Main() in C:\Users\Roflcoptr\Documents\Visual Studio 2008\Projects\Prototype_Concept_2\Prototype_Concept_2\obj\Debug\App.g.cs:line 0 
     at System.AppDomain._nExecuteAssembly(Assembly 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) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 

Это означает, что в строке ssc = svi.Template.FindName("shadow", svi) as Microsoft.Surface.Presentation.Generic.SurfaceShadowChrome; должна быть NullReference, но я не знаю, почему.

ответ

3

Проблема в том, что ApplyTemplate возвращает false, поэтому шаблон не применяется, что означает его значение null. Это объясняет NullReferenceException. То, что вы можете сделать, - это привязать обработчик событий, который подписывается на событие Loaded в ScatterViewItem, а в обработчике вы делаете то же самое. В WPF шаблон всегда применялся при возникновении события Loaded

ScatterViewItem svi = new ScatterViewItem(); 
svi.Background = new SolidColorBrush(Colors.Transparent); 
svi.ShowsActivationEffects = false; 
svi.BorderBrush = System.Windows.Media.Brushes.Transparent; 

RoutedEventHandler loadedEventHandler = null; 
loadedEventHandler = new RoutedEventHandler(delegate 
{ 
    svi.Loaded -= loadedEventHandler; 
    Microsoft.Surface.Presentation.Generic.SurfaceShadowChrome ssc; 
    ssc = svi.Template.FindName("shadow", svi) as Microsoft.Surface.Presentation.Generic.SurfaceShadowChrome; 
    ssc.Visibility = Visibility.Hidden; 
}); 
svi.Loaded += loadedEventHandler; 
+0

Спасибо большое, что решило мою проблему! – RoflcoptrException

+0

Я награду щедростью как сунны, так как предел превышен. – RoflcoptrException

+0

@ Roflcoptr: Уверенная вещь! Хорошо, что это сработало –

 Смежные вопросы

  • Нет связанных вопросов^_^