5774


Livet WPF4.5 を使っています。

`ConfirmationDialogInteractionMessageAction` で `OKCancel`
ダイアログを出すとデフォルトのフォーカスが OK になるのですがこれを Cancel にすることはできるのでしょうか？

[code]

    <l:ConfirmationDialogInteractionMessageAction>
      <l:DirectInteractionMessage CallbackCommand="{Binding ClearCommand}">
        <l:ConfirmationMessage Button="OKCancel"
                               Caption="確認"
                               Text="本当に全消去しますか？"
                               Image="Information" />
      </l:DirectInteractionMessage>
    </l:ConfirmationDialogInteractionMessageAction>
    
[/code]


CC BY-SA 3.0
2015-02-02T07:35:03.987
5763
2015-02-02T09:18:43.130
2015-02-02T08:04:40.110
4978
8028
question
wpf xaml
Livet で確認ダイアログのデフォルトフォーカスを Cancel にしたい。


標準の機能では出来ないはずです。

`ConfirmationMessage`を継承してデフォルトフォーカス用のプロパティを増やし、  
`ConfirmationDialogInteractionMessageAction`を参考に新しい`InteractionMessageAction<FrameworkElement>`を継承した`TriggerAction`を作ることで実現できます。

実装例としては以下のような形になるかと。

[code]

    public class FocusableConfirmationMessage : ConfirmationMessage
    {
        public MessageBoxResult DefaultFocus
        {
            get { return (MessageBoxResult)GetValue(DefaultFocusProperty); }
            set { SetValue(DefaultFocusProperty, value); }
        }
    
        // Using a DependencyProperty as the backing store for DefaultFocus.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty DefaultFocusProperty =
            DependencyProperty.Register("DefaultFocus", typeof(MessageBoxResult), typeof(FocusableConfirmationMessage), new PropertyMetadata(MessageBoxResult.None));
    
        public FocusableConfirmationMessage() : base()
        {
    
        }
    
        public FocusableConfirmationMessage(string text, string caption, MessageBoxImage image, MessageBoxButton button, MessageBoxResult defaultFocus, string messageKey)
            : base(text,caption,image,button,messageKey)
        {
            this.DefaultFocus = defaultFocus;
        }
    }
    
    public class FocusableConfirmationDialogInteractionMessageAction : InteractionMessageAction<FrameworkElement>
    {
        protected override void InvokeAction(InteractionMessage message)
        {
            var confirmMessage = message as FocusableConfirmationMessage;
            if (confirmMessage != null)
            {
                var result = MessageBox.Show(
                    confirmMessage.Text,
                    confirmMessage.Caption,
                    confirmMessage.Button,
                    confirmMessage.Image,
                    confirmMessage.DefaultFocus
                    );
    
                if (result == MessageBoxResult.Yes || result == MessageBoxResult.OK)
                {
                    confirmMessage.Response = true;
                }
                else if (result == MessageBoxResult.Cancel)
                {
                    confirmMessage.Response = null;
                }
                else
                {
                    confirmMessage.Response = false;
                }
            }
        }
    }
    
[/code]


CC BY-SA 3.0
2015-02-02T08:42:39.793
5774
2015-02-02T09:18:43.130
2015-02-02T09:18:43.130
6119
6119
5763
answer