LostFocus não gerado para um TreeViewItem
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) =>
{...}
}
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.