문제

나는 몇 가지 WPF 프로그래밍 중 하나는 일은 내가 결코 가지고 명령이었다 패턴이다.모든 예 될 것으로 보인에 내장 된 것,편집하고,절단,붙여 넣습니다.누군가는 예를 들어 또는 제안이의 최고의 실천에 대한 사용자 정의 명령을?

도움이 되었습니까?

해결책

아 ha!질문에 답변 드리겠습니다!첫째,내가 언급해야한다는 개인적으로 쉽게 정의하고 명령보다는 코드에서 XAML.할 수 있을 걸기 위해 명령은 좀 더 유연하게보다는 모든 XAML 접근 않습니다.

야 할 무엇을 명령할 수 있고 그들이 무엇에 관한 것이다.내 응용 프로그램에서,나는 현재 클래스 정의에 대한 중요한 응용 프로그램과 같은 명령을 너무:

public static class CommandBank
{
  /// Command definition for Closing a window
  public static RoutedUICommand CloseWindow { get; private set; }

  /// Static private constructor, sets up all application wide commands.
  static CommandBank()
  {
    CloseWindow = new RoutedUICommand();
    CloseWindow.InputGestures.Add(new KeyGesture(Key.F4, ModifierKeys.Alt));
    // ...
  }

기 때문에,지금 내가 원하는 코드가 모두 함께 사용,코드만이 접근을 명령할 수 있게 다음과 같은 방법에서 위의 클래스:

/// Closes the window provided as a parameter
public static void CloseWindowExecute(object sender, ExecutedRoutedEventArgs e)
{
  ((Window)e.Parameter).Close();
}

/// Allows a Command to execute if the CommandParameter is not a null value
public static void CanExecuteIfParameterIsNotNull(object sender, CanExecuteRoutedEventArgs e)
{
  e.CanExecute = e.Parameter != null;
  e.Handled = true;
}

두 번째 방법이 될 수 있습와 공유되지 않고 명령을 반복합니다.

을 정의하면 이와 같은 명령을 추가할 수 있습니다 그들의 어떤 조각 UI.에서는 다음을 로드,추가 명령어 바인딩을 모두 창고 MenuItem 추가 입력한 바인딩을 창을 사용하여 반복하여 이에 대한 모든 명령을 수 있습니다.전달된 매개 변수는 창의 자 그래서 위의 코드는 무엇을 알고 창을 시도하고 가깝습니다.

public partial class SimpleWindow : Window
{
  private void WindowLoaded(object sender, RoutedEventArgs e)
  {
    // ...
    this.CommandBindings.Add(
      new CommandBinding(
        CommandBank.CloseWindow,
        CommandBank.CloseWindowExecute,
        CommandBank.CanExecuteIfParameterIsNotNull));

    foreach (CommandBinding binding in this.CommandBindings)
    {
       RoutedCommand command = (RoutedCommand)binding.Command;
       if (command.InputGestures.Count > 0)
       {
         foreach (InputGesture gesture in command.InputGestures)
         {
           var iBind = new InputBinding(command, gesture);
           iBind.CommandParameter = this;
           this.InputBindings.Add(iBind);
         }
       }
    }

    // menuItemExit is defined in XAML
    menuItemExit.Command = CommandBank.CloseWindow;
    menuItemExit.CommandParameter = this;
    // ...
  }

  // ....
}

나는 또한 다음 나중에는 이벤트에 대한 처리기 WindowClosing 및 WindowClosed 이벤트,나는 추천할 만들의 실제 구현한 명령으로 작은 일반적인으로 가능합니다.으로,이 경우에는 시도 하지 않았을 넣어하는 코드를 중지하려고 창을 닫 있는 경우에 저장하지 않은 데이터,나는 유지되는 코드 단단히 내 WindowClosing 이벤트입니다.

알려가 있는 경우 모든 후속 질문이 있습니다.:)

다른 팁

에서 월 2008edition MSDN 잡지,브라이언 노이스에는 훌륭한 문서에 대해 RoutedCommand/RoutedEvents!!!

여기에 링크입니다:http://msdn.microsoft.com/en-us/magazine/cc785480.aspx

일에 대한 XAML 는 미세한'단순한'프로그램이지만,슬프게도,그것은 작동하지 않을 때 당신이 일을 하고 싶으면 다음과 같 공유 기능.말이 있는 여러 클래스고 UI 의 모든다는 명령을 절대 사용할 쓰'CanAlwaysExecute'방식에 대한 각 창 또는 정렬!는 매우 .

을 읽고 여러 블로그를 통해하려고 몇 가지,나는 선택을 XAML 순수에 대한 외모,스타일로,애니메이션과 트리거합니다.내 모든 구부리의 이벤트 처리기에 좋은 지금에 코드니다.:)

다른 잡았다는 방법에 의해 입력하는 바인딩하기 위해,그들을 위해,적발에 중점을 두어야 하는 개체를 포함하는 입력 있습니다.예를 들어,짧은 당신 언제든지 사용할 수 있습(말,F1 을 열 도),는 입력한 바인딩에서 설정해야 합창체,그 이후로 항상 초점을 때 응용 프로그램이 활성화됩니다.코드를 사용하는 방법을 확인해야는 쉽게도를 사용하여 시작할 때 UserControls 는 추가 할 수 있습니다 바인딩을 입력하여 그들의 부모는 창입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top