Решено | Как связать TextBox и Label в двух окнах форм WPF?

Всем привет. Бывает для не которых задач необходимо передавать данные из одной формы в другую. Способов решения такой задачи достаточно много. Но я хотел именно показать как можно сделать практически всю логику вынеся в XAML разметку и как можно меньше использовать C#. И так я в своем примере покажу как можно из одной формы окна TextBox привязать к Lable в другом окне формы.

App.xaml

Для этого в XAML разметке файла App.xaml впишем следующий код.

<Application x:Class="WpfApp10.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApp10"
             xmlns:sys="clr-namespace:System;assembly=mscorlib"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <sys:String x:Key="txt">nookery.ru</sys:String>
        </ResourceDictionary>
    </Application.Resources>
</Application>

И так мы тут подключили пространство имен mscorlib и создали объект класса String это будет наша глобальная переменная благодаря которой мы сможем обмениваться текстом между двух форм.

MainWindows.xaml

Далее в Xaml разметке MainWindows впишем следующий код.

<Window x:Class="WpfApp10.MainWindow"
        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:WpfApp10"
        mc:Ignorable="d"
        Title="MainWindow" Height="317.72" Width="455.082">

    <Grid>
        <TextBox x:Name="mainTextBox" HorizontalAlignment="Left" Height="38" Text="Главное окно"  VerticalAlignment="Top" FontSize="25" FontWeight="Bold" PreviewKeyDown="txtColor_PreviewKeyDown"/>
    </Grid>
</Window>

Здесь ничего особо нет, кроме как созданного события которое происходит при нажатии любой кнопки на клавиатуре. 

MainWindows.cs

А вот что мы вписываем в обработчике на события, и конструкторе класса MainForm 

using System.Windows;
using System.Windows.Input;


namespace WpfApp10
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Window2 win = new Window2();
            win.Show();
        }

        private void txtColor_PreviewKeyDown(object sender, KeyEventArgs e)
        {
         Application.Current.Resources["txt"] = mainTextBox.Text;
        }
    }
}

В конструкторе мы создаем еще одну форму и отображаем ее. Так же в обработчике события нажатия клавиш, реализовано сохранение текста, в нашу глобальную переменную, находящуюся в ресурсах файла App.xaml. 

Windows2.xaml

Теперь посмотрим xaml разметку нашей второй формы.

<Window x:Class="WpfApp10.Window2"
        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:WpfApp10"
        mc:Ignorable="d"
        xmlns:ff="WpfApp10.MainWindows"
        Title="Window2" Height="200" Width="200"
        xmlns:sys="clr-namespace:System;assembly=mscorlib">

    <Grid>
        <Label x:Name="secondaryTexBox"   HorizontalAlignment="Left" Height="38" Content="{DynamicResource txt}"  VerticalAlignment="Top" Width="192"  FontSize="14"/>
    </Grid>
</Window>

 

Как мы видим в разметке мы привязали Label к нашей глобальной переменной. И теперь когда мы будем писать в главной форме окна в textBox вся информация будет видна в Label в дочерней форме.

Если захотеть можно не много изменив код, вместо Label вставить TextBox так же создать обработчик события во второй форме на нажатие клавиш, и сделать привязку на глобальную переменную в первой форме, то в итоге мы получим два окна в котором мы можем видеть напечатанный текст сразу в двух окнах, при чем не имеет значения в каком окне мы будем печатать.

Обновлено: 03.03.2021 — 21:46

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.