Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Framework / System / Windows / Controls / RadioButton.cs / 1458001 / RadioButton.cs
using System;
using System.Collections;
using System.ComponentModel;
using System.Threading;
using System.Windows.Threading;
using System.Windows.Automation;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using MS.Utility;
// Disable CS3001: Warning as Error: not CLS-compliant
#pragma warning disable 3001
namespace System.Windows.Controls
{
///
/// RadioButton implements option button with two states: true or false
///
[Localizability(LocalizationCategory.RadioButton)]
public class RadioButton : ToggleButton
{
#region Constructors
static RadioButton()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(RadioButton), new FrameworkPropertyMetadata(typeof(RadioButton)));
_dType = DependencyObjectType.FromSystemTypeInternal(typeof(RadioButton));
KeyboardNavigation.AcceptsReturnProperty.OverrideMetadata(typeof(RadioButton), new FrameworkPropertyMetadata(MS.Internal.KnownBoxes.BooleanBoxes.FalseBox));
}
///
/// Default RadioButton constructor
///
///
/// Automatic determination of current Dispatcher. Use alternative constructor
/// that accepts a Dispatcher for best performance.
///
public RadioButton() : base()
{
}
#endregion
#region private helpers
private static void OnGroupNameChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
RadioButton radioButton = (RadioButton)d;
string groupName = e.NewValue as string;
string currentlyRegisteredGroupName = _currentlyRegisteredGroupName.GetValue(radioButton);
if (groupName != currentlyRegisteredGroupName)
{
// Unregister the old group name if set
if (!string.IsNullOrEmpty(currentlyRegisteredGroupName))
Unregister(currentlyRegisteredGroupName, radioButton);
// Register the new group name is set
if (!string.IsNullOrEmpty(groupName))
Register(groupName, radioButton);
}
}
private static void Register(string groupName, RadioButton radioButton)
{
if (_groupNameToElements == null)
_groupNameToElements = new Hashtable(1);
lock (_groupNameToElements)
{
ArrayList elements = (ArrayList)_groupNameToElements[groupName];
if (elements == null)
{
elements = new ArrayList(1);
_groupNameToElements[groupName] = elements;
}
else
{
// There were some elements there, remove dead ones
PurgeDead(elements, null);
}
elements.Add(new WeakReference(radioButton));
}
_currentlyRegisteredGroupName.SetValue(radioButton, groupName);
}
private static void Unregister(string groupName, RadioButton radioButton)
{
if (_groupNameToElements == null)
return;
lock (_groupNameToElements)
{
// Get all elements bound to this key and remove this element
ArrayList elements = (ArrayList)_groupNameToElements[groupName];
if (elements != null)
{
PurgeDead(elements, radioButton);
if (elements.Count == 0)
{
_groupNameToElements.Remove(groupName);
}
}
}
_currentlyRegisteredGroupName.SetValue(radioButton, null);
}
private static void PurgeDead(ArrayList elements, object elementToRemove)
{
for (int i = 0; i < elements.Count; )
{
WeakReference weakReference = (WeakReference)elements[i];
object element = weakReference.Target;
if (element == null || element == elementToRemove)
{
elements.RemoveAt(i);
}
else
{
i++;
}
}
}
private void UpdateRadioButtonGroup()
{
string groupName = GroupName;
if (!string.IsNullOrEmpty(groupName))
{
Visual rootScope = KeyboardNavigation.GetVisualRoot(this);
if (_groupNameToElements == null)
_groupNameToElements = new Hashtable(1);
lock (_groupNameToElements)
{
// Get all elements bound to this key and remove this element
ArrayList elements = (ArrayList)_groupNameToElements[groupName];
for (int i = 0; i < elements.Count; )
{
WeakReference weakReference = (WeakReference)elements[i];
RadioButton rb = weakReference.Target as RadioButton;
if (rb == null)
{
// Remove dead instances
elements.RemoveAt(i);
}
else
{
// Uncheck all checked RadioButtons different from the current one
if (rb != this && (rb.IsChecked == true) && rootScope == KeyboardNavigation.GetVisualRoot(rb))
rb.UncheckRadioButton();
i++;
}
}
}
}
else // Logical parent should be the group
{
DependencyObject parent = this.Parent;
if (parent != null)
{
// Traverse logical children
IEnumerable children = LogicalTreeHelper.GetChildren(parent);
IEnumerator itor = children.GetEnumerator();
while (itor.MoveNext())
{
RadioButton rb = itor.Current as RadioButton;
if (rb != null && rb != this && string.IsNullOrEmpty(rb.GroupName) && (rb.IsChecked == true))
rb.UncheckRadioButton();
}
}
}
}
private void UncheckRadioButton()
{
SetCurrentValueInternal(IsCheckedProperty, MS.Internal.KnownBoxes.BooleanBoxes.FalseBox);
}
#endregion
#region Properties and Events
///
/// The DependencyID for the GroupName property.
/// Default Value: "String.Empty"
///
public static readonly DependencyProperty GroupNameProperty = DependencyProperty.Register(
"GroupName",
typeof(string),
typeof(RadioButton),
new FrameworkPropertyMetadata(String.Empty, new PropertyChangedCallback(OnGroupNameChanged)));
///
/// GroupName determine mutually excusive radiobutton groups
///
[DefaultValue("")]
[Localizability(LocalizationCategory.NeverLocalize)] // cannot be localized
public string GroupName
{
get
{
return (string)GetValue(GroupNameProperty);
}
set
{
SetValue(GroupNameProperty, value);
}
}
#endregion
#region Override methods
///
/// Creates AutomationPeer ( )
///
protected override System.Windows.Automation.Peers.AutomationPeer OnCreateAutomationPeer()
{
return new System.Windows.Automation.Peers.RadioButtonAutomationPeer(this);
}
///
/// This method is invoked when the IsChecked becomes true.
///
/// RoutedEventArgs.
protected override void OnChecked(RoutedEventArgs e)
{
// If RadioButton is checked we should uncheck the others in the same group
UpdateRadioButtonGroup();
base.OnChecked(e);
}
///
/// This override method is called from OnClick().
/// RadioButton implements its own toggle behavior
///
protected internal override void OnToggle()
{
SetCurrentValueInternal(IsCheckedProperty, MS.Internal.KnownBoxes.BooleanBoxes.TrueBox);
}
///
/// The Access key for this control was invoked.
///
///
protected override void OnAccessKey(AccessKeyEventArgs e)
{
if (!IsKeyboardFocused)
{
Focus();
}
base.OnAccessKey(e);
}
#endregion
#region Accessibility
#endregion Accessibility
#region DTypeThemeStyleKey
// Returns the DependencyObjectType for the registered ThemeStyleKey's default
// value. Controls will override this method to return approriate types.
internal override DependencyObjectType DTypeThemeStyleKey
{
get { return _dType; }
}
private static DependencyObjectType _dType;
#endregion DTypeThemeStyleKey
#region private data
[ThreadStatic] private static Hashtable _groupNameToElements;
private static readonly UncommonField _currentlyRegisteredGroupName = new UncommonField();
#endregion private data
}
}
// 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.ComponentModel;
using System.Threading;
using System.Windows.Threading;
using System.Windows.Automation;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using MS.Utility;
// Disable CS3001: Warning as Error: not CLS-compliant
#pragma warning disable 3001
namespace System.Windows.Controls
{
///
/// RadioButton implements option button with two states: true or false
///
[Localizability(LocalizationCategory.RadioButton)]
public class RadioButton : ToggleButton
{
#region Constructors
static RadioButton()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(RadioButton), new FrameworkPropertyMetadata(typeof(RadioButton)));
_dType = DependencyObjectType.FromSystemTypeInternal(typeof(RadioButton));
KeyboardNavigation.AcceptsReturnProperty.OverrideMetadata(typeof(RadioButton), new FrameworkPropertyMetadata(MS.Internal.KnownBoxes.BooleanBoxes.FalseBox));
}
///
/// Default RadioButton constructor
///
///
/// Automatic determination of current Dispatcher. Use alternative constructor
/// that accepts a Dispatcher for best performance.
///
public RadioButton() : base()
{
}
#endregion
#region private helpers
private static void OnGroupNameChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
RadioButton radioButton = (RadioButton)d;
string groupName = e.NewValue as string;
string currentlyRegisteredGroupName = _currentlyRegisteredGroupName.GetValue(radioButton);
if (groupName != currentlyRegisteredGroupName)
{
// Unregister the old group name if set
if (!string.IsNullOrEmpty(currentlyRegisteredGroupName))
Unregister(currentlyRegisteredGroupName, radioButton);
// Register the new group name is set
if (!string.IsNullOrEmpty(groupName))
Register(groupName, radioButton);
}
}
private static void Register(string groupName, RadioButton radioButton)
{
if (_groupNameToElements == null)
_groupNameToElements = new Hashtable(1);
lock (_groupNameToElements)
{
ArrayList elements = (ArrayList)_groupNameToElements[groupName];
if (elements == null)
{
elements = new ArrayList(1);
_groupNameToElements[groupName] = elements;
}
else
{
// There were some elements there, remove dead ones
PurgeDead(elements, null);
}
elements.Add(new WeakReference(radioButton));
}
_currentlyRegisteredGroupName.SetValue(radioButton, groupName);
}
private static void Unregister(string groupName, RadioButton radioButton)
{
if (_groupNameToElements == null)
return;
lock (_groupNameToElements)
{
// Get all elements bound to this key and remove this element
ArrayList elements = (ArrayList)_groupNameToElements[groupName];
if (elements != null)
{
PurgeDead(elements, radioButton);
if (elements.Count == 0)
{
_groupNameToElements.Remove(groupName);
}
}
}
_currentlyRegisteredGroupName.SetValue(radioButton, null);
}
private static void PurgeDead(ArrayList elements, object elementToRemove)
{
for (int i = 0; i < elements.Count; )
{
WeakReference weakReference = (WeakReference)elements[i];
object element = weakReference.Target;
if (element == null || element == elementToRemove)
{
elements.RemoveAt(i);
}
else
{
i++;
}
}
}
private void UpdateRadioButtonGroup()
{
string groupName = GroupName;
if (!string.IsNullOrEmpty(groupName))
{
Visual rootScope = KeyboardNavigation.GetVisualRoot(this);
if (_groupNameToElements == null)
_groupNameToElements = new Hashtable(1);
lock (_groupNameToElements)
{
// Get all elements bound to this key and remove this element
ArrayList elements = (ArrayList)_groupNameToElements[groupName];
for (int i = 0; i < elements.Count; )
{
WeakReference weakReference = (WeakReference)elements[i];
RadioButton rb = weakReference.Target as RadioButton;
if (rb == null)
{
// Remove dead instances
elements.RemoveAt(i);
}
else
{
// Uncheck all checked RadioButtons different from the current one
if (rb != this && (rb.IsChecked == true) && rootScope == KeyboardNavigation.GetVisualRoot(rb))
rb.UncheckRadioButton();
i++;
}
}
}
}
else // Logical parent should be the group
{
DependencyObject parent = this.Parent;
if (parent != null)
{
// Traverse logical children
IEnumerable children = LogicalTreeHelper.GetChildren(parent);
IEnumerator itor = children.GetEnumerator();
while (itor.MoveNext())
{
RadioButton rb = itor.Current as RadioButton;
if (rb != null && rb != this && string.IsNullOrEmpty(rb.GroupName) && (rb.IsChecked == true))
rb.UncheckRadioButton();
}
}
}
}
private void UncheckRadioButton()
{
SetCurrentValueInternal(IsCheckedProperty, MS.Internal.KnownBoxes.BooleanBoxes.FalseBox);
}
#endregion
#region Properties and Events
///
/// The DependencyID for the GroupName property.
/// Default Value: "String.Empty"
///
public static readonly DependencyProperty GroupNameProperty = DependencyProperty.Register(
"GroupName",
typeof(string),
typeof(RadioButton),
new FrameworkPropertyMetadata(String.Empty, new PropertyChangedCallback(OnGroupNameChanged)));
///
/// GroupName determine mutually excusive radiobutton groups
///
[DefaultValue("")]
[Localizability(LocalizationCategory.NeverLocalize)] // cannot be localized
public string GroupName
{
get
{
return (string)GetValue(GroupNameProperty);
}
set
{
SetValue(GroupNameProperty, value);
}
}
#endregion
#region Override methods
///
/// Creates AutomationPeer ( )
///
protected override System.Windows.Automation.Peers.AutomationPeer OnCreateAutomationPeer()
{
return new System.Windows.Automation.Peers.RadioButtonAutomationPeer(this);
}
///
/// This method is invoked when the IsChecked becomes true.
///
/// RoutedEventArgs.
protected override void OnChecked(RoutedEventArgs e)
{
// If RadioButton is checked we should uncheck the others in the same group
UpdateRadioButtonGroup();
base.OnChecked(e);
}
///
/// This override method is called from OnClick().
/// RadioButton implements its own toggle behavior
///
protected internal override void OnToggle()
{
SetCurrentValueInternal(IsCheckedProperty, MS.Internal.KnownBoxes.BooleanBoxes.TrueBox);
}
///
/// The Access key for this control was invoked.
///
///
protected override void OnAccessKey(AccessKeyEventArgs e)
{
if (!IsKeyboardFocused)
{
Focus();
}
base.OnAccessKey(e);
}
#endregion
#region Accessibility
#endregion Accessibility
#region DTypeThemeStyleKey
// Returns the DependencyObjectType for the registered ThemeStyleKey's default
// value. Controls will override this method to return approriate types.
internal override DependencyObjectType DTypeThemeStyleKey
{
get { return _dType; }
}
private static DependencyObjectType _dType;
#endregion DTypeThemeStyleKey
#region private data
[ThreadStatic] private static Hashtable _groupNameToElements;
private static readonly UncommonField _currentlyRegisteredGroupName = new UncommonField();
#endregion private data
}
}
// 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
- SelectionRangeConverter.cs
- PersonalizablePropertyEntry.cs
- PartialList.cs
- BindingExpressionBase.cs
- EmptyImpersonationContext.cs
- SystemIcmpV6Statistics.cs
- DbMetaDataFactory.cs
- WebPartDescription.cs
- BitmapScalingModeValidation.cs
- Splitter.cs
- GridPattern.cs
- DataGridBeginningEditEventArgs.cs
- ColumnHeaderConverter.cs
- ViewService.cs
- GeneratedContractType.cs
- SystemInfo.cs
- NumericUpDownAccelerationCollection.cs
- EventLogPermissionEntry.cs
- EditorZoneBase.cs
- versioninfo.cs
- InternalRelationshipCollection.cs
- XmlAggregates.cs
- Composition.cs
- TypeToArgumentTypeConverter.cs
- SqlConnectionStringBuilder.cs
- Stackframe.cs
- Italic.cs
- DataListCommandEventArgs.cs
- EventDescriptorCollection.cs
- WebPart.cs
- HwndKeyboardInputProvider.cs
- DataControlButton.cs
- EdmEntityTypeAttribute.cs
- X509CertificateCollection.cs
- WebPartVerbsEventArgs.cs
- Array.cs
- FrameworkObject.cs
- UniqueEventHelper.cs
- HtmlTextViewAdapter.cs
- IntegerValidatorAttribute.cs
- LogEntryHeaderDeserializer.cs
- KerberosRequestorSecurityToken.cs
- SoapDocumentServiceAttribute.cs
- TTSEngineTypes.cs
- AutomationPattern.cs
- ClientSettings.cs
- TextBoxAutoCompleteSourceConverter.cs
- ResourceContainer.cs
- QueryOperator.cs
- SspiSafeHandles.cs
- InstalledVoice.cs
- CheckedListBox.cs
- PeerService.cs
- XmlValidatingReaderImpl.cs
- FunctionCommandText.cs
- MimePart.cs
- SplayTreeNode.cs
- Int32Rect.cs
- Vector3DCollection.cs
- DefaultEventAttribute.cs
- Thread.cs
- RepeaterItem.cs
- Brush.cs
- TdsParserStateObject.cs
- CompilerParameters.cs
- EnumBuilder.cs
- EntitySqlException.cs
- DoubleCollection.cs
- TdsParserHelperClasses.cs
- OdbcEnvironment.cs
- RelatedView.cs
- PeerToPeerException.cs
- AssociationEndMember.cs
- TagMapInfo.cs
- WebPartConnectionsCancelVerb.cs
- GenericWebPart.cs
- ImageMapEventArgs.cs
- InstallerTypeAttribute.cs
- UpWmlPageAdapter.cs
- ApplicationHost.cs
- AuthenticationService.cs
- SqlClientMetaDataCollectionNames.cs
- DesignerLoader.cs
- EncoderReplacementFallback.cs
- CorrelationActionMessageFilter.cs
- ProfessionalColorTable.cs
- XmlArrayItemAttributes.cs
- DrawingVisualDrawingContext.cs
- EncryptedPackage.cs
- AttachedProperty.cs
- TreeWalker.cs
- CreateUserErrorEventArgs.cs
- WebPartManager.cs
- TreeNode.cs
- COAUTHINFO.cs
- ToolboxService.cs
- DllNotFoundException.cs
- ProfileElement.cs
- DataGridViewAutoSizeColumnModeEventArgs.cs
- DetailsViewDeletedEventArgs.cs