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 UniqueEventHelper
where 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(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, TEventArgs 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;
}
//
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
- CheckBoxList.cs
- UnsafeNativeMethods.cs
- RightsManagementInformation.cs
- CopyAttributesAction.cs
- XamlTemplateSerializer.cs
- PipelineDeploymentState.cs
- HwndAppCommandInputProvider.cs
- WebPartEditorApplyVerb.cs
- GroupBoxRenderer.cs
- NativeMethods.cs
- PaperSource.cs
- CodeObjectCreateExpression.cs
- UInt64.cs
- ZipArchive.cs
- DataGridBoundColumn.cs
- PropertyGridView.cs
- ClipboardData.cs
- DataSourceControl.cs
- Filter.cs
- storepermissionattribute.cs
- InsufficientMemoryException.cs
- BufferedWebEventProvider.cs
- StringSource.cs
- UrlAuthorizationModule.cs
- DataGridViewCheckBoxCell.cs
- RolePrincipal.cs
- XmlObjectSerializerReadContextComplexJson.cs
- TableLayoutRowStyleCollection.cs
- DataKeyCollection.cs
- ThreadStaticAttribute.cs
- Evidence.cs
- TextRenderingModeValidation.cs
- WindowsComboBox.cs
- SqlTransaction.cs
- ToolBarPanel.cs
- LayoutTable.cs
- StringKeyFrameCollection.cs
- StringUtil.cs
- SQLDateTimeStorage.cs
- ConstantExpression.cs
- columnmapkeybuilder.cs
- keycontainerpermission.cs
- NonValidatingSecurityTokenAuthenticator.cs
- XmlToDatasetMap.cs
- DefaultPropertyAttribute.cs
- SmiSettersStream.cs
- BuildProviderCollection.cs
- HttpStaticObjectsCollectionBase.cs
- EntityDataSourceDataSelectionPanel.cs
- FontStretchConverter.cs
- CryptographicAttribute.cs
- Size3D.cs
- SoapIncludeAttribute.cs
- XmlPreloadedResolver.cs
- Track.cs
- StylusPlugin.cs
- CookieHandler.cs
- MimeImporter.cs
- CustomSignedXml.cs
- CultureInfo.cs
- XmlSerializerFaultFormatter.cs
- FontStretchConverter.cs
- PropertyKey.cs
- ExtenderProviderService.cs
- SingleObjectCollection.cs
- RequiredFieldValidator.cs
- ClientConvert.cs
- XhtmlBasicPhoneCallAdapter.cs
- XmlEntityReference.cs
- XmlNavigatorFilter.cs
- TextTreeFixupNode.cs
- DataConnectionHelper.cs
- TemplateComponentConnector.cs
- XmlAnyElementAttributes.cs
- GC.cs
- CompleteWizardStep.cs
- TransactionsSectionGroup.cs
- XPathExpr.cs
- contentDescriptor.cs
- NetNamedPipeBinding.cs
- ServiceOperationListItem.cs
- AsnEncodedData.cs
- Header.cs
- Win32MouseDevice.cs
- ResourcePool.cs
- WhereaboutsReader.cs
- future.cs
- InternalBufferOverflowException.cs
- SqlServer2KCompatibilityCheck.cs
- HttpTransportElement.cs
- AutomationPatternInfo.cs
- SharedConnectionInfo.cs
- TimeSpanValidatorAttribute.cs
- RegistrySecurity.cs
- CannotUnloadAppDomainException.cs
- HtmlGenericControl.cs
- DrawingVisual.cs
- SignerInfo.cs
- NameValueConfigurationElement.cs
- AnalyzedTree.cs