Pergunta

Na minha WPF C# projeto, eu criei um TreeView.Cada TreeViewItem tem um evento LostFocus que deve ser levantada quando o item perdido o seu foco.Eu também cria um botão que é necessário para ser clicado quando o usuário deseja alterar o cabeçalho de um determinado TreeViewItem.Usuário, após a seleção no TreeView, pode clicar no botão e uma caixa de Texto aparecem substituindo o TreeViewItem cabeçalho.Se o usuário não clique em caixa de Texto, mas você pode clicar em outra TreeViewItem, o evento LostFocus nunca é levantada.Caso contrário, se o usuário clique em caixa de Texto e, em seguida, mudar o foco, ele é gerado.Eu também usei textBox.Focus() e Keyboard.Focus(textBox) mas o que não funciona.Como posso corrigir isso?

Apenas para ser claro, antes de criar um post que eu li outro MODO de resposta aqui

Aqui está o trecho de código

 private void RenameButton_Click(object sender, RoutedEventArgs e)
     {

         TreeViewItem twItemSelected = (TreeViewItem)this.Treeview_PropertyDefinition.SelectedItem;                                                            
         var textBox = new TextBox()
         {
             Text = (String)twItemSelected.Header,
         };
         textBox.Focus();
         Keyboard.Focus(textBox);
         if (textBox.IsFocused)
             MessageBox.Show("focused");


         twItemSelected.Header = textBox;            


         //check which property is currently selected

             String parentName = ((TreeViewItem)twItemSelected.Parent).Name;
          ((TreeViewItem)twItemSelected.Parent).Parent).Name;

            //get values from file 
            //show page based on parent value
             switch (parentName)
             {
                 case "RectangleBar_TreeviewItem":
                     textBox.LostFocus += (o, ev) =>
                     {...}  
    }
Foi útil?

Solução

Perdão minha dizer isso, mas a cada regular de usuário do WPF que tem de ler sua pergunta, provavelmente, sacudida de sua cabeça em piedade.Nos sentimos tristes por você, porque você ainda não aprenderam o verdadeiro "Zen do WPF", que está aproveitando a ligação de dados, modelos e dispara para fazer a sua INTERFACE de usuário dinâmica em vez de fazê-lo da maneira antiga.O WPF é bonito, porque essa capacidade.Ele também faz as coisas "1000%" mais fácil.

Eu recomendo que você altere sua INTERFACE do usuário para usar um Disparador no seu TreeViewItem para substituir o seu HeaderTemplate com base em uma propriedade, você define o TreeViewItem.Definir esta propriedade verdadeiro quando o item for clicado duas vezes.Definir o que ela é falsa quando IsKeyboardFocusWithin vai falso (você pode substituir metadados e adicionar um PropertyChangedCallback para isso).

Tão longe como o seu LostFocus o problema se vai, eu suspeito que o seu problema é que você tem várias foco escopos.

Detalhes adicionais sobre como fazer isso, o "WPF forma"

Aqui estão alguns dos detalhes sobre como implementar isso usando uma propriedade anexada, gatilhos e modelos.

Seus modelos podem ser tão simples ou tão complexo como você deseja.Aqui é simples:

<DataTemplate x:Key="NormalTemplate">
  <ContentPresenter />
</DataTemplate>

<DataTemplate x:Key="TextBoxTemplate">
  <TextBox Text="{Binding}" />
</DataTemplate>

Aqui é o seu estilo seria parecido com:

Os bens penhorados "ShowTextBox" pode ser criado em MyWindowClass usando o "propa'" snippet - basta digitar "propa'" e tecle tab e, em seguida, preencher os espaços em branco.

Para mudar o item para mostrar a caixa de texto, basta:

SetShowTextBox(item, true);
To switch it back:

SetShowTextBox(item, false);

Por favor, tente aprender e investir em padrões e práticas de WPF de modo que vai ser fácil fazer o que você deseja alcançar.

Há também projetos lá fora, que pode ajudar você a começar com o que você deseja alcançar com TreeViews.

Exemplo de projeto

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top