C# 在两页wpf之间传递值
我正在学习c#,有人请我用WPF做一个项目,我知道的不多。我们也在使用MUI。 我正在努力完成一项相当基本的任务。我有两个页面,分别是C# 在两页wpf之间传递值,c#,wpf,C#,Wpf,我正在学习c#,有人请我用WPF做一个项目,我知道的不多。我们也在使用MUI。 我正在努力完成一项相当基本的任务。我有两个页面,分别是ClientRNG.xaml和ServerRNG.xaml。在ClientRNG.xaml中,我有两个按钮和两个文本字段,当按下每个按钮时,会生成一个随机数,并显示在文本框中。在ServerRNG中,只有一个按钮和一个文本字段,具有与上述相同的功能。 最后我将得到三个不同的随机数,一个在ServerRNG.xaml中,两个在ClientRNG中。 我要做的是将这些
ClientRNG.xaml
和ServerRNG.xaml
。在ClientRNG.xaml
中,我有两个按钮和两个文本字段,当按下每个按钮时,会生成一个随机数,并显示在文本框中。在ServerRNG
中,只有一个按钮和一个文本字段,具有与上述相同的功能。
最后我将得到三个不同的随机数,一个在ServerRNG.xaml
中,两个在ClientRNG
中。
我要做的是将这些随机数传递到另一个名为SSL.xaml
的页面
这些页面是在MainWindow.xml
中创建的:
<mui:ModernWindow.MenuLinkGroups>
<mui:LinkGroup DisplayName="network security">
<mui:LinkGroup.Links>
<mui:Link DisplayName="Home" Source="/Pages/Home.xaml" />
<mui:Link DisplayName="RNG" Source="/Pages/ClientRNG.xaml" />
<mui:Link DisplayName="3DES" Source="/Pages/3des.xaml" />
<mui:Link DisplayName="RSA" Source="/Pages/RSA.xaml" />
<mui:Link DisplayName="SHA-1" Source="/Pages/sha1.xaml" />
<mui:Link DisplayName="PKI Certificates" Source="/Pages/pki.xaml" />
<mui:Link DisplayName="SSL" Source="/Pages/SSL.xaml" />
</mui:LinkGroup.Links>
</mui:LinkGroup>
<mui:LinkGroup DisplayName="settings" GroupName="settings">
<mui:LinkGroup.Links>
<mui:Link DisplayName="software" Source="/Pages/Settings.xaml" />
</mui:LinkGroup.Links>
</mui:LinkGroup>
</mui:ModernWindow.MenuLinkGroups>
<mui:ModernWindow.TitleLinks>
<mui:Link DisplayName="settings" Source="/Pages/Settings.xaml" />
</mui:ModernWindow.TitleLinks>
}
以下是xaml:
“拆分页面1”
<UserControl x:Class="NetworkSecuritySSLTest.Pages.SplitPage1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mui="http://firstfloorsoftware.com/ModernUI"
mc:Ignorable="d"
d:DesignWidth="766.507" Height="535">
<Grid Style="{StaticResource ContentRoot}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="6"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ScrollViewer>
<StackPanel>
<TextBlock Text="CLIENT" Style="{StaticResource Heading2}" />
<TextBlock x:Name="hello" Text="Hello Server. This is my Random Number and my Security Capabilities:" FontSize="12" FontStyle="Italic" Margin="0,10,0,0" UseLayoutRounding="False" TextWrapping="Wrap" />
<TextBlock x:Name="helloCont" Text="" FontSize="12" FontStyle="Italic" Margin="0,0,0,0" />
<TextBox x:Name ="r1SSLBox" HorizontalAlignment="Left" Height="57" Margin="10,88,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" RenderTransformOrigin="0.498,0.404"/>
<TextBox x:Name ="r2SSLBox" HorizontalAlignment="Left" Height="57" Margin="10,88,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" RenderTransformOrigin="0.498,0.404"/>
<TextBlock x:Name="VerifyDC" Text="I need to verify your Digital Certificate:" FontSize="12" FontStyle="Italic" Margin="0,10,0,0" />
<TextBlock x:Name="VerifyCont" Text="" FontSize="12" FontStyle="Italic" />
<TextBlock x:Name="MSK" Text="My Master Key is:" FontSize="12" FontStyle="Italic" Margin="0,10,0,0" />
<TextBlock x:Name="MSKCont" Text="" FontSize="12" FontStyle="Italic" />
</StackPanel>
</ScrollViewer>
<GridSplitter Grid.Column="1" />
<ScrollViewer Grid.Column="2 " Margin="{StaticResource SplitRight}">
<StackPanel>
<TextBlock Text="SERVER" Style="{StaticResource Heading2}" />
<TextBlock Text="Content goes here" />
</StackPanel>
</ScrollViewer>
<GridSplitter Grid.ColumnSpan="3" HorizontalAlignment="Left" Margin="0,23,0,0" VerticalAlignment="Top" Width="735"/>
<Button Content="Man-In-The-Middle-Attack" HorizontalAlignment="Left" VerticalAlignment="Top" Width="209" RenderTransformOrigin="0.055,0.397" Height="40" Margin="255,451,0,0" Grid.ColumnSpan="3" />
</Grid>
现在我正试图使用Omribitan发布的解决方案,但根据您在评论部分所说的,
SplitPage1
已经显示出来,我仍在努力
您在代码中所做的是创建SplitPage1
的新实例并将数据传递给它
SplitPage1 sp = new SplitPage1(); // This is a new page, not the one currently shown in your application
sp.Setr1SSLBox(number); // it should set the text box in SSL page
因此,如果要设置当前显示的SplitPage1
的文本,需要获取其引用。很难说怎么做,因为我看不到您的全部代码,但我会考虑这样做:
SplitPage1
的当前实例SplitPage1
的引用,供您以后使用,例如:
public partial class ServerRNG : UserControl
{
private SplitPage1 sp;
public ServerRNG(SplitPage1 splitPage) : this()
{
sp = splitPage; // Save a reference to the currently displayed `SplitPage1` page
}
public ServerRNG()
{
InitializeComponent();
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
Random r = new Random(2);
int number = r.Next(0, 100);
r2Out.Text = number.ToString();
sp.Setr1SSLBox(number); // Set the correct instance's text
}
}
public class SharingManager
{
// Define a global static event to be fired when the value is changing
public static event EventHandler<NumericEventArgs> ValueChanged;
public static int GlobalValue
{
set
{
// Fire ValueChanged event
if (ValueChanged != null)
ValueChanged(null, new NumericEventArgs(value));
}
}
}
public class NumericEventArgs : EventArgs
{
public NumericEventArgs(int value)
{
Value = value;
}
public int Value { get; set; }
}
在按钮中单击服务器nrg
上的\u 1
,更新值以触发事件
Random r = new Random(2);
int number = r.Next(0, 100);
r2Out.Text = number.ToString();
SharingManager.GlobalValue = number;
希望这对您有所帮助根据您在评论部分所说的,
SplitPage1
已经显示出来
您在代码中所做的是创建SplitPage1
的新实例并将数据传递给它
SplitPage1 sp = new SplitPage1(); // This is a new page, not the one currently shown in your application
sp.Setr1SSLBox(number); // it should set the text box in SSL page
因此,如果要设置当前显示的SplitPage1
的文本,需要获取其引用。很难说怎么做,因为我看不到您的全部代码,但我会考虑这样做:
SplitPage1
的当前实例SplitPage1
的引用,供您以后使用,例如:
public partial class ServerRNG : UserControl
{
private SplitPage1 sp;
public ServerRNG(SplitPage1 splitPage) : this()
{
sp = splitPage; // Save a reference to the currently displayed `SplitPage1` page
}
public ServerRNG()
{
InitializeComponent();
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
Random r = new Random(2);
int number = r.Next(0, 100);
r2Out.Text = number.ToString();
sp.Setr1SSLBox(number); // Set the correct instance's text
}
}
public class SharingManager
{
// Define a global static event to be fired when the value is changing
public static event EventHandler<NumericEventArgs> ValueChanged;
public static int GlobalValue
{
set
{
// Fire ValueChanged event
if (ValueChanged != null)
ValueChanged(null, new NumericEventArgs(value));
}
}
}
public class NumericEventArgs : EventArgs
{
public NumericEventArgs(int value)
{
Value = value;
}
public int Value { get; set; }
}
在按钮中单击服务器nrg
上的\u 1
,更新值以触发事件
Random r = new Random(2);
int number = r.Next(0, 100);
r2Out.Text = number.ToString();
SharingManager.GlobalValue = number;
希望这有帮助您应该使用MVVM设计模式处理WPF。 没有MVVM框架有点烦人 我建议你使用 使用本教程开始学习 它还解释了如何使用中介模式(使用caliburn micros事件聚合器)在不同窗口之间传递值/命令
您应该使用MVVM设计模式处理WPF。 没有MVVM框架有点烦人 我建议你使用 使用本教程开始学习 它还解释了如何使用中介模式(使用caliburn micros事件聚合器)在不同窗口之间传递值/命令
您如何显示
SplitPage1
?在您发布的代码中,您只是在实例化它……您将必须共享xaml以告知两个usercontrol之间的关系。他们是兄弟姐妹还是有亲子关系?@nit他们是兄弟姐妹,很抱歉,我没有为别人编写xaml代码it@Omribitansplitpage1是在beginning@nit我添加了两个XAML,您如何显示SplitPage1
?在您发布的代码中,您只是在实例化它……您将必须共享xaml以告知两个usercontrol之间的关系。他们是兄弟姐妹还是有亲子关系?@nit他们是兄弟姐妹,很抱歉,我没有为别人编写xaml代码it@Omribitansplitpage1是在beginning@nit我补充说这两个xamlI以前有类似的解决方案,但是我的和你的都出现了这样的错误:“对象引用未设置为对象的实例”. 它指的是sp
变量。。。我必须打电话到某个地方吗?我忘了提到我们正在使用mui
。。。我不知道这是否有助于链接到splitPage1@lucaConfa当然可以,就像我说的,如果有第三方创建此类,它必须使用ServerRNG(SplitPage1 splitPage)
构造函数而不是默认构造函数来创建ServerRNG
。好的,谢谢。看来我找不到第三方了。也许我不能很好地解释我的问题,sorry@lucaConfa根据您的评论,xaml似乎正在创建这个类。我用第三个通用解决方案更新了我的答案,这个解决方案应该可以解决你的问题。我以前也有类似的解决方案,但是我的和你的都出现了这样的错误:“对象引用未设置为对象的实例”。它指的是sp
变量。。。我必须打电话到某个地方吗?我忘了提到我们正在使用mui
。。。我不知道这是否有助于链接到splitPage1@lucaConfa当然可以,就像我说的,如果有第三方创建此类,它必须使用ServerRNG(SplitPage1 splitPage)
构造函数而不是默认构造函数来创建ServerRNG
。好的,谢谢。看来我找不到第三方了。M
public SplitPage1()
{
InitializeComponent();
SharingManager.ValueChanged += UpdateTextBox;
}
public void UpdateTextBox(object sender, NumericEventArgs e)
{
r1SSLBox.Text = e.Value.ToString(); // Update textBox
}
Random r = new Random(2);
int number = r.Next(0, 100);
r2Out.Text = number.ToString();
SharingManager.GlobalValue = number;