4

Visual Studio 확장 프로그램을 작성했으며 내 확장 프로그램과 관련된 사용자 작업 로그를 유지합니다. 내 도구가 로그에서 수행하는 변경 사항에 대해 실행 취소/다시 실행 정보를 포함 할 수 있기를 원합니다. 실행 취소/다시 실행이 발생할 때 호출되는 이벤트 수신기를 사용하고 실행 취소/다시 실행 개체가 있는지 확인하여 수행 할 수 있기를 기대합니다. 내 도구가 생성 한 동작에 해당하는 것입니다.Visual Studio 확장 프로그램에서 실행 취소/다시 실행 작업을 기록합니다.

현재, 난 내가 생성 this answer을 뒤에 ITextUndoHistoryRegistry를 사용하여 얻을 현재 IWpfTextView에 대한 ITextUndoHistory를 얻을 수있는 코드가 있습니다. 불행히도, 내가 얻은 ITextUndoHistory 객체는 유용 할 수있는 기능을 충분히 구현하지 못했습니다. 특히 UndoRedoHappened 이벤트가 호출되지만 항상 null의 트랜잭션이 있습니다. 또한 UndoStack/RedoStack 속성은 System.NotSupportedException입니다. 작동하는 유일한 것은 CreateTransaction입니다. 트랜잭션 개체를 제공하고 Visual Studio의 실행 취소/다시 실행 목록에 표시된 작업의 이름을 설정할 수 있습니다. 작업 할 필요가 없지만.

Visual Studio에서 실행 취소 정보에 액세스하는 다른 방법이 있습니까? 아니면 내가 접근 할 수있는 것보다 더 창조적 인 해킹일까요?

+0

왜 사용자 작업 로그로 실행 취소/다시 실행을 사용하고 있습니까? 실행 취소 기록은 여러 가지 이유로 제거 될 수 있으므로 영구적이지 않습니다. –

+0

@JasonMalinowski, 사용자가 내 도구를 사용하여 변경을 수행 한 다음 실행 취소를 눌러 변경 사항을 실행 취소했는지 알고 싶습니다. – perelman

답변

4

편집기 확장자의 실행 취소/다시 실행을 로그하려고한다고 가정합니다. 그렇지 않은 경우 ... 아래의 설명은 유용하지 않습니다. :-)

먼저 수행하려는 작업은 실행 취소 트랜잭션의 일부로 포함 된 작은 "작업"을 나타내는 ITextUndoPrimitive에서 파생되는 작은 클래스를 만드는 것입니다. 여기에는 사용자가 트랜잭션을 취소 할 때 호출되는 Undo()과 사용자가 트랜잭션을 undid로 지정한 다음 다시 실행을 수행 할 때 호출되는 Do()이 있습니다. 나머지 메소드의 경우, 간단한 구현을 수행하십시오. CanUndo/CanRedo은 항상 true를 리턴하고 Parent를 읽기/쓰기 특성으로 만들어야합니다. CanMerge은 항상 false를 반환해야하며 Merge()은 구현되지 않은 상태로 둘 수 있습니다. 물론 ITextUndoPrimitive에 원하는 추가 상태를 유지할 수 있습니다.

Do/Undo에서 수행하는 작업은 귀하에게 달려 있습니다. 따라서 확장 기능이 텍스트 버퍼를 수정하고 사용자 프로젝트의 다른 파일에 쓰는 경우 파일 쓰기를 실행 취소 할 수 있습니다. 어떤 작업을 사용자가 undid (통계적 목적 일까?) 추적하기 위해 노력하고 있으므로 로그에서 "사용자가 편집하지 않은"비트를 업데이트하여 완료 할 수 있습니다.

작업을 수행 할 때 CreateTransaction으로 전화를 걸어 새 트랜잭션을 시작한 다음 해당 트랜잭션 호출에서 실행 취소 프리미티브의 새 인스턴스를 전달하는 AddUndo()를 호출하십시오. 편집기는 적절하게 설명한대로 Do/Undo를 호출합니다.

마지막 메모 : 트랜잭션 기록이 너무 오래 걸리면 편집자가 실행 취소 트랜잭션을 제거하거나 경우에 따라 기록이 삭제되어 다시 설정되어야하는 경우가 있습니다. 어떤 시점에서 언두 (undo) 프리미티브가 사라지고 GC'ed 될 것이라고 기대하십시오. 무엇보다 중요한 것은 누출 될 수있는 다른 장소에서 그들을 붙들어서는 안됩니다.