Silverlight 4默认按钮服务

Mar*_*per 5 defaultbutton attached-properties silverlight-4.0

几个月来,我在SL 3应用程序中成功使用了David Justices Default Button示例.此方法基于附加属性.

升级到SL4后,该方法不再有效,我得到一个XAML异常:

未知的解析器错误:扫描程序2148474880

有人在SL4中成功使用过这个(或任何其他)默认按钮附加行为吗?

有没有其他方法可以在SL4中使用可用的新类实现默认按钮行为?

谢谢,马克

Mar*_*per 8

我们的最终解决方案还必须解决在按钮单击发生之前未更新支持属性的问题(如在所有MVVM模式中).... 注意: peer.SetFocus();

编辑: 添加了XAML示例.

public static 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) => {
                var peer = new ButtonAutomationPeer(button);

                if (arg.Key == Key.Enter) {
                    peer.SetFocus();
                    uiElement.Dispatcher.BeginInvoke((Action)delegate {

                        var invokeProv =
                            peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider;
                        if (invokeProv != null)
                            invokeProv.Invoke();
                    });
                }
            };
        }

    }

    public static Button GetDefaultButton(UIElement obj) {
        return (Button)obj.GetValue(DefaultButtonProperty);
    }

    public static void SetDefaultButton(DependencyObject obj, Button button) {
        obj.SetValue(DefaultButtonProperty, button);
    }       
}
Run Code Online (Sandbox Code Playgroud)

如何在XAML中申请:

<StackPanel>
    <TextBox DinnerConfig:DefaultButtonService.DefaultButton="{Binding ElementName=MyButton}"
                Text="Press Enter" />
    <Button x:Name="MyButton"
            Content="Click me" />
</StackPanel>
Run Code Online (Sandbox Code Playgroud)


Tri*_*ion 2

我通过允许在附加属性中设置自定义键(默认为 Enter)来扩展 David 的方法:

    public static DependencyProperty ButtonKeyProperty = DependencyProperty.RegisterAttached(
         "ButtonKey",
         typeof(Key),
         typeof(Defaults),
         new PropertyMetadata(Key.Enter, ButtonChanged));

    public static void SetButtonKey(DependencyObject dependencyObj, Key key)
    {
        dependencyObj.SetValue(ButtonKeyProperty, key);
    }

    public static Key GetButtonKey(DependencyObject dependencyObj)
    {
        return (Key)dependencyObj.GetValue(ButtonKeyProperty);
    }
Run Code Online (Sandbox Code Playgroud)

我修改了原始属性,然后利用该属性:

    Key key = GetButtonKey(dependencyObj);
    if (button.IsEnabled && keyEvent.Key == key)
        ...
Run Code Online (Sandbox Code Playgroud)

所以现在,例如,如果我愿意,我可以使用 Escape 作为键(注意我更改了类和属性的名称):

    ... UI:Defaults.Button="{Binding ElementName=myButton}" UI:Defaults.ButtonKey="Escape" ...
Run Code Online (Sandbox Code Playgroud)