sliverlight页面传值的问题
我有一个usercontrol的页面,在这个页面上当点击一个按钮的时候弹出controls:ChildWindow的页面,在 childwindow上有一个textbox,我想在usercontrol上取得这个textbox中的值,请问有什么办法吗,谢谢!!!
Usercontrol 页面的xaml
<UserControl x:Class="SilverlightApplicationStudy.OutForm.FormApplication" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="400" Height="300"> <Grid x:Name="LayoutRoot" Background="White"> <StackPanel Orientation="Horizontal"> <Button x:Name="formtest" Content="OutPutForm" Width="100" Height="30" Background="DarkViolet" Click="formtest_Click" FontSize="14"></Button> </StackPanel> </Grid> </UserControl>
private void formtest_Click(object sender, RoutedEventArgs e) { FormChildWin formChildwin = new FormChildWin(); formChildwin.Show(); }
<controls:ChildWindow x:Class="SilverlightApplicationStudy.OutForm.FormChildWin" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls" Title="FormChildWin" Width="400" Height="300"><stackPanel><TextBox x:Name="kaisei" Text="2010年12月25日" Width="200" Height="20" TextAlignment="Left" Foreground="DeepPink"></TextBox><Button x:Name="CancelButton" Content="Cancel" Click="CancelButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,0,0" Grid.Row="0" /> <Button x:Name="OKButton" Content="OK" Click="OKButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,79,0" Grid.Row="0" /></stackPanel>
private void OKButton_Click(object sender, RoutedEventArgs e) { this.DialogResult = true; }
二、另外可以在childwindow中设置一个属性(这里使用VB代码,因为我熟悉)
public readonly property ChildWindowTextBoxText as string
Get
Return textbox.text
End Get
Set(ByVal value As string)
textbox.text = value
End Set
end proerty
后者不能动态得到textbox的变化值。
[解决办法]
有些错字修改一下
使用主题-观察者设计模式可以解决这个问题,如果你不熟悉这个设计模式,作为一个程序员希望你学习使用设计模式。如果需要观察者设计模式的具体代码我可以给你整理一下发给你。
这里就简单说明一下解决办法:
一、设计一个主题Subject,主题定义textbox变化事件,usercontrol和childwindow都作为观察者observer,当childwindows中的textbox变化时引起主题变化,在usercontrol中实现相应主题事件响应程序对应childwindows中textbox的变化,这样usercontrol可以动态地得到textbox的变化值。
二、另外可以在childwindow中设置一个属性(这里使用VB代码,因为我熟悉)
public readonly property ChildWindowTextBoxText as string
Get
Return textbox.text
End Get
Set(ByVal value As string)
textbox.text = value
End Set
end proerty
后者不能动态得到textbox的变化值。
[解决办法]
1. 定义全局静态变量,单击ChildWindow 的ok按钮时将值保存在全局变量中,然后在FormApplication中直接使用即可.
2. 注册FormChildWin的Closed事件,代码如下:
private void formtest_Click(object sender, RoutedEventArgs e) { FormChildWin formChildwin = new FormChildWin(); formChildwin.Show(); formChildwin.Closed += new EventHandler(formChildwin_Closed); } void formChildwin_Closed(object sender, EventArgs e) { string outputText = (sender as FormChildWin).kaisei.Text; }
[解决办法]
在你的Usercontrol 上不是有FormChildWin 的实例吗?
在FormChildWin 委托的close事件中你可以去取你的p_text 内容。
FormChildWin .Closed += new EventHandler(FormChildWin _Closed);
like this:
C# codeif (formChildwin .DialogResult == true)
{
string startdate = formChildwin.p_text;
}
[解决办法]
上面大家给出的解决方法都不错,如果需要更详细的解释可以参考这篇文章,有实例代码下载。
Silverlight子窗口(ChildWindow)传递参数到父窗口演示
http://www.silverlightchina.net/html/tips/2009/1125/261.html
[解决办法]
private void formtest_Click(object sender, RoutedEventArgs e) { FormChildWin formChildwin = new FormChildWin(); formChildwin.Show(); formChildwin.Closed+=new EventHandler(formChildwin_Closed);//注册关闭事件。 } void formChildwin_Closed(object sender, EventArgs e) { ChildWindow childWindow = sender as ChildWindow; if (childWindow!= null) { TextBox text= childWindow.FindName("myTextBox") as TextBox;//要TextBox在 ChildWindow里面的的x:Name属性来查找 if (text != null) { formtest.Content = text.Text; } } }