diff --git a/eng/WpfArcadeSdk/tools/Wpf.Cpp.targets b/eng/WpfArcadeSdk/tools/Wpf.Cpp.targets
index f1a7de9a9..ad973b351 100644
--- a/eng/WpfArcadeSdk/tools/Wpf.Cpp.targets
+++ b/eng/WpfArcadeSdk/tools/Wpf.Cpp.targets
@@ -353,6 +353,16 @@ using namespace System::Runtime::Versioning;
+
+
+
+
+
+
GetUnmanagedStream();
+ _fontSourcePointer = _fontSourceStream->PositionPointer - _fontSourceStream->Position;
try
{
_lastWriteTime = fontSource->GetLastWriteTimeUtc().ToFileTimeUtc();
- }
+ }
catch(System::ArgumentOutOfRangeException^) //The resulting file time would represent a date and time before 12:00 midnight January 1, 1601 C.E. UTC.
{
_lastWriteTime = -1;
- }
-
- // Create lock to control access to font source stream.
- _fontSourceStreamLock = gcnew Object();
+ }
}
FontFileStream::~FontFileStream()
@@ -61,31 +59,9 @@ namespace MS { namespace Internal { namespace Text { namespace TextInterface
return E_INVALIDARG;
}
- int fragmentSizeInt = (int)fragmentSize;
- array^ buffer = gcnew array(fragmentSizeInt);
-
- // DWrite may call this method from multiple threads. We need to ensure thread safety by making Seek and Read atomic.
- System::Threading::Monitor::Enter(_fontSourceStreamLock);
- try
- {
- _fontSourceStream->Seek(fileOffset, //long
- System::IO::SeekOrigin::Begin);
-
- _fontSourceStream->Read(buffer, //byte[]
- 0, //int
- fragmentSizeInt //int
- );
- }
- finally
- {
- System::Threading::Monitor::Exit(_fontSourceStreamLock);
- }
-
- GCHandle gcHandle = GCHandle::Alloc(buffer, GCHandleType::Pinned);
-
- *fragmentStart = (byte*)(gcHandle.AddrOfPinnedObject().ToPointer());
-
- *fragmentContext = GCHandle::ToIntPtr(gcHandle).ToPointer();
+ // Return a pointer to the font data that is already loaded in memory (because the font source resource is mmapped into the process' address space).
+ *fragmentStart = _fontSourcePointer + fileOffset;
+ *fragmentContext = nullptr;
}
catch(System::Exception^ exception)
{
@@ -102,11 +78,6 @@ namespace MS { namespace Internal { namespace Text { namespace TextInterface
void* fragmentContext
)
{
- if (fragmentContext != NULL)
- {
- GCHandle gcHandle = GCHandle::FromIntPtr(IntPtr(fragmentContext));
- gcHandle.Free();
- }
}
[ComVisible(true)]
diff --git a/src/Microsoft.DotNet.Wpf/src/DirectWriteForwarder/CPP/DWriteWrapper/FontFileStream.h b/src/Microsoft.DotNet.Wpf/src/DirectWriteForwarder/CPP/DWriteWrapper/FontFileStream.h
index fa1f3a50c..49cf479b0 100644
--- a/src/Microsoft.DotNet.Wpf/src/DirectWriteForwarder/CPP/DWriteWrapper/FontFileStream.h
+++ b/src/Microsoft.DotNet.Wpf/src/DirectWriteForwarder/CPP/DWriteWrapper/FontFileStream.h
@@ -20,9 +20,9 @@ namespace MS { namespace Internal { namespace Text { namespace TextInterface
private ref class FontFileStream : public IDWriteFontFileStreamMirror
{
private:
- Stream^ _fontSourceStream;
+ UnmanagedMemoryStream^ _fontSourceStream;
+ Byte* _fontSourcePointer;
INT64 _lastWriteTime;
- Object^ _fontSourceStreamLock;
public:
diff --git a/src/Microsoft.DotNet.Wpf/src/DirectWriteForwarder/DirectWriteForwarder.vcxproj b/src/Microsoft.DotNet.Wpf/src/DirectWriteForwarder/DirectWriteForwarder.vcxproj
index 5155bf4aa..d73c1b958 100644
--- a/src/Microsoft.DotNet.Wpf/src/DirectWriteForwarder/DirectWriteForwarder.vcxproj
+++ b/src/Microsoft.DotNet.Wpf/src/DirectWriteForwarder/DirectWriteForwarder.vcxproj
@@ -31,6 +31,11 @@
.NETCoreApp
v6.0
Unknown
+
+ true
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationCore/MS/internal/SynchronizedInputHelper.cs b/src/Microsoft.DotNet.Wpf/src/PresentationCore/MS/internal/SynchronizedInputHelper.cs
index 3d020a8e1..28cfd0a05 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationCore/MS/internal/SynchronizedInputHelper.cs
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationCore/MS/internal/SynchronizedInputHelper.cs
@@ -297,21 +297,18 @@ internal static RoutedEvent[] MapInputTypeToRoutedEvents(SynchronizedInputType i
internal static void RaiseAutomationEvents()
{
- if (InputElement.IsUIElement(InputManager.ListeningElement))
+ if (InputManager.ListeningElement is UIElement e)
{
- UIElement e = (UIElement)InputManager.ListeningElement;
//Raise InputDiscarded automation event
SynchronizedInputHelper.RaiseAutomationEvent(e.GetAutomationPeer());
}
- else if (InputElement.IsContentElement(InputManager.ListeningElement))
+ else if (InputManager.ListeningElement is ContentElement ce)
{
- ContentElement ce = (ContentElement)InputManager.ListeningElement;
//Raise InputDiscarded automation event
SynchronizedInputHelper.RaiseAutomationEvent(ce.GetAutomationPeer());
}
- else if (InputElement.IsUIElement3D(InputManager.ListeningElement))
+ else if (InputManager.ListeningElement is UIElement3D e3D)
{
- UIElement3D e3D = (UIElement3D)InputManager.ListeningElement;
//Raise InputDiscarded automation event
SynchronizedInputHelper.RaiseAutomationEvent(e3D.GetAutomationPeer());
}
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationCore/MS/internal/UIElementHelper.cs b/src/Microsoft.DotNet.Wpf/src/PresentationCore/MS/internal/UIElementHelper.cs
index 4496a6a01..b699b8403 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationCore/MS/internal/UIElementHelper.cs
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationCore/MS/internal/UIElementHelper.cs
@@ -141,7 +141,7 @@ internal static DependencyObject GetUIParent(DependencyObject child, bool contin
[FriendAccessAllowed]
internal static bool IsUIElementOrUIElement3D(DependencyObject o)
{
- return (o is UIElement || o is UIElement3D);
+ return (o is UIElement or UIElement3D);
}
[FriendAccessAllowed]
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Input/Command/CommandBinding.cs b/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Input/Command/CommandBinding.cs
index 0890cda14..02acc51b5 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Input/Command/CommandBinding.cs
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Input/Command/CommandBinding.cs
@@ -7,6 +7,7 @@
using System;
using System.ComponentModel;
+using System.Diagnostics;
using System.Windows;
using System.Windows.Markup;
using MS.Internal;
@@ -60,18 +61,13 @@ public CommandBinding(ICommand command, ExecutedRoutedEventHandler executed)
/// Handler associated with determining if the command can execute.
public CommandBinding(ICommand command, ExecutedRoutedEventHandler executed, CanExecuteRoutedEventHandler canExecute)
{
- if (command == null)
- {
- throw new ArgumentNullException("command");
- }
+ _command = command ?? throw new ArgumentNullException(nameof(command));
- _command = command;
-
- if (executed != null)
+ if (executed is not null)
{
Executed += executed;
}
- if (canExecute != null)
+ if (canExecute is not null)
{
CanExecute += canExecute;
}
@@ -87,20 +83,8 @@ public CommandBinding(ICommand command, ExecutedRoutedEventHandler executed, Can
[Localizability(LocalizationCategory.NeverLocalize)] // cannot be localized
public ICommand Command
{
- get
- {
- return _command;
- }
-
- set
- {
- if (value == null)
- {
- throw new ArgumentNullException("value");
- }
-
- _command = value;
- }
+ get => _command;
+ set => _command = value ?? throw new ArgumentNullException(nameof(value));
}
#endregion
@@ -138,49 +122,46 @@ public ICommand Command
/// Event arguments.
internal void OnCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
- if (!e.Handled)
+ if (e.Handled) return;
+ if (e.RoutedEvent == CommandManager.CanExecuteEvent)
{
- if (e.RoutedEvent == CommandManager.CanExecuteEvent)
+ if (CanExecute is null)
{
- if (CanExecute != null)
- {
- CanExecute(sender, e);
- if (e.CanExecute)
- {
- e.Handled = true;
- }
- }
- else if (!e.CanExecute)
- {
- // If there is an Executed handler, then the command can be executed.
- if (Executed != null)
- {
- e.CanExecute = true;
- e.Handled = true;
- }
- }
+ if (e.CanExecute) return;
+ // If there is an Executed handler, then the command can be executed.
+ if (Executed is null) return;
+ e.CanExecute = true;
+ e.Handled = true;
}
- else // e.RoutedEvent == CommandManager.PreviewCanExecuteEvent
+ else
{
- if (PreviewCanExecute != null)
+ CanExecute(sender, e);
+ if (e.CanExecute)
{
- PreviewCanExecute(sender, e);
- if (e.CanExecute)
- {
- e.Handled = true;
- }
+ e.Handled = true;
}
}
}
+ else // e.RoutedEvent == CommandManager.PreviewCanExecuteEvent
+ {
+ if (PreviewCanExecute is null) return;
+ PreviewCanExecute(sender, e);
+ if (e.CanExecute)
+ {
+ e.Handled = true;
+ }
+ }
}
private bool CheckCanExecute(object sender, ExecutedRoutedEventArgs e)
{
- CanExecuteRoutedEventArgs canExecuteArgs = new CanExecuteRoutedEventArgs(e.Command, e.Parameter);
- canExecuteArgs.RoutedEvent = CommandManager.CanExecuteEvent;
+ CanExecuteRoutedEventArgs canExecuteArgs = new(e.Command, e.Parameter)
+ {
+ RoutedEvent = CommandManager.CanExecuteEvent,
+ // Since we don't actually raise this event, we have to explicitly set the source.
+ Source = e.OriginalSource
+ };
- // Since we don't actually raise this event, we have to explicitly set the source.
- canExecuteArgs.Source = e.OriginalSource;
canExecuteArgs.OverrideSource(e.Source);
OnCanExecute(sender, canExecuteArgs);
@@ -195,30 +176,22 @@ private bool CheckCanExecute(object sender, ExecutedRoutedEventArgs e)
/// Event arguments.
internal void OnExecuted(object sender, ExecutedRoutedEventArgs e)
{
- if (!e.Handled)
+ if (e.Handled) return;
+ if (e.RoutedEvent == CommandManager.ExecutedEvent)
{
- if (e.RoutedEvent == CommandManager.ExecutedEvent)
- {
- if (Executed != null)
- {
- if (CheckCanExecute(sender, e))
- {
- Executed(sender, e);
- e.Handled = true;
- }
- }
- }
- else // e.RoutedEvent == CommandManager.PreviewExecutedEvent
- {
- if (PreviewExecuted != null)
- {
- if (CheckCanExecute(sender, e))
- {
- PreviewExecuted(sender, e);
- e.Handled = true;
- }
- }
- }
+ if (Executed is null) return;
+ if (!CheckCanExecute(sender, e)) return;
+ Debug.Assert(Executed != null, nameof(Executed) + " != null");
+ Executed(sender, e);
+ e.Handled = true;
+ }
+ else // e.RoutedEvent == CommandManager.PreviewExecutedEvent
+ {
+ if (PreviewExecuted is null) return;
+ if (!CheckCanExecute(sender, e)) return;
+ Debug.Assert(PreviewExecuted != null, nameof(PreviewExecuted) + " != null");
+ PreviewExecuted(sender, e);
+ e.Handled = true;
}
}
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Input/Command/CommandBindingCollection.cs b/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Input/Command/CommandBindingCollection.cs
index 98725d642..8adf9e4d2 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Input/Command/CommandBindingCollection.cs
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Input/Command/CommandBindingCollection.cs
@@ -52,9 +52,9 @@ public CommandBindingCollection()
/// CommandBinding array
public CommandBindingCollection(IList commandBindings)
{
- if (commandBindings != null && commandBindings.Count > 0)
+ if (commandBindings is { Count: > 0 })
{
- AddRange(commandBindings as ICollection);
+ AddRange(commandBindings);
}
}
@@ -76,12 +76,9 @@ public CommandBindingCollection(IList commandBindings)
///
/// commandbinding array to copy into
/// start index in current list to copy
- void ICollection.CopyTo(System.Array array, int index)
+ void ICollection.CopyTo(System.Array array, int index)
{
- if (_innerCBList != null)
- {
- ((ICollection)_innerCBList).CopyTo(array, index);
- }
+ ((ICollection)_innerCBList)?.CopyTo(array, index);
}
#endregion Implementation of ICollection
@@ -92,7 +89,7 @@ void ICollection.CopyTo(System.Array array, int index)
/// true - if found, false - otherwise
bool IList.Contains(object key)
{
- return this.Contains(key as CommandBinding) ;
+ return Contains(key as CommandBinding) ;
}
///
@@ -102,8 +99,7 @@ bool IList.Contains(object key)
///
int IList.IndexOf(object value)
{
- CommandBinding commandBinding = value as CommandBinding;
- return ((commandBinding != null) ? this.IndexOf(commandBinding) : -1);
+ return ((value is CommandBinding commandBinding) ? IndexOf(commandBinding) : -1);
}
///
@@ -113,7 +109,7 @@ int IList.IndexOf(object value)
/// item to insert
void IList.Insert(int index, object value)
{
- this.Insert(index, value as CommandBinding);
+ Insert(index, value as CommandBinding);
}
///
@@ -122,7 +118,7 @@ void IList.Insert(int index, object value)
/// CommandBinding object to add
int IList.Add(object commandBinding)
{
- return this.Add(commandBinding as CommandBinding);
+ return Add(commandBinding as CommandBinding);
}
///
@@ -131,7 +127,7 @@ int IList.Add(object commandBinding)
/// CommandBinding object to remove
void IList.Remove(object commandBinding)
{
- this.Remove(commandBinding as CommandBinding);
+ Remove(commandBinding as CommandBinding);
}
///
@@ -145,8 +141,7 @@ object IList.this[int index]
}
set
{
- CommandBinding commandBinding = value as CommandBinding;
- if (commandBinding == null)
+ if (value is not CommandBinding commandBinding)
throw new NotSupportedException(SR.Get(SRID.CollectionOnlyAcceptsCommandBindings));
this[index] = commandBinding;
@@ -160,7 +155,7 @@ public CommandBinding this[int index]
{
get
{
- return (_innerCBList != null ? _innerCBList[index] : null);
+ return (_innerCBList?[index]);
}
set
{
@@ -179,8 +174,7 @@ public int Add(CommandBinding commandBinding)
{
if (commandBinding != null)
{
- if (_innerCBList == null)
- _innerCBList = new System.Collections.Generic.List(1);
+ _innerCBList ??= new Collections.Generic.List(1);
_innerCBList.Add(commandBinding);
return 0; // ICollection.Add no longer returns the indice
@@ -200,27 +194,23 @@ public int Add(CommandBinding commandBinding)
public void AddRange(ICollection collection)
{
if (collection==null)
- throw new ArgumentNullException("collection");
-
- if (collection.Count > 0)
- {
- if (_innerCBList == null)
- _innerCBList = new System.Collections.Generic.List(collection.Count);
+ throw new ArgumentNullException(nameof(collection));
+
+ if (collection.Count <= 0) return;
+ _innerCBList ??= new System.Collections.Generic.List(collection.Count);
- IEnumerator collectionEnum = collection.GetEnumerator();
- while(collectionEnum.MoveNext())
+ IEnumerator collectionEnum = collection.GetEnumerator();
+ while(collectionEnum.MoveNext())
+ {
+ if (collectionEnum.Current is CommandBinding cmdBinding)
{
- CommandBinding cmdBinding = collectionEnum.Current as CommandBinding;
- if (cmdBinding != null)
- {
- _innerCBList.Add(cmdBinding);
- }
- else
- {
- throw new NotSupportedException(SR.Get(SRID.CollectionOnlyAcceptsCommandBindings));
- }
- }
- }
+ _innerCBList.Add(cmdBinding);
+ }
+ else
+ {
+ throw new NotSupportedException(SR.Get(SRID.CollectionOnlyAcceptsCommandBindings));
+ }
+ }
}
///
@@ -232,8 +222,7 @@ public void Insert(int index, CommandBinding commandBinding)
{
if (commandBinding != null)
{
- if (_innerCBList != null)
- _innerCBList.Insert(index, commandBinding);
+ _innerCBList?.Insert(index, commandBinding);
}
else
{
@@ -257,8 +246,7 @@ public void Remove(CommandBinding commandBinding)
/// index at which the item needs to be removed
public void RemoveAt(int index)
{
- if (_innerCBList != null)
- _innerCBList.RemoveAt(index);
+ _innerCBList?.RemoveAt(index);
}
///
@@ -276,11 +264,7 @@ public bool IsSynchronized
{
get
{
- if (_innerCBList != null)
- {
- return ((IList)_innerCBList).IsSynchronized;
- }
- return false;
+ return _innerCBList is not null && ((IList)_innerCBList).IsSynchronized;
}
}
@@ -310,7 +294,7 @@ public int Count
{
get
{
- return (_innerCBList != null ? _innerCBList.Count : 0);
+ return _innerCBList?.Count ?? 0;
}
}
@@ -319,11 +303,9 @@ public int Count
///
public void Clear()
{
- if (_innerCBList != null)
- {
- _innerCBList.Clear();
- _innerCBList = null;
- }
+ if (_innerCBList is null) return;
+ _innerCBList.Clear();
+ _innerCBList = null;
}
///
@@ -333,7 +315,7 @@ public void Clear()
///
public int IndexOf(CommandBinding value)
{
- return ((_innerCBList != null) ? _innerCBList.IndexOf(value) : -1);
+ return _innerCBList?.IndexOf(value) ?? -1;
}
///
@@ -355,10 +337,9 @@ public bool Contains(CommandBinding commandBinding)
///
/// type-safe (CommandBinding) array
/// start index in current list to copy
- public void CopyTo(CommandBinding[] commandBindings, int index)
+ public void CopyTo(CommandBinding[] commandBindings, int index)
{
- if (_innerCBList != null)
- _innerCBList.CopyTo(commandBindings, index);
+ _innerCBList?.CopyTo(commandBindings, index);
}
#region Implementation of Enumerable
@@ -385,17 +366,11 @@ internal ICommand FindMatch(object targetElement, InputEventArgs inputEventArgs)
for (int i = 0; i < Count; i++)
{
CommandBinding commandBinding = this[i];
- RoutedCommand routedCommand = commandBinding.Command as RoutedCommand;
- if (routedCommand != null)
+ if (commandBinding.Command is not RoutedCommand routedCommand) continue;
+ InputGestureCollection inputGestures = routedCommand.InputGesturesInternal;
+ if (inputGestures?.FindMatch(targetElement, inputEventArgs) != null)
{
- InputGestureCollection inputGestures = routedCommand.InputGesturesInternal;
- if (inputGestures != null)
- {
- if (inputGestures.FindMatch(targetElement, inputEventArgs) != null)
- {
- return routedCommand;
- }
- }
+ return routedCommand;
}
}
@@ -423,7 +398,7 @@ internal CommandBinding FindMatch(ICommand command, ref int index)
//
//------------------------------------------------------
#region Private Fields
- private System.Collections.Generic.List _innerCBList;
+ private Collections.Generic.List _innerCBList;
#endregion Private Fields
}
}
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Input/Command/CommandManager.cs b/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Input/Command/CommandManager.cs
index 26f934c82..3a0454e32 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Input/Command/CommandManager.cs
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Input/Command/CommandManager.cs
@@ -352,9 +352,9 @@ internal static void TranslateInput(IInputElement targetElement, InputEventArgs
// Determine UIElement/ContentElement/Neither type
DependencyObject targetElementAsDO = targetElement as DependencyObject;
- bool isUIElement = InputElement.IsUIElement(targetElementAsDO);
- bool isContentElement = !isUIElement && InputElement.IsContentElement(targetElementAsDO);
- bool isUIElement3D = !isUIElement && !isContentElement && InputElement.IsUIElement3D(targetElementAsDO);
+ bool isUIElement = targetElementAsDO is UIElement;
+ bool isContentElement = !isUIElement && targetElementAsDO is ContentElement;
+ bool isUIElement3D = !isUIElement && !isContentElement && targetElementAsDO is UIElement3D;
// Step 1: Check local input bindings
InputBindingCollection localInputBindings = null;
@@ -370,6 +370,7 @@ internal static void TranslateInput(IInputElement targetElement, InputEventArgs
{
localInputBindings = ((UIElement3D)targetElement).InputBindingsInternal;
}
+
if (localInputBindings != null)
{
InputBinding inputBinding = localInputBindings.FindMatch(targetElement, inputEventArgs);
@@ -423,6 +424,7 @@ internal static void TranslateInput(IInputElement targetElement, InputEventArgs
{
localCommandBindings = ((UIElement3D)targetElement).CommandBindingsInternal;
}
+
if (localCommandBindings != null)
{
command = localCommandBindings.FindMatch(targetElement, inputEventArgs);
@@ -599,64 +601,56 @@ internal static void OnCommandDevice(object sender, CommandDeviceEventArgs e)
private static void FindCommandBinding(object sender, RoutedEventArgs e, ICommand command, bool execute)
{
// Check local command bindings
- CommandBindingCollection commandBindings = null;
- DependencyObject senderAsDO = sender as DependencyObject;
- if (InputElement.IsUIElement(senderAsDO))
- {
- commandBindings = ((UIElement)senderAsDO).CommandBindingsInternal;
- }
- else if (InputElement.IsContentElement(senderAsDO))
+ CommandBindingCollection commandBindings = sender switch
{
- commandBindings = ((ContentElement)senderAsDO).CommandBindingsInternal;
- }
- else if (InputElement.IsUIElement3D(senderAsDO))
- {
- commandBindings = ((UIElement3D)senderAsDO).CommandBindingsInternal;
- }
- if (commandBindings != null)
+ UIElement uiElement => uiElement.CommandBindingsInternal,
+ ContentElement contentElement => contentElement.CommandBindingsInternal,
+ UIElement3D uiElement3d => uiElement3d.CommandBindingsInternal,
+ _ => default
+ };
+ if (commandBindings is not null)
{
FindCommandBinding(commandBindings, sender, e, command, execute);
}
+ Type senderType = sender.GetType();
+
// If no command binding is found, check class command bindings
// First find the relevant command bindings, under the lock.
// Most of the time there are no such bindings; most of the rest of
// the time there is only one. Lazy-allocate with this in mind.
- Tuple tuple = null; // zero or one binding
- List> list = null; // more than one
-
+ ValueTuple? tuple = default; // zero or one binding
+ List> list = default; // more than one
+
lock (_classCommandBindings.SyncRoot)
{
// Check from the current type to all the base types
- Type classType = sender.GetType();
- while (classType != null)
+ Type classType = senderType;
+ while (classType is not null)
{
- CommandBindingCollection classCommandBindings = _classCommandBindings[classType] as CommandBindingCollection;
- if (classCommandBindings != null)
+ if (_classCommandBindings[classType] is CommandBindingCollection classCommandBindings)
{
int index = 0;
while (true)
{
CommandBinding commandBinding = classCommandBindings.FindMatch(command, ref index);
- if (commandBinding != null)
+ if (commandBinding is null)
{
- if (tuple == null)
- {
- tuple = new Tuple(classType, commandBinding);
- }
- else
- {
- if (list == null)
- {
- list = new List>();
- list.Add(tuple);
- }
- list.Add(new Tuple(classType, commandBinding));
- }
+ break;
+ }
+
+ if (tuple is null)
+ {
+ tuple = ValueTuple.Create(classType, commandBinding);
}
else
{
- break;
+ list ??= new List>(8)
+ {
+ // We know that tuple cannot be null here
+ tuple.Value
+ };
+ list.Add(new ValueTuple(classType, commandBinding));
}
}
}
@@ -666,37 +660,35 @@ private static void FindCommandBinding(object sender, RoutedEventArgs e, IComman
// execute the bindings. This can call into user code, so it must
// be done outside the lock to avoid deadlock.
- if (list != null)
+ if (list is not null)
{
// more than one binding
- ExecutedRoutedEventArgs exArgs = execute ? (ExecutedRoutedEventArgs)e : null;
- CanExecuteRoutedEventArgs canExArgs = execute ? null : (CanExecuteRoutedEventArgs)e;
- for (int i=0; i info;
- if (InputElement.IsUIElement(o))
+ if (o is UIElement uie)
{
- UIElement uie = o as UIElement;
uie.AddHandler(SourceChangedEvent, handler);
info = uie.EventHandlersStore[SourceChangedEvent];
if (1 == info.Count)
@@ -156,9 +155,8 @@ public static void AddSourceChangedHandler(IInputElement element, SourceChangedE
AddElementToWatchList(uie);
}
}
- else if (InputElement.IsUIElement3D(o))
+ else if (o is UIElement3D uie3D)
{
- UIElement3D uie3D = o as UIElement3D;
uie3D.AddHandler(SourceChangedEvent, handler);
info = uie3D.EventHandlersStore[SourceChangedEvent];
if (1 == info.Count)
@@ -167,13 +165,18 @@ public static void AddSourceChangedHandler(IInputElement element, SourceChangedE
AddElementToWatchList(uie3D);
}
}
- else
+ else if (o is ContentElement ce)
{
- ContentElement ce = o as ContentElement;
ce.AddHandler(SourceChangedEvent, handler);
info = ce.EventHandlersStore[SourceChangedEvent];
if (1 == info.Count)
+ {
AddElementToWatchList(ce);
+ }
+ }
+ else
+ {
+ throw new InvalidOperationException(SR.Get(SRID.Invalid_IInputElement, o.GetType()));
}
}
}
@@ -211,9 +214,8 @@ public static void RemoveSourceChangedHandler(IInputElement e, SourceChangedEven
EventHandlersStore store;
// Either UIElement or ContentElement.
- if (InputElement.IsUIElement(o))
+ if (o is UIElement uie)
{
- UIElement uie = o as UIElement;
uie.RemoveHandler(SourceChangedEvent, handler);
store = uie.EventHandlersStore;
if (store != null)
@@ -226,9 +228,8 @@ public static void RemoveSourceChangedHandler(IInputElement e, SourceChangedEven
RemoveElementFromWatchList(uie);
}
}
- else if (InputElement.IsUIElement3D(o))
+ else if (o is UIElement3D uie3D)
{
- UIElement3D uie3D = o as UIElement3D;
uie3D.RemoveHandler(SourceChangedEvent, handler);
store = uie3D.EventHandlersStore;
if (store != null)
@@ -241,9 +242,8 @@ public static void RemoveSourceChangedHandler(IInputElement e, SourceChangedEven
RemoveElementFromWatchList(uie3D);
}
}
- else
+ else if (o is ContentElement ce)
{
- ContentElement ce = o as ContentElement;
ce.RemoveHandler(SourceChangedEvent, handler);
store = ce.EventHandlersStore;
if (store != null)
@@ -255,6 +255,10 @@ public static void RemoveSourceChangedHandler(IInputElement e, SourceChangedEven
RemoveElementFromWatchList(ce);
}
}
+ else
+ {
+ throw new InvalidOperationException(SR.Get(SRID.Invalid_IInputElement, o.GetType()));
+ }
}
}
@@ -548,7 +552,7 @@ protected void ClearContentRenderedListeners()
/// Event Args.
internal static void OnVisualAncestorChanged(DependencyObject uie, AncestorChangedEventArgs e)
{
- Debug.Assert(InputElement.IsUIElement3D(uie) || InputElement.IsUIElement(uie));
+ Debug.Assert(uie is UIElement3D or UIElement);
if (true == (bool)uie.GetValue(GetsSourceChangedEventProperty))
{
@@ -740,17 +744,21 @@ private static bool UpdateSourceOfElement(DependencyObject doTarget,
SourceChangedEventArgs args = new SourceChangedEventArgs(cachedSource, realSource);
args.RoutedEvent=SourceChangedEvent;
- if (InputElement.IsUIElement(doTarget))
+ if (doTarget is UIElement uiElement)
{
- ((UIElement)doTarget).RaiseEvent(args);
+ uiElement.RaiseEvent(args);
}
- else if (InputElement.IsContentElement(doTarget))
+ else if (doTarget is ContentElement contentElement)
+ {
+ contentElement.RaiseEvent(args);
+ }
+ else if (doTarget is UIElement3D uiElement3D)
{
- ((ContentElement)doTarget).RaiseEvent(args);
+ uiElement3D.RaiseEvent(args);
}
else
{
- ((UIElement3D)doTarget).RaiseEvent(args);
+ throw new InvalidOperationException(SR.Get(SRID.Invalid_IInputElement, doTarget.GetType()));
}
calledOut = true;
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/UIElement.cs b/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/UIElement.cs
index 14e0a26b6..49d9a88f4 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/UIElement.cs
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/UIElement.cs
@@ -1443,7 +1443,7 @@ protected internal override void OnVisualParentChanged(DependencyObject oldParen
{
DependencyObject parent = _parent;
- if (!InputElement.IsUIElement(parent) && !InputElement.IsUIElement3D(parent))
+ if (parent is not UIElement and not UIElement3D)
{
Visual parentAsVisual = parent as Visual;
@@ -1490,7 +1490,7 @@ protected internal override void OnVisualParentChanged(DependencyObject oldParen
{
DependencyObject parent = oldParent;
- if (!InputElement.IsUIElement(parent) && !InputElement.IsUIElement3D(parent))
+ if (parent is not UIElement and not UIElement3D)
{
// We are being unplugged from a non-UIElement visual. This
// means that our parent didn't play by the same rules we
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/UIElement3D.cs b/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/UIElement3D.cs
index f6761dfe1..33efb11b5 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/UIElement3D.cs
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/UIElement3D.cs
@@ -148,7 +148,7 @@ protected internal override void OnVisualParentChanged(DependencyObject oldParen
{
DependencyObject parent = InternalVisualParent;
- if (!InputElement.IsUIElement(parent) && !InputElement.IsUIElement3D(parent))
+ if (parent is not UIElement and not UIElement3D)
{
Visual parentAsVisual = parent as Visual;
@@ -192,7 +192,7 @@ protected internal override void OnVisualParentChanged(DependencyObject oldParen
{
DependencyObject parent = oldParent;
- if (!InputElement.IsUIElement(parent) && !InputElement.IsUIElement3D(parent))
+ if (parent is not UIElement and not UIElement3D)
{
// We are being unplugged from a non-UIElement visual. This
// means that our parent didn't play by the same rules we
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/MS/Internal/Annotations/Anchoring/PathNode.cs b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/MS/Internal/Annotations/Anchoring/PathNode.cs
index 1ff7bf6c7..7f5dd44de 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/MS/Internal/Annotations/Anchoring/PathNode.cs
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/MS/Internal/Annotations/Anchoring/PathNode.cs
@@ -229,7 +229,7 @@ internal static DependencyObject GetParent(DependencyObject node)
Debug.Assert(node != null, "node can not be null");
DependencyObject current = node;
- DependencyObject parent = null;
+ DependencyObject parent;
while (true)
{
@@ -255,16 +255,15 @@ internal static DependencyObject GetParent(DependencyObject node)
}
// Check if located a parent, if so, check if it's the correct type
- if ((parent == null) ||
- FrameworkElement.DType.IsInstanceOfType(parent) ||
- FrameworkContentElement.DType.IsInstanceOfType(parent))
+ if (parent is null
+ or FrameworkElement
+ or FrameworkContentElement)
{
break;
}
// Parent found but not of correct type, continue
current = parent;
- parent = null;
}
return parent;
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/MS/Internal/FrameworkObject.cs b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/MS/Internal/FrameworkObject.cs
index 423402047..bde4847e4 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/MS/Internal/FrameworkObject.cs
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/MS/Internal/FrameworkObject.cs
@@ -57,21 +57,8 @@ internal FrameworkObject(DependencyObject d)
// [code should be identical to Reset(d)]
_do = d;
- if (FrameworkElement.DType.IsInstanceOfType(d))
- {
- _fe = (FrameworkElement)d;
- _fce = null;
- }
- else if (FrameworkContentElement.DType.IsInstanceOfType(d))
- {
- _fe = null;
- _fce = (FrameworkContentElement)d;
- }
- else
- {
- _fe = null;
- _fce = null;
- }
+ _fe = d as FrameworkElement;
+ _fce = d as FrameworkContentElement;
}
internal FrameworkObject(DependencyObject d, bool throwIfNeither)
@@ -99,21 +86,8 @@ internal void Reset(DependencyObject d)
{
_do = d;
- if (FrameworkElement.DType.IsInstanceOfType(d))
- {
- _fe = (FrameworkElement)d;
- _fce = null;
- }
- else if (FrameworkContentElement.DType.IsInstanceOfType(d))
- {
- _fe = null;
- _fce = (FrameworkContentElement)d;
- }
- else
- {
- _fe = null;
- _fce = null;
- }
+ _fe = d as FrameworkElement;
+ _fce = d as FrameworkContentElement;
}
#endregion Constructors
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/MS/Internal/Helper.cs b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/MS/Internal/Helper.cs
index a45d7b9df..197122f11 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/MS/Internal/Helper.cs
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/MS/Internal/Helper.cs
@@ -286,15 +286,15 @@ internal static void DowncastToFEorFCE(DependencyObject d,
out FrameworkElement fe, out FrameworkContentElement fce,
bool throwIfNeither)
{
- if (FrameworkElement.DType.IsInstanceOfType(d))
+ if (d is FrameworkElement frameworkElement)
{
- fe = (FrameworkElement)d;
+ fe = frameworkElement;
fce = null;
}
- else if (FrameworkContentElement.DType.IsInstanceOfType(d))
+ else if (d is FrameworkContentElement frameworkContentElement)
{
fe = null;
- fce = (FrameworkContentElement)d;
+ fce = frameworkContentElement;
}
else if (throwIfNeither)
{
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/MS/Internal/Ink/ClipboardProcessor.cs b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/MS/Internal/Ink/ClipboardProcessor.cs
index 40aecf7e5..e71608321 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/MS/Internal/Ink/ClipboardProcessor.cs
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/MS/Internal/Ink/ClipboardProcessor.cs
@@ -213,9 +213,9 @@ internal bool PasteData(IDataObject dataObject, ref StrokeCollection newStrokes,
// If the Xaml data has been set in an InkCanvas, the top element will be a container InkCanvas.
// In this case, the new elements will be the children of the container.
// Otherwise, the new elements will be whatever data from the data object.
- if (elements.Count == 1 && ClipboardProcessor.InkCanvasDType.IsInstanceOfType(elements[0]))
+ if (elements.Count == 1 && elements[0] is InkCanvas inkCanvas)
{
- TearDownInkCanvasContainer((InkCanvas)( elements[0] ), ref newStrokes, ref newElements);
+ TearDownInkCanvasContainer(inkCanvas, ref newStrokes, ref newElements);
}
else
{
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/MS/Internal/PrePostDescendentsWalker.cs b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/MS/Internal/PrePostDescendentsWalker.cs
index e40e1032a..4a4f88403 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/MS/Internal/PrePostDescendentsWalker.cs
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/MS/Internal/PrePostDescendentsWalker.cs
@@ -72,7 +72,7 @@ public override void StartWalk(DependencyObject startNode, bool skipStartNode)
{
// This type checking is done in DescendentsWalker. Doing it here
// keeps us consistent.
- if (FrameworkElement.DType.IsInstanceOfType(startNode) || FrameworkContentElement.DType.IsInstanceOfType(startNode))
+ if (startNode is FrameworkElement or FrameworkContentElement)
{
_postCallback(startNode, this.Data, _priority == TreeWalkPriority.VisualTree);
}
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Automation/Peers/MenuItemAutomationPeer.cs b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Automation/Peers/MenuItemAutomationPeer.cs
index 0cf50a7b5..10bce1bcb 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Automation/Peers/MenuItemAutomationPeer.cs
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Automation/Peers/MenuItemAutomationPeer.cs
@@ -316,6 +316,16 @@ internal void RaiseExpandCollapseAutomationEvent(bool oldValue, bool newValue)
newValue ? ExpandCollapseState.Expanded : ExpandCollapseState.Collapsed);
}
+ [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
+ internal void RaiseToggleStatePropertyChangedEvent(bool oldValue, bool newValue)
+ {
+ RaisePropertyChangedEvent(TogglePatternIdentifiers.ToggleStateProperty,
+ oldValue ? ConvertToToggleState(oldValue) : ConvertToToggleState(newValue),
+ newValue ? ConvertToToggleState(oldValue) : ConvertToToggleState(newValue));
+ }
+
+ private static ToggleState ConvertToToggleState(bool value) => value ? ToggleState.On : ToggleState.Off;
+
// Return the base without the AccessKey character
///
override protected string GetNameCore()
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/BroadcastEventHelper.cs b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/BroadcastEventHelper.cs
index 056f12d17..ace65f989 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/BroadcastEventHelper.cs
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/BroadcastEventHelper.cs
@@ -292,12 +292,10 @@ private static bool OnBroadcastCallback(DependencyObject d, BroadcastEventData d
DependencyObject root = data.Root;
RoutedEvent routedEvent = data.RoutedEvent;
List eventRoute = data.EventRoute;
-
- if (FrameworkElement.DType.IsInstanceOfType(d))
- {
- // If this is a FrameworkElement
- FrameworkElement fe = (FrameworkElement)d;
+ // If this is a FrameworkElement
+ if (d is FrameworkElement fe)
+ {
if (fe != root && routedEvent == FrameworkElement.LoadedEvent && fe.UnloadedPending != null)
{
// If there is a pending Unloaded event wait till we've broadcast
@@ -422,22 +420,22 @@ private static bool OnBroadcastCallback(DependencyObject d, BroadcastEventData d
private static bool SubtreeHasLoadedChangeHandlerHelper(DependencyObject d)
{
- if (FrameworkElement.DType.IsInstanceOfType(d))
+ if (d is FrameworkElement fe)
{
- return ((FrameworkElement)d).SubtreeHasLoadedChangeHandler;
+ return fe.SubtreeHasLoadedChangeHandler;
}
- else if (FrameworkContentElement.DType.IsInstanceOfType(d))
+ else if (d is FrameworkContentElement fce)
{
- return ((FrameworkContentElement)d).SubtreeHasLoadedChangeHandler;
+ return fce.SubtreeHasLoadedChangeHandler;
}
return false;
}
private static void FireLoadedOnDescendentsHelper(DependencyObject d)
{
- if (FrameworkElement.DType.IsInstanceOfType(d))
+ if (d is FrameworkElement fe)
{
- ((FrameworkElement)d).FireLoadedOnDescendentsInternal();
+ fe.FireLoadedOnDescendentsInternal();
}
else
{
@@ -447,9 +445,9 @@ private static void FireLoadedOnDescendentsHelper(DependencyObject d)
private static void FireUnloadedOnDescendentsHelper(DependencyObject d)
{
- if (FrameworkElement.DType.IsInstanceOfType(d))
+ if (d is FrameworkElement fe)
{
- ((FrameworkElement)d).FireUnloadedOnDescendentsInternal();
+ fe.FireUnloadedOnDescendentsInternal();
}
else
{
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/MenuItem.cs b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/MenuItem.cs
index 18b01f430..5891c18c4 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/MenuItem.cs
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/MenuItem.cs
@@ -946,7 +946,10 @@ private static void OnIsCheckedChanged(DependencyObject d, DependencyPropertyCha
{
MenuItem menuItem = (MenuItem) d;
- if ((bool) e.NewValue)
+ bool oldValue = (bool)e.OldValue;
+ bool newValue = (bool)e.NewValue;
+
+ if (newValue)
{
menuItem.OnChecked(new RoutedEventArgs(CheckedEvent));
}
@@ -954,6 +957,12 @@ private static void OnIsCheckedChanged(DependencyObject d, DependencyPropertyCha
{
menuItem.OnUnchecked(new RoutedEventArgs(UncheckedEvent));
}
+
+ MenuItemAutomationPeer peer = UIElementAutomationPeer.FromElement(menuItem) as MenuItemAutomationPeer;
+ if (peer != null)
+ {
+ peer.RaiseToggleStatePropertyChangedEvent(oldValue, newValue);
+ }
}
///
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/PopupControlService.cs b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/PopupControlService.cs
index b39aea2cb..08c0e6c1e 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/PopupControlService.cs
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/PopupControlService.cs
@@ -942,17 +942,17 @@ private bool RaiseContextMenuOpeningEvent(IInputElement source, double x, double
DependencyObject sourceDO = source as DependencyObject;
if (userInitiated && sourceDO != null)
{
- if (InputElement.IsUIElement(sourceDO))
+ if (sourceDO is UIElement uiElement)
{
- ((UIElement)sourceDO).RaiseEvent(args, userInitiated);
+ uiElement.RaiseEvent(args, userInitiated);
}
- else if (InputElement.IsContentElement(sourceDO))
+ else if (sourceDO is ContentElement contentElement)
{
- ((ContentElement)sourceDO).RaiseEvent(args, userInitiated);
+ contentElement.RaiseEvent(args, userInitiated);
}
- else if (InputElement.IsUIElement3D(sourceDO))
+ else if (sourceDO is UIElement3D uiElement3D)
{
- ((UIElement3D)sourceDO).RaiseEvent(args, userInitiated);
+ uiElement3D.RaiseEvent(args, userInitiated);
}
else
{
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/Primitives/DatePickerTextBox.cs b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/Primitives/DatePickerTextBox.cs
index c9fff7ac2..2b63c8484 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/Primitives/DatePickerTextBox.cs
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/Primitives/DatePickerTextBox.cs
@@ -153,7 +153,7 @@ private T ExtractTemplatePart(string partName) where T : DependencyObject
private static T ExtractTemplatePart(string partName, DependencyObject obj) where T : DependencyObject
{
Debug.Assert(
- obj == null || typeof(T).IsInstanceOfType(obj),
+ obj == null || obj is T,
string.Format(CultureInfo.InvariantCulture, SR.Get(SRID.DatePickerTextBox_TemplatePartIsOfIncorrectType), partName, typeof(T).Name));
return obj as T;
}
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/DescendentsWalker.cs b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/DescendentsWalker.cs
index 8dbaa7d40..7338bf29d 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/DescendentsWalker.cs
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/DescendentsWalker.cs
@@ -56,8 +56,8 @@ public virtual void StartWalk(DependencyObject startNode, bool skipStartNode)
if (!skipStartNode)
{
- if (FrameworkElement.DType.IsInstanceOfType(_startNode) ||
- FrameworkContentElement.DType.IsInstanceOfType(_startNode))
+ if (_startNode is FrameworkElement
+ or FrameworkContentElement)
{
// Callback for the root of the subtree
continueWalk = _callback(_startNode, _data, _priority == TreeWalkPriority.VisualTree);
@@ -79,9 +79,8 @@ private void IterateChildren(DependencyObject d)
{
_recursionDepth++;
- if (FrameworkElement.DType.IsInstanceOfType(d))
+ if (d is FrameworkElement fe)
{
- FrameworkElement fe = (FrameworkElement) d;
bool hasLogicalChildren = fe.HasLogicalChildren;
// FrameworkElement have both a visual and a logical tree.
@@ -100,11 +99,10 @@ private void IterateChildren(DependencyObject d)
Debug.Assert( false, "Tree walk priority should be Visual first or Logical first - but this instance of DescendentsWalker has an invalid priority setting that's neither of the two." );
}
}
- else if (FrameworkContentElement.DType.IsInstanceOfType(d))
+ else if (d is FrameworkContentElement fce)
{
// FrameworkContentElement only has a logical tree, so we
// Walk logical children
- FrameworkContentElement fce = d as FrameworkContentElement;
if (fce.HasLogicalChildren)
{
WalkLogicalChildren( null, fce, fce.LogicalChildren );
@@ -114,18 +112,13 @@ private void IterateChildren(DependencyObject d)
{
// Neither a FrameworkElement nor FrameworkContentElement. See
// if it's a Visual and if so walk the Visual collection
- Visual v = d as Visual;
- if (v != null)
+ if (d is Visual v)
{
WalkVisualChildren(v);
}
- else
+ else if (d is Visual3D v3D)
{
- Visual3D v3D = d as Visual3D;
- if (v3D != null)
- {
- WalkVisualChildren(v3D);
- }
+ WalkVisualChildren(v3D);
}
}
@@ -324,12 +317,12 @@ private void WalkFrameworkElementLogicalThenVisualChildren(
for(int i = 0; i < count; i++)
{
Visual child = feParent.InternalGetVisualChild(i);
- if (child != null && FrameworkElement.DType.IsInstanceOfType(child))
+ if (child != null && child is FrameworkElement fe)
{
// For the case that both parents are identical, this node should
// have already been visited when walking through logical
// children, hence we short-circuit here
- if (VisualTreeHelper.GetParent(child) != ((FrameworkElement) child).Parent)
+ if (VisualTreeHelper.GetParent(child) != fe.Parent)
{
bool visitedViaVisualTree = true;
VisitNode(child, visitedViaVisualTree);
@@ -404,11 +397,11 @@ private void VisitNode(DependencyObject d, bool visitedViaVisualTree)
{
if (_recursionDepth <= ContextLayoutManager.s_LayoutRecursionLimit)
{
- if (FrameworkElement.DType.IsInstanceOfType(d))
+ if (d is FrameworkElement fe)
{
- VisitNode(d as FrameworkElement, visitedViaVisualTree);
+ VisitNode(fe, visitedViaVisualTree);
}
- else if (FrameworkContentElement.DType.IsInstanceOfType(d))
+ else if (d is FrameworkContentElement)
{
_VisitNode(d, visitedViaVisualTree);
}
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/DescendentsWalkerBase.cs b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/DescendentsWalkerBase.cs
index 86e62723d..50fe3198d 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/DescendentsWalkerBase.cs
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/DescendentsWalkerBase.cs
@@ -38,9 +38,8 @@ internal bool WasVisited(DependencyObject d)
{
DependencyObject logicalParent;
- if (FrameworkElement.DType.IsInstanceOfType(ancestor))
+ if (ancestor is FrameworkElement fe)
{
- FrameworkElement fe = ancestor as FrameworkElement;
logicalParent = fe.Parent;
// FrameworkElement
DependencyObject dependencyObjectParent = VisualTreeHelper.GetParent(fe);
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Documents/FixedDSBuilder.cs b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Documents/FixedDSBuilder.cs
index fb6b94acf..543604984 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Documents/FixedDSBuilder.cs
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Documents/FixedDSBuilder.cs
@@ -17,7 +17,7 @@ namespace System.Windows.Documents
using System.Windows.Markup;
using System.Windows.Shapes;
using System.Windows.Documents.DocumentStructures;
- using ds=System.Windows.Documents.DocumentStructures;
+ using Ds=System.Windows.Documents.DocumentStructures;
using System;
using System.Collections;
using System.Collections.Generic;
@@ -219,7 +219,7 @@ private void AddChildofFixedNodeinFlow(int[] childIndex, NamedElement ne)
private void SpecialProcessing(SemanticBasicElement sbe)
{
- ds.ListItemStructure listItem = sbe as ds.ListItemStructure;
+ Ds.ListItemStructure listItem = sbe as Ds.ListItemStructure;
if (listItem != null && listItem.Marker != null)
{
NameHashFixedNode fen;
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Documents/TextStore.cs b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Documents/TextStore.cs
index eca91af61..ac7c8d4ab 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Documents/TextStore.cs
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Documents/TextStore.cs
@@ -586,7 +586,7 @@ public void GetEmbedded(int index, ref Guid guidService, ref Guid riid, out obje
}
// See msdn's ITextStoreACP documentation for a full description.
- public void QueryInsertEmbedded(ref Guid guidService, int formatEtc, out bool insertable)
+ public void QueryInsertEmbedded(ref Guid guidService, IntPtr formatEtc, out bool insertable)
{
#if true
//
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/FrameworkElement.cs b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/FrameworkElement.cs
index 95274b6d6..325623a60 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/FrameworkElement.cs
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/FrameworkElement.cs
@@ -2233,8 +2233,10 @@ protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
{
//let incrementally-updating FrameworkElements to mark the vicinity of the affected child
//to perform partial update.
- if(FrameworkElement.DType.IsInstanceOfType(layoutParent))
- ((FrameworkElement)layoutParent).ParentLayoutInvalidated(this);
+ if(layoutParent is FrameworkElement fe)
+ {
+ fe.ParentLayoutInvalidated(this);
+ }
if (affectsParentMeasure)
{
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Generated/FrameworkContentElement.cs b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Generated/FrameworkContentElement.cs
index c49f4b1f1..801648178 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Generated/FrameworkContentElement.cs
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Generated/FrameworkContentElement.cs
@@ -1218,19 +1218,6 @@ internal event InheritedPropertyChangedEventHandler InheritedPropertyChanged
#endregion Internal Properties
- //------------------------------------------------------
- //
- // Internal Fields
- //
- //------------------------------------------------------
-
- #region Internal Fields
-
- // Optimization, to avoid calling FromSystemType too often
- internal new static DependencyObjectType DType = DependencyObjectType.FromSystemTypeInternal(typeof(FrameworkContentElement));
-
- #endregion Internal Fields
-
//------------------------------------------------------
//
// Private Fields
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Generated/FrameworkElement.cs b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Generated/FrameworkElement.cs
index 1066e2efa..c5ab045f7 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Generated/FrameworkElement.cs
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Generated/FrameworkElement.cs
@@ -1267,19 +1267,6 @@ internal event InheritedPropertyChangedEventHandler InheritedPropertyChanged
#endregion Internal Properties
- //------------------------------------------------------
- //
- // Internal Fields
- //
- //------------------------------------------------------
-
- #region Internal Fields
-
- // Optimization, to avoid calling FromSystemType too often
- internal new static DependencyObjectType DType = DependencyObjectType.FromSystemTypeInternal(typeof(FrameworkElement));
-
- #endregion Internal Fields
-
//------------------------------------------------------
//
// Private Fields
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Media/Animation/Storyboard.cs b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Media/Animation/Storyboard.cs
index 073e59f15..34d61b148 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Media/Animation/Storyboard.cs
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Media/Animation/Storyboard.cs
@@ -929,13 +929,13 @@ private bool PropertyCloningRequired( object targetPropertyValue )
///
private void VerifyComplexPathSupport( DependencyObject targetObject )
{
- if( FrameworkElement.DType.IsInstanceOfType(targetObject) )
+ if(targetObject is FrameworkElement)
{
// FrameworkElement and derived types are supported.
return;
}
- if( FrameworkContentElement.DType.IsInstanceOfType(targetObject) )
+ if(targetObject is FrameworkContentElement)
{
// FrameworkContentElement and derived types are supported.
return;
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/StyleHelper.cs b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/StyleHelper.cs
index 9d76b939e..508435ee9 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/StyleHelper.cs
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/StyleHelper.cs
@@ -2327,15 +2327,15 @@ internal static void SpecialDowncastToFEorFCE(DependencyObject d,
out FrameworkElement fe, out FrameworkContentElement fce,
bool throwIfNeither)
{
- if (FrameworkElement.DType.IsInstanceOfType(d))
+ if (d is FrameworkElement frameworkElement)
{
- fe = (FrameworkElement)d;
+ fe = frameworkElement;
fce = null;
}
- else if (FrameworkContentElement.DType.IsInstanceOfType(d))
+ else if (d is FrameworkContentElement frameworkContentElement)
{
fe = null;
- fce = (FrameworkContentElement)d;
+ fce = frameworkContentElement;
}
else if (throwIfNeither && !(d is System.Windows.Media.Media3D.Visual3D) )
{
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/TreeWalkHelper.cs b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/TreeWalkHelper.cs
index a109668b0..1489ff80f 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/TreeWalkHelper.cs
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/TreeWalkHelper.cs
@@ -1000,7 +1000,7 @@ private static bool OnInheritablePropertyChanged(
// only then do we need to Invalidate the property
if (BaseValueSourceInternal.Inherited >= oldEntry.BaseValueSourceInternal)
{
- if (visitedViaVisualTree && FrameworkElement.DType.IsInstanceOfType(d))
+ if (visitedViaVisualTree && d is FrameworkElement)
{
DependencyObject logicalParent = LogicalTreeHelper.GetParent(d);
if (logicalParent != null)
diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationUI/PresentationUI.csproj b/src/Microsoft.DotNet.Wpf/src/PresentationUI/PresentationUI.csproj
index 421b05141..2cb661f50 100644
--- a/src/Microsoft.DotNet.Wpf/src/PresentationUI/PresentationUI.csproj
+++ b/src/Microsoft.DotNet.Wpf/src/PresentationUI/PresentationUI.csproj
@@ -216,7 +216,6 @@
-
diff --git a/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachDocumentSequenceSerializer.cs b/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachDocumentSequenceSerializer.cs
index 83c6e6873..e1496822e 100644
--- a/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachDocumentSequenceSerializer.cs
+++ b/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachDocumentSequenceSerializer.cs
@@ -194,7 +194,7 @@ SerializablePropertyContext serializablePropertyContext
propertyValue);
- if (typeof(Type).IsInstanceOfType(propertyValue))
+ if (propertyValue is Type)
{
int index = valueAsString.LastIndexOf('.');
valueAsString = string.Concat(
diff --git a/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachDocumentSequenceSerializerAsync.cs b/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachDocumentSequenceSerializerAsync.cs
index 1f1225bbd..e0c04abbf 100644
--- a/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachDocumentSequenceSerializerAsync.cs
+++ b/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachDocumentSequenceSerializerAsync.cs
@@ -232,7 +232,7 @@ SerializablePropertyContext serializablePropertyContext
propertyValue);
- if (typeof(Type).IsInstanceOfType(propertyValue))
+ if (propertyValue is Type)
{
int index = valueAsString.LastIndexOf('.');
valueAsString = string.Concat(
diff --git a/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachFixedDocumentSerializer.cs b/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachFixedDocumentSerializer.cs
index a85bd29b3..ed8cfff47 100644
--- a/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachFixedDocumentSerializer.cs
+++ b/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachFixedDocumentSerializer.cs
@@ -277,7 +277,7 @@ SerializablePropertyContext serializablePropertyContext
propertyValue);
- if (typeof(Type).IsInstanceOfType(propertyValue))
+ if (propertyValue is Type)
{
int index = valueAsString.LastIndexOf('.');
valueAsString = string.Concat(
diff --git a/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachFixedDocumentSerializerAsync.cs b/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachFixedDocumentSerializerAsync.cs
index 477f4cc61..249da14c5 100644
--- a/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachFixedDocumentSerializerAsync.cs
+++ b/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachFixedDocumentSerializerAsync.cs
@@ -317,7 +317,7 @@ SerializablePropertyContext serializablePropertyContext
propertyValue);
- if (typeof(Type).IsInstanceOfType(propertyValue))
+ if (propertyValue is Type)
{
int index = valueAsString.LastIndexOf('.');
valueAsString = string.Concat(
diff --git a/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachFixedPageSerializer.cs b/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachFixedPageSerializer.cs
index 76d6e3c14..ff1899ab9 100644
--- a/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachFixedPageSerializer.cs
+++ b/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachFixedPageSerializer.cs
@@ -350,7 +350,7 @@ SerializablePropertyContext serializablePropertyContext
propertyValue);
- if (typeof(Type).IsInstanceOfType(propertyValue))
+ if (propertyValue is Type)
{
int index = valueAsString.LastIndexOf('.');
valueAsString = string.Concat(
diff --git a/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachFixedPageSerializerAsync.cs b/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachFixedPageSerializerAsync.cs
index 186f5d0be..8cd45d0fa 100644
--- a/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachFixedPageSerializerAsync.cs
+++ b/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/ReachFixedPageSerializerAsync.cs
@@ -322,7 +322,7 @@ SerializablePropertyContext serializablePropertyContext
propertyValue);
- if (typeof(Type).IsInstanceOfType(propertyValue))
+ if (propertyValue is Type)
{
int index = valueAsString.LastIndexOf('.');
valueAsString = string.Concat(
diff --git a/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/XpsOMFixedPageSerializer.cs b/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/XpsOMFixedPageSerializer.cs
index bf5204f9b..fd1b65885 100644
--- a/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/XpsOMFixedPageSerializer.cs
+++ b/src/Microsoft.DotNet.Wpf/src/ReachFramework/Serialization/manager/XpsOMFixedPageSerializer.cs
@@ -308,7 +308,7 @@ SerializablePropertyContext serializablePropertyContext
propertyValue);
- if (typeof(Type).IsInstanceOfType(propertyValue))
+ if (propertyValue is Type)
{
int index = valueAsString.LastIndexOf('.');
valueAsString = string.Concat(
diff --git a/src/Microsoft.DotNet.Wpf/src/Shared/MS/Win32/UnsafeNativeMethodsTextServices.cs b/src/Microsoft.DotNet.Wpf/src/Shared/MS/Win32/UnsafeNativeMethodsTextServices.cs
index 4de87412c..389a273ea 100644
--- a/src/Microsoft.DotNet.Wpf/src/Shared/MS/Win32/UnsafeNativeMethodsTextServices.cs
+++ b/src/Microsoft.DotNet.Wpf/src/Shared/MS/Win32/UnsafeNativeMethodsTextServices.cs
@@ -1630,7 +1630,7 @@ void SetText(SetTextFlags flags, int start, int end,
//HRESULT QueryInsertEmbedded([in] const GUID *pguidService,
// [in] const FORMATETC *pFormatEtc,
// [out] BOOL *pfInsertable);
- void QueryInsertEmbedded(ref Guid guidService, int /*ref Win32.FORMATETC*/ formatEtc, [MarshalAs(UnmanagedType.Bool)] out bool insertable);
+ void QueryInsertEmbedded(ref Guid guidService, IntPtr /*ref Win32.FORMATETC*/ formatEtc, [MarshalAs(UnmanagedType.Bool)] out bool insertable);
///
//HRESULT InsertEmbedded([in] DWORD dwFlags,
@@ -1972,14 +1972,14 @@ void SetText(int ec, /*SetTextFlags*/ int flags,
// [out] LONG *pcch,
// [in, unique] const TF_HALTCOND *pHalt);
///
- void ShiftStart(int ec, int count, out int result, int ZeroForNow); // "ZeroForNow" should be a struct ptr if we ever use this
+ void ShiftStart(int ec, int count, out int result, IntPtr pHalt);
//HRESULT ShiftEnd([in] TfEditCookie ec,
// [in] LONG cchReq,
// [out] LONG *pcch,
// [in, unique] const TF_HALTCOND *pHalt);
///
- void ShiftEnd(int ec, int count, out int result, int ZeroForNow); // "ZeroForNow" should be a struct ptr if we ever use this
+ void ShiftEnd(int ec, int count, out int result, IntPtr pHalt);
//HRESULT ShiftStartToRange([in] TfEditCookie ec,
// [in] ITfRange *pRange,
@@ -2117,14 +2117,14 @@ void SetText(int ec, /*SetTextFlags*/ int flags,
// [out] LONG *pcch,
// [in, unique] const TF_HALTCOND *pHalt);
///
- void ShiftStart(int ec, int count, out int result, int ZeroForNow); // "ZeroForNow" should be a struct ptr if we ever use this
+ void ShiftStart(int ec, int count, out int result, IntPtr pHalt);
//HRESULT ShiftEnd([in] TfEditCookie ec,
// [in] LONG cchReq,
// [out] LONG *pcch,
// [in, unique] const TF_HALTCOND *pHalt);
///
- void ShiftEnd(int ec, int count, out int result, int ZeroForNow); // "ZeroForNow" should be a struct ptr if we ever use this
+ void ShiftEnd(int ec, int count, out int result, IntPtr pHalt);
//HRESULT ShiftStartToRange([in] TfEditCookie ec,
// [in] ITfRange *pRange,
diff --git a/src/Microsoft.DotNet.Wpf/src/System.Printing/System.Printing.vcxproj b/src/Microsoft.DotNet.Wpf/src/System.Printing/System.Printing.vcxproj
index 08aefddac..5183124e0 100644
--- a/src/Microsoft.DotNet.Wpf/src/System.Printing/System.Printing.vcxproj
+++ b/src/Microsoft.DotNet.Wpf/src/System.Printing/System.Printing.vcxproj
@@ -31,6 +31,11 @@
.NETCoreApp
v6.0
Unknown
+
+ true
diff --git a/src/Microsoft.DotNet.Wpf/src/WindowsBase/MS/Internal/IO/Packaging/Compoundfile/CompoundFileDeflateTransform.cs b/src/Microsoft.DotNet.Wpf/src/WindowsBase/MS/Internal/IO/Packaging/Compoundfile/CompoundFileDeflateTransform.cs
index 397a0cdd9..fddf84493 100644
--- a/src/Microsoft.DotNet.Wpf/src/WindowsBase/MS/Internal/IO/Packaging/Compoundfile/CompoundFileDeflateTransform.cs
+++ b/src/Microsoft.DotNet.Wpf/src/WindowsBase/MS/Internal/IO/Packaging/Compoundfile/CompoundFileDeflateTransform.cs
@@ -23,7 +23,7 @@
using MS.Internal.IO.Packaging; // for PackagingUtilities
using System.Security; // for SecurityCritical and SecurityTreatAsSafe
using MS.Internal.WindowsBase;
-using static Interop.zlib; // workaround namespace collision with MS.Internal.interop
+using static Interop.Zlib; // workaround namespace collision with MS.Internal.interop
namespace MS.Internal.IO.Packaging.CompoundFile
{
diff --git a/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/Threading/DispatcherOperation.cs b/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/Threading/DispatcherOperation.cs
index 766a619dc..9ef8dfa13 100644
--- a/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/Threading/DispatcherOperation.cs
+++ b/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/Threading/DispatcherOperation.cs
@@ -425,7 +425,7 @@ internal void Invoke()
EventHandler handler; // either completed or aborted
lock(DispatcherLock)
{
- if(_exception != null && _exception is OperationCanceledException)
+ if(_exception is OperationCanceledException)
{
// A new way to abort/cancel an operation is to raise an
// OperationCanceledException exception. This only works