Где Кнопка. DialogResult в WPF?

Тесно связанный шаблон является шаблоном Делегата; в обоих случаях часть работы передается некоторому другому компоненту. Если я понимаю правильно, различие между этими шаблонами - это (и исправьте меня, если я неправ):

  • В Делегат шаблон, делегат инстанцирует включение (делегирование) класс; это допускает повторное использование кода составом, а не наследованием. Класс включения может знать о конкретном типе делегата, например, если это вызывает своего конструктора само (в противоположность использованию фабрики).

  • В шаблон Стратегии , компонент, который осуществляет стратегию, является зависимостью, предоставленной включению с помощью компонента через его конструктора или метод set (согласно религии). Компонент использования полностью не знает о том, какая стратегия используется; стратегия всегда вызывается через интерфейс.

Кто-либо знает какие-либо другие различия?

17
задан Shimmy 18 November 2009 в 21:55
поделиться

3 ответа

Встроенного Button.DialogResult нет, но вы можете создать свой собственный (если хотите), используя простое присоединенное свойство:

public class ButtonHelper
{
  // Boilerplate code to register attached property "bool? DialogResult"
  public static bool? GetDialogResult(DependencyObject obj) { return (bool?)obj.GetValue(DialogResultProperty); }
  public static void SetDialogResult(DependencyObject obj, bool? value) { obj.SetValue(DialogResultProperty, value); }
  public static readonly DependencyProperty DialogResultProperty = DependencyProperty.RegisterAttached("DialogResult", typeof(bool?), typeof(ButtonHelper), new UIPropertyMetadata
  {
    PropertyChangedCallback = (obj, e) =>
    {
      // Implementation of DialogResult functionality
      Button button = obj as Button;
      if(button==null)
          throw new InvalidOperationException(
            "Can only use ButtonHelper.DialogResult on a Button control");
      button.Click += (sender, e2) =>
      {
        Window.GetWindow(button).DialogResult = GetDialogResult(button);
      };
    }
  });
}

Это позволит вам написать:

<Button Content="Click Me" my:ButtonHelper.DialogResult="True" />

и получить поведение, эквивалентное WinForms (нажатие на кнопку вызывает закрытие диалогового окна и возврат указанного результата)

32
ответ дан 30 November 2019 в 10:46
поделиться

There is no Button.DialogResult in WPF. You just have to set the DialogResult of the Window to true or false :

private void buttonOK_Click(object sender, RoutedEventArgs e)
{
    this.DialogResult = true;
}
20
ответ дан 30 November 2019 в 10:46
поделиться

Just make sure that you've shown the form using ShowDialog rather than Show. If you do the latter you'll get the following exception raised:

InvalidOperationException was unhandled

DialogResult can be set only after Window is created and shown as dialog.

1
ответ дан 30 November 2019 в 10:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: