none
Pegar os componentes de uma window RRS feed

  • Pergunta

  • Olá pessoal,

    Estou com um probleminha q é o seguinte: estou implementando um drag drop. Tenho uma classe que faz as alguns efeitos quando os componentes são arrastados. Nesta classe preciso pegar os compontentes que foram adicionados à Window. O problema é que os componentes são adicionados dinâmicamentes pelo código c# e quando tento fazer a chamada: window.FindName("nomeComponente") não encontra componente, este método funciona perfeitamente para os componentes que foram adicionados no zemel da window, alguém sabe o porque disto? conhece alguma solução alternativa?

    Obrigada,

    Juliana

    sexta-feira, 23 de julho de 2010 18:32

Respostas

  • Prontinho... achei o problema... agora deve funcionar:

      public static class WindowsExtensions {
        public static DependencyObject GetChildControl(this DependencyObject reference, string name) {
          DependencyObject result = null;
          var childrensCount = VisualTreeHelper.GetChildrenCount(reference);
          for (int i = 0; i < childrensCount; i++) {
            result = VisualTreeHelper.GetChild(reference, i);
            var resultName = result.GetValue(FrameworkElement.NameProperty);
            if (name.Equals(resultName)) return result;
    
            if (VisualTreeHelper.GetChildrenCount(result) > 0) {
              result = result.GetChildControl(name);
              if (result != null) return result;
            }
          }
          return null;
        }
      }
    


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ? Se não da certo como voce esta fazendo... Tente fazer de um jeito totalmente diferente....
    segunda-feira, 26 de julho de 2010 23:05
    Moderador

Todas as Respostas

  • Não sei se vai funcionar... pois acredito que é dessa forma que o FindName funciona... mas testa usar esse metodo:

     

    public static class WindowsExtensions {
      public static DependencyObject GetChildControl(this DependencyObject reference, string name) {
        var childrensCount = VisualTreeHelper.GetChildrenCount(reference);
        for (int i = 0; i < childrensCount; i++) {
          var child = VisualTreeHelper.GetChild(reference, i);
          if (name.Equals(child.GetValue(FrameworkElement.NameProperty))) return child;
    
          if (VisualTreeHelper.GetChildrenCount(child) > 0) return child.GetChildControl(name);
        }
        return null;
      }
    }
    
    
    
    window.GetChildControl("nomeComponente");
    


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ? Se não da certo como voce esta fazendo... Tente fazer de um jeito totalmente diferente....
    sexta-feira, 23 de julho de 2010 21:52
    Moderador
  • Olá Rui, este código também não encontra os componentes que são adicionados pelo código c#, ainda não descobri o porque. Pode ser porque os componentes estão dentro de um grid? Debugando este código vi que ele encontra o grid, só não consegue achar os filhos dele.
    segunda-feira, 26 de julho de 2010 13:35
  • Uhm..  realmente tem algo de errado na minha logica... ela so percorre um ramo da arvore... assim q eu terminar o lanche dou uma olhada... mas funciona... veja esse modelo que eu usei de teste:

     

    <Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
      <DockPanel>
        <Button DockPanel.Dock="Top" Content="Teste" Click="Button_Click" />
        <StackPanel Name="panel">
          
        </StackPanel>    
      </DockPanel>
    </Window>
    
    
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Media;
    
    namespace WpfApplication1 {
      public partial class MainWindow : Window {
        public MainWindow() {
          InitializeComponent();
        }    
    
        private void Button_Click(object sender, RoutedEventArgs e) {
          var testeTextBox = this.panel.GetChildControl("testeTextBox");
          if (testeTextBox is TextBox) {
            MessageBox.Show((testeTextBox as TextBox).Text);
          }
        }
    
        private void Window_Loaded(object sender, RoutedEventArgs e) {
          this.panel.Children.Add(new TextBox() { Name = "testeTextBox" });
        }
      }
    
      public static class WindowsExtensions {
        public static DependencyObject GetChildControl(this DependencyObject reference, string name) {
          var childrensCount = VisualTreeHelper.GetChildrenCount(reference);
          for (int i = 0; i < childrensCount; i++) {
            var child = VisualTreeHelper.GetChild(reference, i);
            if (name.Equals(child.GetValue(FrameworkElement.NameProperty))) return child;
    
            if (VisualTreeHelper.GetChildrenCount(child) > 0) return child.GetChildControl(name);
          }
          return null;
        }
      }
    }
    
    


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ? Se não da certo como voce esta fazendo... Tente fazer de um jeito totalmente diferente....
    segunda-feira, 26 de julho de 2010 22:52
    Moderador
  • Prontinho... achei o problema... agora deve funcionar:

      public static class WindowsExtensions {
        public static DependencyObject GetChildControl(this DependencyObject reference, string name) {
          DependencyObject result = null;
          var childrensCount = VisualTreeHelper.GetChildrenCount(reference);
          for (int i = 0; i < childrensCount; i++) {
            result = VisualTreeHelper.GetChild(reference, i);
            var resultName = result.GetValue(FrameworkElement.NameProperty);
            if (name.Equals(resultName)) return result;
    
            if (VisualTreeHelper.GetChildrenCount(result) > 0) {
              result = result.GetChildControl(name);
              if (result != null) return result;
            }
          }
          return null;
        }
      }
    


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ? Se não da certo como voce esta fazendo... Tente fazer de um jeito totalmente diferente....
    segunda-feira, 26 de julho de 2010 23:05
    Moderador