Всем привет. Бывает для не которых задач необходимо передавать данные из одной формы в другую. Способов решения такой задачи достаточно много. Но я хотел именно показать как можно сделать практически всю логику вынеся в XAML разметку и как можно меньше использовать C#. И так я в своем примере покажу как можно из одной формы окна TextBox привязать к Lable в другом окне формы.
App.xaml
Для этого в XAML разметке файла App.xaml впишем следующий код.
1 2 3 4 5 6 7 8 9 10 11 12 |
<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 впишем следующий код.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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 разметку нашей второй формы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<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 так же создать обработчик события во второй форме на нажатие клавиш, и сделать привязку на глобальную переменную в первой форме, то в итоге мы получим два окна в котором мы можем видеть напечатанный текст сразу в двух окнах, при чем не имеет значения в каком окне мы будем печатать.