Fazer um StackPanel e seu conteúdo "draggable" em wpf?
Tenho um UserControl sob a forma de:
<UserControl>
<Grid>
<!-- Content Here-->
<StackPanel> <!-- I want this element to be draggable within the usercontrol. -->
<Label Name = "Header" />
<Button />
<Button />
<Button />
</StackPanel>
<Grid>
</UserControl>
O meu resultado final é ter um controlo com botões (parte do usercontrol) que podem ser arrastados..? Ou seja, móvel ... dentro do controlo do UserControl
Li sobre o polegar, mas não sei como usá-lo...Quaisquer ideias ou exemplos seriam óptimos.Obrigado!
5 answers
Uma maneira muito simples de o fazer seria usar os Eventos do rato
Em primeiro lugar, enrole o seuStackPanel
num Canvas
para que possa ser facilmente posicionado de acordo com o local onde o utilizador o arrasta
A seguir, adicione MouseDown
e MouseUp
os eventos aos StackPanel
. Poderá ter de dar ao seu StackPanel
uma cor de fundo para receber eventos do rato.
No evento MouseDown
, anexar um MouseMove
manipulador de Eventos Ao StackPanel
e ter o painel capturar o rato para que todos os Eventos do rato sejam tratados por zero]}.
No evento MouseUp
, separe o evento MouseMove
e liberte a captura do rato.
No evento MouseMove
, mude as propriedades Canvas.Top
e Canvas.Left
do painel com base na posição actual do rato. Você precisará de uma verificação aqui para determinar se o mouse está fora do UserControl
também para que o StackPanel
não possa ser arrastado do ecrã.
Uma maneira seria manipular o rato no botão e mudar a sua posição ao mover o rato.
Então os passos serão:
- Adicione um manipulador ao botão. Mouseclick, por exemplo (ou mousedown) Quando se recebe um rato adiciona-se um manipulador ao mousemove.
- Verifique o movimento do rato e altere a posição do Botão
- Remova o manipulador após libertar o botão do rato.
Não sei de nenhum método específico, mas intuitivamente, você pode adicionar um manipulador de eventos para arrastar o método do controlo que deseja mover, e nesse método, poderá tornar o controlo num bitmap, fazer com que esse bitmap siga o seu cursor do rato e esconder o controlo original. Quando largado (o mouse foi lançado), ele deve simplesmente definir as coordenadas do controle original para as coordenadas do mouse, descartar o bitmap, e re-activar a visibilidade do controle.
Existem alguns tutoriais disponíveis para este em MSDN e outros lugares. Tente o seguinte link para arrastar e largar WPF.
Devias dar uma oportunidade ao projecto avalondock .
Isto permite-lhe criar recursos de layout ricos, como o Visual Studio faz (flutuando, acoplando, etc.).
Estou confiante que isto te ajudaria.