Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / wpf / src / Core / CSharp / 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.
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
- TextUtf8RawTextWriter.cs
- HtmlInputText.cs
- CompensatableTransactionScopeActivity.cs
- RequestCacheManager.cs
- XmlText.cs
- LongValidator.cs
- StatusBarPanelClickEvent.cs
- ContentDesigner.cs
- ConfigurationFileMap.cs
- SqlConnectionFactory.cs
- ConnectionStringsExpressionBuilder.cs
- LocatorPartList.cs
- Enum.cs
- XhtmlBasicFormAdapter.cs
- LocatorPart.cs
- TableRow.cs
- BitStack.cs
- SqlCrossApplyToCrossJoin.cs
- TextBoxBase.cs
- CollectionViewGroupInternal.cs
- OrderByLifter.cs
- NativeMethods.cs
- EllipticalNodeOperations.cs
- DictionaryEntry.cs
- ReaderWriterLockWrapper.cs
- SimpleApplicationHost.cs
- VideoDrawing.cs
- StrongNameUtility.cs
- HMACSHA256.cs
- OleStrCAMarshaler.cs
- PartBasedPackageProperties.cs
- BindValidationContext.cs
- CompilationLock.cs
- HyperLinkStyle.cs
- ConfigurationPermission.cs
- DateTimeFormatInfo.cs
- MergeFilterQuery.cs
- CryptoProvider.cs
- HtmlInputCheckBox.cs
- TdsParserStateObject.cs
- UserMapPath.cs
- CreateUserWizardStep.cs
- SqlTransaction.cs
- InternalTransaction.cs
- GuidelineCollection.cs
- FileDialog.cs
- SqlInternalConnection.cs
- ControlPager.cs
- XmlCharCheckingReader.cs
- InputElement.cs
- XmlBinaryReader.cs
- DesignerListAdapter.cs
- TextEditor.cs
- DateTimePickerDesigner.cs
- DoubleAnimation.cs
- DbTransaction.cs
- propertytag.cs
- FontInfo.cs
- DirectionalLight.cs
- HtmlTable.cs
- DataMember.cs
- HttpHandlerAction.cs
- SizeAnimation.cs
- TemplateControlCodeDomTreeGenerator.cs
- FrameworkElement.cs
- DataGridViewLayoutData.cs
- MasterPageCodeDomTreeGenerator.cs
- FormatStringEditor.cs
- BackgroundWorker.cs
- UidPropertyAttribute.cs
- VisualProxy.cs
- StatusBarDrawItemEvent.cs
- TransportContext.cs
- CustomAttributeSerializer.cs
- OrderToken.cs
- DataGridViewControlCollection.cs
- NetworkInformationPermission.cs
- DiagnosticsConfiguration.cs
- BinaryConverter.cs
- ImageConverter.cs
- DataTableNewRowEvent.cs
- TabControlEvent.cs
- FixedSOMPageElement.cs
- ReferenceEqualityComparer.cs
- XmlSchemaSearchPattern.cs
- TreeViewBindingsEditor.cs
- SkipStoryboardToFill.cs
- MethodImplAttribute.cs
- OpenFileDialog.cs
- AutomationProperty.cs
- ModelItemExtensions.cs
- WsdlInspector.cs
- HierarchicalDataTemplate.cs
- VirtualPath.cs
- ArgumentsParser.cs
- HitTestWithGeometryDrawingContextWalker.cs
- Form.cs
- DataView.cs
- RootBuilder.cs
- Normalization.cs