Pregunta

En mi WPF proyecto de C#, he creado un TreeView.Cada TreeViewItem tiene un evento LostFocus que debe ser planteada cuando el elemento pierde su enfoque.También he de crear un botón que se necesita para hacer clic cuando el usuario quiere cambiar el encabezado de una cierta TreeViewItem.El usuario, después de la selección en la vista en árbol, puede hacer clic en el botón y un cuadro de texto que aparecen en sustitución de la TreeViewItem encabezado.Si el usuario no hace clic en el cuadro de texto, pero haga clic en otro TreeViewItem, el evento LostFocus nunca se planteó.De lo contrario, si el usuario haga clic en cuadro de texto y, a continuación, cambiar el enfoque, es elevado.También he utilizado textBox.Focus() y Keyboard.Focus(textBox) pero el no trabajo.¿Cómo puedo solucionar este problema?

Para que quede claro, antes de crear un post que he leído de otro MODO respuesta aquí

Aquí está el fragmento 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) =>
                     {...}  
    }
¿Fue útil?

Solución

Perdón por mi que lo diga, pero cada usuario de WPF que ha de leer tu pregunta, probablemente, ha sacudido su cabeza en la compasión.Nos sentimos tristes para usted, porque usted todavía no ha aprendido el verdadero "Zen de WPF", que es el aprovechamiento de enlace de datos, plantillas y disparos para hacer de su interfaz de usuario dinámica, en lugar de hacerlo a la vieja usanza.WPF es hermoso, porque de esta capacidad.También hace que las cosas "1000%" más fácil.

Te recomiendo cambiar la interfaz de usuario para el uso de un Disparador en su TreeViewItem para reemplazar su HeaderTemplate basa en una propiedad definida en el TreeViewItem.Establezca esta propiedad en true cuando el elemento se hace doble clic.Establecer falso cuando IsKeyboardFocusWithin va false (se puede reemplazar metadatos, y agregar un PropertyChangedCallback para esto).

En cuanto a tu LostFocus el problema va, sospecho que tu problema es que tienes varias enfoque ámbitos.

Detalles adicionales sobre cómo hacer esto de la "WPF manera"

Aquí están algunos de los detalles de cómo implementar esta usando una propiedad adjunta, los desencadenantes y las plantillas.

Sus plantillas puede ser tan simple o tan complejo como usted desea.Aquí es simple:

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

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

Aquí es lo que es su estilo, se vería así:

La propiedad adjunta "ShowTextBox" puede ser creado en MyWindowClass el uso de la "propa" fragmento - sólo tienes que escribir "propa" y pulse la ficha, a continuación, rellenar los espacios en blanco.

Para cambiar el elemento para mostrar el cuadro de texto, solo tienes que:

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

SetShowTextBox(item, false);

Por favor, traten de aprender e invertir en los patrones y prácticas de WPF así que va a ser fácil para hacer lo que usted quiere lograr.

También hay proyectos por ahí que pueden ayudarle a empezar con lo que se quiere lograr con TreeViews.

Proyecto de ejemplo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top