Skip to content

Commit f65ca87

Browse files
committed
Added FindDescendantOrSelf overloads with search type
1 parent d0c4992 commit f65ca87

File tree

1 file changed

+93
-0
lines changed

1 file changed

+93
-0
lines changed

Microsoft.Toolkit.Uwp.UI/Extensions/DependencyObjectExtensions.cs

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,24 @@ public static class DependencyObjectExtensions
283283
return FindDescendant(element, name, comparisonType);
284284
}
285285

286+
/// <summary>
287+
/// Find the first descendant (or self) of type <see cref="FrameworkElement"/> with a given name.
288+
/// </summary>
289+
/// <param name="element">The root element.</param>
290+
/// <param name="name">The name of the element to look for.</param>
291+
/// <param name="comparisonType">The comparison type to use to match <paramref name="name"/>.</param>
292+
/// <param name="searchType">The search type to use to explore the visual tree.</param>
293+
/// <returns>The descendant (or self) that was found, or <see langword="null"/>.</returns>
294+
public static FrameworkElement? FindDescendantOrSelf(this DependencyObject element, string name, StringComparison comparisonType, SearchType searchType)
295+
{
296+
if (element is FrameworkElement result && name.Equals(result.Name, comparisonType))
297+
{
298+
return result;
299+
}
300+
301+
return FindDescendant(element, name, comparisonType, searchType);
302+
}
303+
286304
/// <summary>
287305
/// Find the first descendant (or self) element of a given type, using a depth-first search.
288306
/// </summary>
@@ -300,6 +318,24 @@ public static class DependencyObjectExtensions
300318
return FindDescendant<T>(element);
301319
}
302320

321+
/// <summary>
322+
/// Find the first descendant (or self) element of a given type.
323+
/// </summary>
324+
/// <typeparam name="T">The type of elements to match.</typeparam>
325+
/// <param name="element">The root element.</param>
326+
/// <param name="searchType">The search type to use to explore the visual tree.</param>
327+
/// <returns>The descendant (or self) that was found, or <see langword="null"/>.</returns>
328+
public static T? FindDescendantOrSelf<T>(this DependencyObject element, SearchType searchType)
329+
where T : notnull, DependencyObject
330+
{
331+
if (element is T result)
332+
{
333+
return result;
334+
}
335+
336+
return FindDescendant<T>(element, searchType);
337+
}
338+
303339
/// <summary>
304340
/// Find the first descendant (or self) element of a given type, using a depth-first search.
305341
/// </summary>
@@ -316,6 +352,23 @@ public static class DependencyObjectExtensions
316352
return FindDescendant(element, type);
317353
}
318354

355+
/// <summary>
356+
/// Find the first descendant (or self) element of a given type.
357+
/// </summary>
358+
/// <param name="element">The root element.</param>
359+
/// <param name="type">The type of element to match.</param>
360+
/// <param name="searchType">The search type to use to explore the visual tree.</param>
361+
/// <returns>The descendant (or self) that was found, or <see langword="null"/>.</returns>
362+
public static DependencyObject? FindDescendantOrSelf(this DependencyObject element, Type type, SearchType searchType)
363+
{
364+
if (element.GetType() == type)
365+
{
366+
return element;
367+
}
368+
369+
return FindDescendant(element, type, searchType);
370+
}
371+
319372
/// <summary>
320373
/// Find the first descendant (or self) element matching a given predicate, using a depth-first search.
321374
/// </summary>
@@ -334,6 +387,25 @@ public static class DependencyObjectExtensions
334387
return FindDescendant(element, predicate);
335388
}
336389

390+
/// <summary>
391+
/// Find the first descendant (or self) element matching a given predicate.
392+
/// </summary>
393+
/// <typeparam name="T">The type of elements to match.</typeparam>
394+
/// <param name="element">The root element.</param>
395+
/// <param name="predicate">The predicatee to use to match the descendant nodes.</param>
396+
/// <param name="searchType">The search type to use to explore the visual tree.</param>
397+
/// <returns>The descendant (or self) that was found, or <see langword="null"/>.</returns>
398+
public static T? FindDescendantOrSelf<T>(this DependencyObject element, Func<T, bool> predicate, SearchType searchType)
399+
where T : notnull, DependencyObject
400+
{
401+
if (element is T result && predicate(result))
402+
{
403+
return result;
404+
}
405+
406+
return FindDescendant(element, predicate, searchType);
407+
}
408+
337409
/// <summary>
338410
/// Find the first descendant (or self) element matching a given predicate, using a depth-first search.
339411
/// </summary>
@@ -354,6 +426,27 @@ public static class DependencyObjectExtensions
354426
return FindDescendant(element, state, predicate);
355427
}
356428

429+
/// <summary>
430+
/// Find the first descendant (or self) element matching a given predicate.
431+
/// </summary>
432+
/// <typeparam name="T">The type of elements to match.</typeparam>
433+
/// <typeparam name="TState">The type of state to use when matching nodes.</typeparam>
434+
/// <param name="element">The root element.</param>
435+
/// <param name="state">The state to give as input to <paramref name="predicate"/>.</param>
436+
/// <param name="predicate">The predicatee to use to match the descendant nodes.</param>
437+
/// <param name="searchType">The search type to use to explore the visual tree.</param>
438+
/// <returns>The descendant (or self) that was found, or <see langword="null"/>.</returns>
439+
public static T? FindDescendantOrSelf<T, TState>(this DependencyObject element, TState state, Func<T, TState, bool> predicate, SearchType searchType)
440+
where T : notnull, DependencyObject
441+
{
442+
if (element is T result && predicate(result, state))
443+
{
444+
return result;
445+
}
446+
447+
return FindDescendant(element, state, predicate, searchType);
448+
}
449+
357450
/// <summary>
358451
/// Find all descendant elements of the specified element. This method can be chained with
359452
/// LINQ calls to add additional filters or projections on top of the returned results.

0 commit comments

Comments
 (0)