Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在两页wpf之间传递值_C#_Wpf - Fatal编程技术网

C# 在两页wpf之间传递值

C# 在两页wpf之间传递值,c#,wpf,C#,Wpf,我正在学习c#,有人请我用WPF做一个项目,我知道的不多。我们也在使用MUI。 我正在努力完成一项相当基本的任务。我有两个页面,分别是ClientRNG.xaml和ServerRNG.xaml。在ClientRNG.xaml中,我有两个按钮和两个文本字段,当按下每个按钮时,会生成一个随机数,并显示在文本框中。在ServerRNG中,只有一个按钮和一个文本字段,具有与上述相同的功能。 最后我将得到三个不同的随机数,一个在ServerRNG.xaml中,两个在ClientRNG中。 我要做的是将这些

我正在学习c#,有人请我用WPF做一个项目,我知道的不多。我们也在使用MUI。 我正在努力完成一项相当基本的任务。我有两个页面,分别是
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;