public
class
UIHelper
{
/// <summary>
/// 在Visual里找到想要的元素
/// childName可为空,不为空就按名字找
/// </summary>
public
static
T FindChild<T>(DependencyObject parent,
string
childName)
where
T : DependencyObject
{
if
(parent ==
null
)
return
null
;
T foundChild =
null
;
int
childrenCount = VisualTreeHelper.GetChildrenCount(parent);
for
(
int
i = 0; i < childrenCount; i++)
{
var
child = VisualTreeHelper.GetChild(parent, i);
T childType = child
as
T;
if
(childType ==
null
)
{
// 住下查要找的元素
foundChild = FindChild<T>(child, childName);
// 如果找不到就反回
if
(foundChild !=
null
)
break
;
}
else
if
(!
string
.IsNullOrEmpty(childName))
{
var
frameworkElement = child
as
FrameworkElement;
// 看名字是不是一样
if
(frameworkElement !=
null
&& frameworkElement.Name == childName)
{
//如果名字一样返回
foundChild = (T)child;
break
;
}
}
else
{
// 找到相应的元素了就返回
foundChild = (T)child;
break
;
}
}
return
foundChild;
}
/// <summary>
/// 得到指定元素的集合
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="depObj"></param>
/// <returns></returns>
public
static
IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj)
where
T : DependencyObject
{
if
(depObj !=
null
)
{
for
(
int
i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if
(child !=
null
&& child
is
T)
{
yield
return
(T)child;
}
foreach
(T childOfChild
in
FindVisualChildren<T>(child))
{
yield
return
childOfChild;
}
}
}
}
}
public
class
FocusAdvancement
{
public
static
bool
GetAdvancesByEnterKey(DependencyObject obj)
{
return
(
bool
)obj.GetValue(AdvancesByEnterKeyProperty);
}
public
static
void
SetAdvancesByEnterKey(DependencyObject obj,
bool
value)
{
obj.SetValue(AdvancesByEnterKeyProperty, value);
}
public
static
readonly
DependencyProperty AdvancesByEnterKeyProperty =
DependencyProperty.RegisterAttached(
"AdvancesByEnterKey"
,
typeof
(
bool
),
typeof
(FocusAdvancement),
new
UIPropertyMetadata(OnAdvancesByEnterKeyPropertyChanged));
static
void
OnAdvancesByEnterKeyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var
element = d
as
UIElement;
if
(element ==
null
)
return
;
if
((
bool
)e.NewValue) element.KeyDown += Keydown;
else
element.KeyDown -= Keydown;
}
static
void
Keydown(
object
sender, KeyEventArgs e)
{
if
(!e.Key.Equals(Key.Enter))
return
;
var
element = sender
as
UIElement;
if
(element !=
null
) element.MoveFocus(
new
TraversalRequest(FocusNavigationDirection.Next));
}
}
|
xmlns:FOU=
"clr-namespace:WPFAppVM.AppViews.AppCustomViews"
<TextBox FOU:FocusAdvancement.AdvancesByEnterKey=
"True"
Width=
"120"
></TextBox>
<TextBox IsReadOnly=
"True"
FOU:FocusAdvancement.AdvancesByEnterKey=
"True"
Width=
"120"
></TextBox>
<Button Height=
"30"
Width=
"80"
FOU:FocusAdvancement.AdvancesByEnterKey=
"True"
>保存</Button>
|