Code:
/ DotNET / DotNET / 8.0 / untmp / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / Core / System / Windows / Media / UniqueEventHelper.cs / 1 / UniqueEventHelper.cs
using System; using System.Collections; using System.Diagnostics; namespace System.Windows.Media { ////// Aids in making events unique. i.e. you register the same function for /// the same event twice, but it will only be called once for each time /// the event is invoked. /// /// UniqueEventHelper should only be accessed from the UI thread so that /// handlers that throw exceptions will crash the app, making the developer /// aware of the problem. /// internal class UniqueEventHelperwhere TEventArgs : EventArgs { /// /// Add the handler to the list of handlers associated with this event. /// If the handler has already been added, we simply increment the ref /// count. That way if this same handler has already been added, it /// won't be invoked multiple times when the event is raised. /// internal void AddEvent(EventHandlerhandler) { if (handler == null) { throw new System.ArgumentNullException("handler"); } EnsureEventTable(); if (_htDelegates[handler] == null) { _htDelegates.Add(handler, 1); } else { int refCount = (int)_htDelegates[handler] + 1; _htDelegates[handler] = refCount; } } /// /// Removed the handler from the list of handlers associated with this /// event. If the handler has been added multiple times (more times than /// it has been removed), we simply decrement its ref count. /// internal void RemoveEvent(EventHandlerhandler) { if (handler == null) { throw new System.ArgumentNullException("handler"); } EnsureEventTable(); if (_htDelegates[handler] != null) { int refCount = (int)_htDelegates[handler]; if (refCount == 1) { _htDelegates.Remove(handler); } else { _htDelegates[handler] = refCount - 1; } } } /// /// Enumerates all the keys in the hashtable, which must be EventHandlers, /// and invokes them. /// /// The sender for the callback. /// The args object to be sent by the delegate internal void InvokeEvents(object sender, TEventArgs args) { Debug.Assert((sender != null), "Sender is null"); if (_htDelegates != null) { Hashtable htDelegates = (Hashtable)_htDelegates.Clone(); foreach (EventHandlerhandler in htDelegates.Keys) { Debug.Assert((handler != null), "Event handler is null"); handler(sender, args); } } } /// /// Clones the event helper /// internal UniqueEventHelperClone() { UniqueEventHelper ueh = new UniqueEventHelper (); if (_htDelegates != null) { ueh._htDelegates = (Hashtable)_htDelegates.Clone(); } return ueh; } /// /// Ensures Hashtable is created so that event handlers can be added/removed /// private void EnsureEventTable() { if (_htDelegates == null) { _htDelegates = new Hashtable(); } } private Hashtable _htDelegates; } // internal class UniqueEventHelper { ////// Add the handler to the list of handlers associated with this event. /// If the handler has already been added, we simply increment the ref /// count. That way if this same handler has already been added, it /// won't be invoked multiple times when the event is raised. /// internal void AddEvent(EventHandler handler) { if (handler == null) { throw new System.ArgumentNullException("handler"); } EnsureEventTable(); if (_htDelegates[handler] == null) { _htDelegates.Add(handler, 1); } else { int refCount = (int)_htDelegates[handler] + 1; _htDelegates[handler] = refCount; } } ////// Removed the handler from the list of handlers associated with this /// event. If the handler has been added multiple times (more times than /// it has been removed), we simply decrement its ref count. /// internal void RemoveEvent(EventHandler handler) { if (handler == null) { throw new System.ArgumentNullException("handler"); } EnsureEventTable(); if (_htDelegates[handler] != null) { int refCount = (int)_htDelegates[handler]; if (refCount == 1) { _htDelegates.Remove(handler); } else { _htDelegates[handler] = refCount - 1; } } } ////// Enumerates all the keys in the hashtable, which must be EventHandlers, /// and invokes them. /// /// The sender for the callback. /// The args object to be sent by the delegate internal void InvokeEvents(object sender, EventArgs args) { Debug.Assert((sender != null), "Sender is null"); if (_htDelegates != null) { Hashtable htDelegates = (Hashtable)_htDelegates.Clone(); foreach (EventHandler handler in htDelegates.Keys) { Debug.Assert((handler != null), "Event handler is null"); handler(sender, args); } } } ////// Clones the event helper /// internal UniqueEventHelper Clone() { UniqueEventHelper ueh = new UniqueEventHelper(); if (_htDelegates != null) { ueh._htDelegates = (Hashtable)_htDelegates.Clone(); } return ueh; } ////// Ensures Hashtable is created so that event handlers can be added/removed /// private void EnsureEventTable() { if (_htDelegates == null) { _htDelegates = new Hashtable(); } } private Hashtable _htDelegates; } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- XPathNodeList.cs
- PagesChangedEventArgs.cs
- SelectionHighlightInfo.cs
- Binding.cs
- FunctionQuery.cs
- Tuple.cs
- Span.cs
- HttpRuntime.cs
- OdbcStatementHandle.cs
- Utils.cs
- WebPartVerb.cs
- unitconverter.cs
- HTMLTextWriter.cs
- WebFormDesignerActionService.cs
- AtomServiceDocumentSerializer.cs
- Pen.cs
- AsnEncodedData.cs
- HttpPostClientProtocol.cs
- StorageEndPropertyMapping.cs
- BuiltInExpr.cs
- StrongNameMembershipCondition.cs
- ComponentFactoryHelpers.cs
- ComUdtElement.cs
- __Filters.cs
- Comparer.cs
- SafeHandles.cs
- SchemaImporter.cs
- PathFigureCollectionValueSerializer.cs
- SqlDuplicator.cs
- CatalogPartChrome.cs
- Overlapped.cs
- TextStore.cs
- LayoutManager.cs
- SqlXmlStorage.cs
- RangeExpression.cs
- NativeMethods.cs
- SchemaCompiler.cs
- ContainerActivationHelper.cs
- WinEventQueueItem.cs
- LayoutInformation.cs
- ParameterElement.cs
- FileDialog_Vista.cs
- ElapsedEventArgs.cs
- RuntimeHelpers.cs
- ContextProperty.cs
- VisualBrush.cs
- XPathScanner.cs
- TypeListConverter.cs
- EasingKeyFrames.cs
- MSHTMLHost.cs
- ErasingStroke.cs
- QueryOutputWriter.cs
- nulltextnavigator.cs
- CookieParameter.cs
- NavigateEvent.cs
- DetailsViewInsertEventArgs.cs
- EntitySqlQueryBuilder.cs
- ExpressionBuilder.cs
- InternalConfigSettingsFactory.cs
- WebConfigurationFileMap.cs
- xdrvalidator.cs
- FixedSOMContainer.cs
- XmlArrayItemAttribute.cs
- KeySplineConverter.cs
- ObjectDataSourceEventArgs.cs
- SchemaMerger.cs
- Console.cs
- BinarySerializer.cs
- SchemaConstraints.cs
- ClientRuntimeConfig.cs
- metadatamappinghashervisitor.cs
- AutoScrollExpandMessageFilter.cs
- FrameworkContentElementAutomationPeer.cs
- UnsafeNativeMethods.cs
- Renderer.cs
- BasicViewGenerator.cs
- DataSetUtil.cs
- HwndSourceKeyboardInputSite.cs
- EntityConnectionStringBuilder.cs
- DataObjectAttribute.cs
- _ShellExpression.cs
- _Events.cs
- DataRelation.cs
- TraceXPathNavigator.cs
- ProviderBase.cs
- GeneratedView.cs
- DocComment.cs
- XPathSelectionIterator.cs
- ErrorLog.cs
- IRCollection.cs
- TextRange.cs
- XmlTextReaderImplHelpers.cs
- RepeatBehaviorConverter.cs
- DataGridCellsPresenter.cs
- HighlightComponent.cs
- ArgumentsParser.cs
- SoapEnvelopeProcessingElement.cs
- MulticastDelegate.cs
- SafeArrayRankMismatchException.cs
- CacheSection.cs