Si vous êtes à l'aide de Caliburn.Micro, ici, c'est un service que j'ai créé pour définir le Focus à tout Contrôle dans la vue hérité de l'Écran.
Remarque: Cela ne fonctionne que si vous utilisez Caliburn.Micro pour votre MVVM cadre.
public static class FocusManager
{
public static bool SetFocus(this IViewAware screen ,Expression<Func<object>> propertyExpression)
{
return SetFocus(screen ,propertyExpression.GetMemberInfo().Name);
}
public static bool SetFocus(this IViewAware screen ,string property)
{
Contract.Requires(property != null ,"Property cannot be null.");
var view = screen.GetView() as UserControl;
if ( view != null )
{
var control = FindChild(view ,property);
bool focus = control != null && control.Focus();
return focus;
}
return false;
}
private static FrameworkElement FindChild(UIElement parent ,string childName)
{
// Confirm parent and childName are valid.
if ( parent == null || string.IsNullOrWhiteSpace(childName) ) return null;
FrameworkElement foundChild = null;
int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
for ( int i = 0; i < childrenCount; i++ )
{
FrameworkElement child = VisualTreeHelper.GetChild(parent ,i) as FrameworkElement;
if ( child != null )
{
BindingExpression bindingExpression = GetBindingExpression(child);
if ( child.Name == childName )
{
foundChild = child;
break;
}
if ( bindingExpression != null )
{
if ( bindingExpression.ResolvedSourcePropertyName == childName )
{
foundChild = child;
break;
}
}
foundChild = FindChild(child ,childName);
if ( foundChild != null )
{
if ( foundChild.Name == childName )
break;
BindingExpression foundChildBindingExpression = GetBindingExpression(foundChild);
if ( foundChildBindingExpression != null &&
foundChildBindingExpression.ResolvedSourcePropertyName == childName )
break;
}
}
}
return foundChild;
}
private static BindingExpression GetBindingExpression(FrameworkElement control)
{
if ( control == null ) return null;
BindingExpression bindingExpression = null;
var convention = ConventionManager.GetElementConvention(control.GetType());
if ( convention != null )
{
var bindablePro = convention.GetBindableProperty(control);
if ( bindablePro != null )
{
bindingExpression = control.GetBindingExpression(bindablePro);
}
}
return bindingExpression;
}
}
Comment l'utiliser?
À partir de votre ViewModel hérité de Caliburn.Micro.De l'écran ou de Caliburn.Micro.ViewAware
this.SetFocus(()=>ViewModelProperty);
ou
this.SetFocus("Property");
Comment cela fonctionne?
Cette méthode va essayer de rechercher un élément dans l'Arborescence Visuelle de Vue et l'accent sera mis tout contrôle de la concordance. Si un tel contrôle, il fera usage de la BindingConventions utilisé par Caliburn.Micro.
Ex.:
Il va chercher la Propery dans le BindingExpression du contrôle.
Pour la zone de texte, il va chercher à savoir si cette propriété est lié à la propriété de Texte puis l'accent sera mis.