Jak edytować TextBox'a z innego okna?

0

Cześć, w jaki sposób mogę edytować text boxa z okna pierwszego za pomocą operacji w drugim?

Na przykład:

Window1.xaml

<Grid>

 <TextBox x:Name="LaboTextBox"/>

</Grid>

Window1.xaml.cs

public partial class Window1 : Window
{
    public Window1()
        {
            InitializeComponent();
            Window2 win2 = new Window2();
            win2.Show();
        }
}

i teraz jak to edytować z drugiego okna?

Window2.xaml.cs

public partial class Window2 : Window
    {
        public Window2()
            {
                InitializeComponent();
                //co tutaj?

            }
    }
    //albo tutaj?

1

Sterować oknem niemodalnym najłatwiej jest za pomocą DependencyProperty. Dzięki DependencyProperty możemy używać bindingu.
Zaprojektuj sobie na początku drugie okno niemodalne. Będzie ono posiadało DependencyProperty o nazwie CurrentText:
C#:

public partial class MySecondWindow : Window
    {
        public MySecondWindow()
        {
            InitializeComponent();
        }

        public string CurrentText
        {
            get { return (string)GetValue(CurrentTextProperty); }
            set { SetValue(CurrentTextProperty, value); }
        }
        public static readonly DependencyProperty CurrentTextProperty =
            DependencyProperty.Register("CurrentText", typeof(string), typeof(MySecondWindow), new PropertyMetadata(""));

    }

O DependencyProperty bez problemu wyczytasz w google. Jest tego pełno.
Następnie musimy do tego DependencyProperty zbindować w obie strony tekst w naszej kontrolce:
XAML:

<Window x:Class="WpfApp1.MySecondWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MySecondWindow" 
        Height="450" 
        Width="800"
        x:Name="hWindow">
    <Grid>
        <TextBox Text="{Binding ElementName=hWindow, Path=CurrentText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBox>
    </Grid>
</Window>

Teraz jedyne co musisz zrobić, aby zmienić tekst z poziomu pierwszego okna to posiadać referencję do utworzonego dialogu niemodalnego.
C#

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            MySecondWindow = new MySecondWindow();
            MySecondWindow.Show();
        }

        MySecondWindow MySecondWindow;

        public void DoAction()
        {
            MySecondWindow.CurrentText = "Akcja wykonana";
        }
    }
0

@gswidwa1: napotykam błąd CS0165.Użycie nieprzypisanej zmiennej lokalnej dla lini MySecondWindow.CurrentText = "Akcja wykonana";

0

To pokaż kod

0

@gswidwa1:

Mam strone(Page) która wyświetla się w ramce w oknie pierwszym(Window1) na której umieściłem textboxa oraz przycisk:

Page1.xaml

 <TextBox x:Name="tekst"/>
<buttton Click="Button_Click"/>

Page1.xaml.cs

w kodzie stronie mam przycisk ktory otwiera mi nowe okno(Window2)

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Window2 win2 = new Window2();        
            win2.Show();                        
        }

i teraz w kodzie Window2 mam przycisk który genereuje mi jakoś stringa i teraz chce tego strona wyświetlić w tym moim tekstboxie w Pag1

Window2.xaml.cs

        private void Button_Click(object sender, RoutedEventArgs e)
        {
         
            string wynik = jakies zapytanie z bazy danych.

          i teraz jak tego stringa przenieść do textboxa z page1
        }
0

W Window2 musisz utworzyć zmienną pomocniczą aby potem odczytać ją z Window1.

public partial class Window2 : Window
    {
        public Window2()
        {
            InitializeComponent();
        }
        private void hGenerateString_Click(object sender, RoutedEventArgs e)
        {
            MyText = "Tutaj jest mój tekst";
        }
        public string MyText { get; private set; }
    }

A jak odczytać? Tak:

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            dialog = new Window2();
            dialog.Show();
        }
        Window2 dialog;
        private void ReadValueFromDialog2_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(dialog.MyText);
        }
    }

Był to przykład okna niemodalnego. Jest to takie, które może działać równolegle z oknem głównym. Okno modalne to takie, które blokuje Tobie dostęp do okna głównego dopóki nie zamkniesz dialogu.
Okno niemodalne wywołujesz poprzez dialog.Show();. Okno modalne poprzez dialog.ShowDialog();.

Teraz zasadnicza różnica: Gdy użyjesz dialog.Show(); kod będzie się wykonywać dalej, natomiast przy dialog.ShowDialog(); kolejne instrukcje w metodzie będą wykonywać się dopiero po zamknięciu dialogu. Jeżeli użyjesz okna modalnego powinno to wtedy wyglądać tak:

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            dialog = new Window2();            
        }
        Window2 dialog;
        private void ReadValueFromDialog2_Click(object sender, RoutedEventArgs e)
        {
            dialog.ShowDialog();
            MessageBox.Show(dialog.MyText);
        }
    }
0

@gswidwa1:

Nie moge użyć wlg takiej składni:

public MainWindow()
        {
            InitializeComponent();
            dialog = new Window2();            
        }
        Window2 dialog;

Błąd CS0103 Nazwa „dialog” nie istnieje w bieżącym kontekście

0

To wpisz w google "WPF modal dialog tutorial". To co teraz napisałeś to są podstawy, które nie mają nic wspólnego z WPF, a z tym, że bierzesz się za WPF nie znając podstaw c#. Popracuj trochę w konsoli, porób zadania i sam zobaczysz o co chodzi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1