Realmente esperaba que no habría una salida de la solución de caja para un caso de uso tan común en Silverlight 4, pero por desgracia no creo que hay.
Hay otra implementación de botón predeterminado por Patrick Cauldwell. Él también está usando Propiedades Anexas.
He probado esto en una aplicación SL 4 y parece hacer el trabajo.
Puede encontrar el código aquí: http://www.cauldwell.net/patrick/blog/DefaultButtonSemanticsInSilverlightRevisited.aspx
Editar: he pellizcado código de David Justicia para que funcione para Silverlight 4. acabo de modificar la GetDefaultButton y SetDefaultButton tomar y vuelta un DefaultButtonService. El uso es el mismo que se menciona en su sitio web. Esto debería funcionar para usted:
Edit2: ejemplo Agregado XAML para mayor claridad.
public class DefaultButtonService
{
public static DependencyProperty DefaultButtonProperty =
DependencyProperty.RegisterAttached("DefaultButton",
typeof(Button),
typeof(DefaultButtonService),
new PropertyMetadata(null, DefaultButtonChanged));
private static void DefaultButtonChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var uiElement = d as UIElement;
var button = e.NewValue as Button;
if (uiElement != null && button != null)
{
uiElement.KeyUp += (sender, arg) =>
{
if (arg.Key == Key.Enter)
{
var peer = new ButtonAutomationPeer(button);
var invokeProv =
peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider;
if (invokeProv != null)
invokeProv.Invoke();
}
};
}
}
public static DefaultButtonService GetDefaultButton(UIElement obj)
{
return (DefaultButtonService)obj.GetValue(DefaultButtonProperty);
}
public static void SetDefaultButton(DependencyObject obj, DefaultButtonService button)
{
obj.SetValue(DefaultButtonProperty, button);
}
}
Cómo aplicar en XAML:
<StackPanel>
<TextBox DinnerConfig:DefaultButtonService.DefaultButton="{Binding ElementName=MyButton}"
Text="Press Enter" />
<Button x:Name="MyButton"
Content="Click me" />
</StackPanel>
Gracias. Los enfoques de David y Patricks son prácticamente iguales, aunque me complace ver que el problema no está en SL4, sino en un escenario particular relacionado con nuestra aplicación. Gracias por tomarse el tiempo para responder +1 –
¿No deberían los métodos "Get/SetDefaultButton" devolver/tomar un botón en lugar de un DefaultButtonService? El tipo en cuestión es el tipo del valor real que se recupera/almacena en la propiedad. Yo mismo hice ese cambio y está funcionando ahora. – Trinition
Sí, Trinition, tienes razón. Si desea agregar un ejemplo, votaré su respuesta como correcta. Puede copiar mi ejemplo agregado de abajo si lo desea. –