سلام
راهکار که زیاد هست منتها قبل اش یه توصیه میکنم که اول زبان سی شارپ تون و بعد کار با wpf تون را کاملا تقویت کنید وگرنه در بسیاری موارد ، هر بار به مشکلات زیادی برمیخورید که حل کردنش براتون سخت و پیچیده میشه .
چند راه وجود داره :
1) یکی اش اینه که در xaml ، فرضا یه ویندوزی با نوع MainWindow دارید که یه شی کنترل TextBox داره . این شی کنترل را ، هم براش directive ئه x:Name تعیین کنید و به این ترتیب یه نام ای دلخواه (فرضا نام UserNameTextBox را براش انتخاب میکنید) به این کنترل بدید و همچنین directive ئه x:FieldModifier را براش تعریف کنید و فرضا مقدار Public را بهش بدید تا از کلاس های دیگه ، در دسترس باشه :
<TextBox x:FieldModifier="public" x:Name="UserNameTextBox" />
دقت کنید که با پروپرتیِ Name ، نباید بهش مقدار بدید . حتما باید با x:Name ، بهش مقدار بدید چون میخواید در کنترل دیگه ای قابل دسترس باشه .
بعد ، درون ویندوز دیگه (فرضا نوع این ویندوز ، OtherWindows هست) (یا user control یا ...) ، همین کار را برای کنترل مقصدی که میخواین این اطلاعات در اون کنترل هم نمایش داده بشه (یا فقط استفاده بشه) ، همین کار را میکنید . یعنی فرضا در ویندوزِ OtherWindows ، یه شی کنترل دکمه (فرضا با نام DisplayButton) میسازید که میخواید محتواش ، همون محتوای TextBox تون بشه ، در این کنترل دکمه ، هم x:FieldModifier و هم x:Name اش را مثل بالا ، تعیین میکنید .
بعد ، وقتی از درون MainWindow یا رویدادی از کنترلی در این ویندوز ، از ویندوزِ OtherWindows ، شی میسازید تا نمایشش بدید ، قبل از نمایش دادن ، مقدار DataContext ئه دکمه ای که میخواین اطلاعات را در اون نمایش بدید (DataContext ئه DisplayButton) را برابر با مقدار TextBox ئه مورد نظر (UserNameTextBox) قرار بدید .
یعنی فرضا در رویداد دکمه ای که درون MainWindow قرار داره و توش میخوان شی ای از OtherWindow بسازین :
private void Button_Click(object sender, RoutedEventArgs e)
{
OtherWindows otherWindow = new OtherWindows();
otherWindow.DisplayButton.DataContext = this.UserNameTextBox;
otherWindow.Show();
}
بعد ، هر پروپرتی ای از DisplayButton (که در پنجره ی OtherWindow هست) را که خواستین (فرضا پروپرتی Content ئه این دکمه) را Binding کنید به پروپرتیِ مورد نظر در TextBox ای که در پنجره ی MainWindow هست (فرضا Binding را به پروپرتیِ Text ئه UserNameTextBox انجام میدید) :
<Button x:Name="DisplayButton" x:FieldModifier="public" Content="{Binding Path=Text}"/>
-------
** دقت کنید که در خط زیر در کد بالا :
otherWindow.DisplayButton.DataContext = this.UserNameTextBox;
،
نباید مقدار DataContext را برابر با شیِ MainWindow بگیرید . یعنی
نباید این طور بنویسید :
otherWindow.DisplayButton.DataContext = this;
تا بعدش ،
نباید کد Binding ئه DisplayButton را این طور تغییر بدید :
<Button x:Name="DisplayButton" x:FieldModifier="public" Content="{Binding Path=UserNameTextBox.Text}"/>
** چون تا جایی که میدونم ،
در آدرسِ Path ئه Binding ، همه ی اشیایی که میدید ، باید از پروپرتی باشن اما در کد بالا ، UserNameTextBox ای که در Path ئه Binding دادیم ، یک فیلد هست و پروپرتی نیست . واسه همین ، این کد بالا ، اشکال داره .
** یا میتونید بجای Binding به پروپرتی DisplayButton و کلا استفاده از Button ، یه پروپرتی دیگه خودتون در کلاس OtherWindow تعریف کنید (حتما DipendencyProperty باشه) و به این پروپرتی ، Binding انجام بدید (که اصولی ترش ، اینه) .
==========
2) روش دوم و حتی راحت تر (که در WinForm هم رایج هست) اینه که یه عضوی درون OtherWindow تعریف کنید و موقعی که شی ای از این در رویدادی در MainWindow دارید میسازید ، به اون عضو ، مقدارِ Text ئه TextBox را ارسال کنید :
private void Button_Click(object sender, RoutedEventArgs e)
{
OtherWindows otherWindow = new OtherWindows();
otherWindow.UserNameString = this.UserNameTextBox.Text;
otherWindow.Show();
}
که UserNameString ، عضوی تعریف شده در پنجره ی OtherWindows و از نوع string هست .
اما توی wpf بهتره که از روش binding استفاده کنید .