2015-01-05 1 views
0

명령 줄 프롬프트에있는 기능을 WPF TextBox에 추가하고 싶습니다. propmpt 명령에서 사용자가 위쪽 화살표를 누르면 사용 된 이전 명령이 나타납니다. 그리고 그가 계속 위쪽 화살표를 누르면 다음 이전 텍스트가 보일 것입니다. 사용자가 아래로 밀면 다시 다른 방향으로 이동합니다.WPF TextBox 위아래 화살표 키를 누르면 명령 프롬프트와 같은 실행 취소/다시 실행을 추가하고 싶습니다.

이 작업을 수행하는 가장 좋은 방법은 무엇입니까? (내장 된 다시 실행/실행 취소는 내가 원하는 것보다 더 많은 문서 수준에서 작동합니다.)

+0

무엇을 시도하셨습니까? – faby

+0

버튼을 누르거나 Enter 키를 누르면 텍스트 상자에있는 내용이 이전 명령으로 저장되기를 원하십니까? – Hayden

+0

[응용 프로그램 명령] (http://msdn.microsoft.com/en-us/library/system.windows.input.applicationcommands%28v=vs.110%29.aspx)을 사용하여 시도한 적이 있으며 'InputBindings' 적절한 키에 '실행 취소'와 '다시 실행'을 지정 하시겠습니까? – XAMlMAX

답변

1

실행 취소 다시 실행 응용 프로그램 명령을 사용할 수 있습니다. 이것은 MVVM 호환되지 않는 버전입니다 :

당신의 XAML

<TextBox Margin="5" PreviewKeyUp="TextBox_PreviewKeyUp" AcceptsReturn="False" /> 

에서

private List<string> _history = new List<string>(); 
private int _historyIndex = -1; 

private void TextBox_PreviewKeyUp(object sender, KeyEventArgs e) 
{ 
    TextBox textBox = (TextBox)sender; 
    if (e.Key == Key.Return) 
    { 
     _history.Add(textBox.Text); 
     if (_historyIndex < 0 || _historyIndex == _history.Count - 2) 
     { 
      _historyIndex = _history.Count - 1; 
     } 

     textBox.Text = String.Empty; 

     return; 
    } 

    if (e.Key == Key.Up) 
    { 
     if (_historyIndex > 0) 
     { 
      _historyIndex--; 
      textBox.Text = _history[_historyIndex]; 
     } 

     return; 
    } 

    if (e.Key == Key.Down) 
    { 
     if (_historyIndex < _history.Count - 1) 
     { 
      _historyIndex++; 
      textBox.Text = _history[_historyIndex]; 
     } 

     return; 
    } 
} 

당신의 숨김 코드에서 나는 이것이 당신이 의미하는 기능입니다 바랍니다.

+0

이것은 명령 프롬프트처럼 작동하지 않습니다. 명령 프롬프트에서 텍스트 명령을 입력하고 리턴하십시오. 방금 입력 한 전체 명령은 스택에 저장되고 위쪽 및 아래쪽 화살표를 사용하여 해당 스택을 스크롤 할 수 있습니다. 이 코드는 그렇게 작동하지 않습니다. – ashlar64

+0

방금 ​​내 대답을 편집했습니다.이제는 니가 필요로하는 것이 더 적합하길 바란다 –

+0

이것은 내가 결국 한 일과 매우 흡사하다. 사용자가 Enter 키를 누를 때마다 기록에 다른 텍스트가 추가되고 100에 도달하면 마지막으로 지울 것입니다. 새 명령이 입력되면 historyIndex를 가장 최근에 추가 된 명령에 배치했습니다. – ashlar64

-1

명령을 스택 컬렉션에 유지할 수 있습니다.

+0

이것은 유효한 대답이 아니므로 -1입니다. 자세한 내용은 도움말 센터의 [좋은 답변 작성 방법] (http://stackoverflow.com/help/how-to-answer) 페이지를 참조하십시오. – Sheridan

+0

감사합니다. 나의주의 산만 때문에 유감스럽게 생각합니다. 내 대답은 의견에 대한 변환기가 될 것이라고 생각했습니다. – mike00

1

단순히 PreviewKeyDown 이벤트를 사용하고 Key.Down 또는 Key.Up을 확인하고 마지막 명령 목록을 읽을 수 있습니다. e.Handled = true으로 설정하면 커서가 위로 이동하지 않습니다.

private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Up) 
    { 
     e.Handled = true; 

     //Here comes the code where you read your last commands and print it to your Textbox 
    } 

    //Same for Key.Down 
} 

MVVM을 준수하려면 Viewmodel에서 명령을 트리거하는 이벤트 트리거를 사용할 수 있습니다. 희망 사항이 당신에게 아이디어를 제공합니다. 불행히도 나는 당신을 위해 충분한 시간을 프로그램하지 못했습니다. :)

+0

이것이 내가 생각하고 있었던 방식입니다. 그러나 내가 이렇게하면 바퀴를 재발 명할 것인지 궁금해하고있었습니다. BTW는이 코드가보기에만있는 것이 아니겠습니까? ViewModel이 아닌가? 이것은보기가 돌봐야 할 무언가처럼 보입니다. – ashlar64

+0

@ ashlar64 나는 이것이 의견의 문제라고 생각합니다. 나는 코드를 최소한으로 줄이는 것을 선호한다. –

+0

또 다른 간단한 질문은 ... PreviewKeyUp 대신 PreviewKeyDown을 선택하는 이유가 무엇입니까? – ashlar64

관련 문제