none
WPF - UserControl modificando controles em outro UserControl RRS feed

  • Pergunta

  • Pessoal, 

    Estou tendo o seguinte problema em WPF C# - imaginem que tenho um Usercontrol com as seguintes características

    Nome: UserControl1
    Possui: Um botão

    ... e outro UserControl:

    Nome: UserControl2
    Possui: Um textblock

    Dentro do UserControl1 eu tenho o seguinte código que é acionado no evento Click: 

    UserControl2 UC2 = new UserControl2
    
    UC2.TextBlock.text = "Teste"

    ... porém não funciona. O texto no TextBlock do UserControl2 não muda. Saberiam me dizer o porquê?

      É importante salientar que, sim, os dois UserControls estão sendo usados. Os dois estão dentro do MainWindow. 
    • Editado Tortchan domingo, 19 de janeiro de 2014 22:15
    domingo, 19 de janeiro de 2014 22:14

Respostas

  • Olá,

    Tente assim:

    ((MainWindow)Application.Current.MainWindow)).UserControl2.TextBlock1.Text = "sdfsddsf";


    Herbert Lausmann

    • Marcado como Resposta Giovani Cr terça-feira, 28 de janeiro de 2014 11:52
    terça-feira, 21 de janeiro de 2014 14:40
  • Olá você pode fazer uso de uma property dependency:

    Criaria um user control assim

    XAML User Control:

    <UserControl x:Class="WpfApplication1.ucTeste"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="300">
        <Grid>
            <TextBox Name="txtTexto" Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Path=TextoCampo, Mode=TwoWay}"/>
        </Grid>
    </UserControl>
    

    E adicionaria uma property dependency a ele no arquivo de código assim:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    
    namespace WpfApplication1
    {
        /// <summary>
        /// Interaction logic for ucTeste.xaml
        /// </summary>
        public partial class ucTeste : UserControl
        {
            public ucTeste()
            {
                InitializeComponent();
            }
    
    
    
            public string TextoCampo
            {
                get { return (string)GetValue(TextoCampoProperty); }
                set { SetValue(TextoCampoProperty, value); }
            }
    
            // Using a DependencyProperty as the backing store for TextoCampo.  This enables animation, styling, binding, etc...
            public static readonly DependencyProperty TextoCampoProperty =
                DependencyProperty.Register("TextoCampo", typeof(string), typeof(ucTeste), new PropertyMetadata(""));
    
            
        }
    }
    

    Depois poderia tratar este user control alterando o texto executando nomeUserControl.TextoCamo = "Testando";

    Att.

    • Sugerido como Resposta Lucas D Santos terça-feira, 21 de janeiro de 2014 18:54
    • Marcado como Resposta Giovani Cr terça-feira, 28 de janeiro de 2014 11:52
    terça-feira, 21 de janeiro de 2014 15:04

Todas as Respostas

  • Vc está criando uma instancia ou seja um novo UserControl2 tente pelo nome :

    this.Seuusercontrol2.TextBlock.Text = "Teste"

    segunda-feira, 20 de janeiro de 2014 09:45
  • Não dá certo. Se eu coloco esse código dentro do UserControl1, ele não acha o UserControl2 se eu digito this.usercontrol2. 

    Tentei colocar um método na MainWindow com esse código para o UserControl1 instanciar e chamar apartir dele, mas também não deu certo. Ele não acha se eu não instanciar o UserControl2. 

    segunda-feira, 20 de janeiro de 2014 23:34
  • Olá,

    Tente assim:

    ((MainWindow)Application.Current.MainWindow)).UserControl2.TextBlock1.Text = "sdfsddsf";


    Herbert Lausmann

    • Marcado como Resposta Giovani Cr terça-feira, 28 de janeiro de 2014 11:52
    terça-feira, 21 de janeiro de 2014 14:40
  • Olá você pode fazer uso de uma property dependency:

    Criaria um user control assim

    XAML User Control:

    <UserControl x:Class="WpfApplication1.ucTeste"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="300">
        <Grid>
            <TextBox Name="txtTexto" Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Path=TextoCampo, Mode=TwoWay}"/>
        </Grid>
    </UserControl>
    

    E adicionaria uma property dependency a ele no arquivo de código assim:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    
    namespace WpfApplication1
    {
        /// <summary>
        /// Interaction logic for ucTeste.xaml
        /// </summary>
        public partial class ucTeste : UserControl
        {
            public ucTeste()
            {
                InitializeComponent();
            }
    
    
    
            public string TextoCampo
            {
                get { return (string)GetValue(TextoCampoProperty); }
                set { SetValue(TextoCampoProperty, value); }
            }
    
            // Using a DependencyProperty as the backing store for TextoCampo.  This enables animation, styling, binding, etc...
            public static readonly DependencyProperty TextoCampoProperty =
                DependencyProperty.Register("TextoCampo", typeof(string), typeof(ucTeste), new PropertyMetadata(""));
    
            
        }
    }
    

    Depois poderia tratar este user control alterando o texto executando nomeUserControl.TextoCamo = "Testando";

    Att.

    • Sugerido como Resposta Lucas D Santos terça-feira, 21 de janeiro de 2014 18:54
    • Marcado como Resposta Giovani Cr terça-feira, 28 de janeiro de 2014 11:52
    terça-feira, 21 de janeiro de 2014 15:04