Qual é a melhor maneira de replicar a funcionalidade de uma interface do usuário do Windows Explorer na WPF?
-
20-09-2019 - |
Pergunta
Então, estou usando FileSystemWatcher
para preencher e atualizar uma lista de reprodução. Quero replicar muitos recursos do Windows Explorer, o mais importante:
* Renomear em linha
* Clique lento duplo para renomear
Estou tendo um aborrecimento fazendo isso, então pensei, talvez haja uma maneira mais fácil do que reimplementar a roda? Talvez eu possa de alguma forma hospedar uma janela do Windows Explorer no meu aplicativo como controle?
Solução
Hospedando uma janela real do Windows Explorer em seu aplicativo é possível, mas repleta de perigos: as técnicas são diferentes no XP vs Vista vs Win7 e você estará lidando com todo tipo de material de baixo nível. Eu recomendaria fortemente não tentar.
Eu acho que suas melhores opções são:
- Use Microsoft.win32.openfiledialog se puder ser facilmente adaptado à sua necessidade, ou
- Codifique sua própria funcionalidade, ou se você é muito corajoso:
- Inicie uma janela do Explorer separado, opcionalmente com o código que tenta forçar sua posição e tamanho a serem superados (isso também é difícil ...)
Notas sobre o recurso de renomear em linha
A renomeação inline e o clique lento para renomear os recursos são realmente bastante triviais de implementar.
No seu modelo de visualização Adicionar:
- Um String dependencyProperty de "nome do newName"
- Uma "renomeação" de dependência da BOOL com um PropertyChangedCallback. Quando a "renomeação" é verdadeira, copie o nome para o newName. Quando for falso, se newName! = Nome renomear o arquivo um nome de atualização.
No seu datatemplate, adicione um gatilho na "renomeação" que substitui o seu textblock vinculado ao "nome" por uma caixa de texto ligada a "newName".
Adicione estes manipuladores de eventos: * KeyDown Event: Se F2 for pressionado renomeação de alternância. Se Enter for pressionado e renomeando, defina renomeação = false. Se o ESC for pressionado e renomear o nome de cópia para newName e definir renoming = false. * Evento Lostfocus: Definir renomeação = False * SeleçãoChanged Event no contêiner: registro registro de data e hora da última seleção. * Evento de Mousedown: Se o clique e a seleção esquerda alterados> 0,5 segundos atrás, defina renomeação = true
Muitos outros recursos do Explorer View são igualmente fáceis de implementar, como agrupamento e várias colunas.
Espero que isto ajude.