2013-10-20 41 views
1

我正在学习c#,并且我被要求使用WPF进行项目工作,但我不太清楚。我们也使用MUI。 我正在尝试实现一个非常基本的任务。我有两页叫ClientRNG.xamlServerRNG.xaml。在ClientRNG.xaml我有两个按钮和两个文本框,当每个按钮被按下时,一个随机数字被生成并出现在一个文本框中。在ServerRNG中只有一个按钮和一个文本框,具有与上述相同的功能。 所以我最终会得到三个不同的随机数,一个在ServerRNG.xaml和两个在ClientRNG。 我想要做的是将这些随机数字传递到另一个页面,称为SSL.xaml传递两个页面之间的值wpf

的页面在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> 

守则ClientRNG:

namespace NetworkSecuritySSLTest.Pages 
{ 
/// <summary> 
/// Interaction logic for RNG.xaml 
/// </summary> 
public partial class ClientRNG : UserControl 
{ 
    public ClientRNG() 
    { 
     InitializeComponent(); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     Random r = new Random(1); 
     int number = r.Next(0, 100); 
     r1Out.Text = number.ToString(); 
     SharingManager.GlobalValue = number; 
    } 

    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     Random r = new Random(3); 
     int number = r.Next(0, 100); 
     pmsOutC.Text = number.ToString(); 
    } 

这里是我在ServerRNG代码:

namespace NetworkSecuritySSLTest.Pages 
{ 
/// <summary> 
/// Interaction logic for RNG.xaml 
/// </summary> 
public partial class ServerRNG : UserControl 
{ 

    private SplitPage1 sp; 



    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(); 
     SharingManager.GlobalValue = number; 
    } 
} 

}

,这是背后SSL类的代码

namespace NetworkSecuritySSLTest.Pages 
{ 
/// <summary> 
/// Interaction logic for SplitPage1.xaml 
/// </summary> 
public partial class SplitPage1 : UserControl 
{ 
    private int r1FromClient; 
    public SplitPage1() 
    { 
     InitializeComponent(); 
     SharingManager.ValueChanged += UpdateTextBox1; 
     SharingManager.ValueChanged += UpdateTextBox2; 

    } 

    public void UpdateTextBox1(object sender, NumericEventArgs e) 
    { 
     r1SSLBox.Text = e.Value.ToString(); // Update textBox 
    } 

    public void UpdateTextBox2(object sender, NumericEventArgs e) 
    { 
     r2SSLBox.Text = e.Value.ToString(); // Update textBox 
    } 

} 

} 这里是XAML: 'SplitPage1'

<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> 

ClientRNG

<UserControl x:Class="NetworkSecuritySSLTest.Pages.ClientRNG" 
     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"> 
<Viewbox Stretch="None"> 
    <Grid Style="{StaticResource ContentRoot}" Height="301" Margin="0" Width="435"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition/> 
      <ColumnDefinition Width="0*"/> 
     </Grid.ColumnDefinitions> 

     <!-- TODO: set @SelectedSource --> 

     <mui:ModernTab Layout="Tab" Margin="0,52,0,0"> 
      <mui:ModernTab.Links> 
       <!-- TODO: set @Source --> 
       <mui:Link DisplayName="Client" /> 
       <mui:Link DisplayName="Server" Source="/Pages/ServerRNG.xaml" /> 
      </mui:ModernTab.Links> 
     </mui:ModernTab> 

     <Button Content="GENERATE R# 1" HorizontalAlignment="Left" VerticalAlignment="Top" Width="120" RenderTransformOrigin="0.055,0.397" Height="26" Margin="10,52,0,0" FontSize="11" Click="Button_Click" /> 
     <TextBox Name ="r1Out" HorizontalAlignment="Left" Height="57" Margin="10,88,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" RenderTransformOrigin="0.498,0.404"/> 

     <Button Content="GENERATE MS" HorizontalAlignment="Left" VerticalAlignment="Top" Width="119" RenderTransformOrigin="0.055,0.397" Height="26" Margin="306,52,0,0" Click="Button_Click_2" /> 
     <TextBox Name ="msOutC" HorizontalAlignment="Left" Height="57" Margin="306,88,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="119" RenderTransformOrigin="0.498,0.404"/> 

     <Button Content="GENERATE PMS" HorizontalAlignment="Left" VerticalAlignment="Top" Width="133" RenderTransformOrigin="0.055,0.397" Height="26" Margin="151,52,0,0" Click="Button_Click_1" /> 
     <TextBox Name ="pmsOutC" HorizontalAlignment="Left" Height="57" Margin="151,88,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="133" RenderTransformOrigin="0.498,0.404"/> 


     <Label Content="Random Number Generator" HorizontalAlignment="Left" Height="19" Margin="10,10,0,0" VerticalAlignment="Top" Width="415" FontWeight="Bold"/> 


    </Grid> 

</Viewbox> 

ServerRNG

<UserControl x:Class="NetworkSecuritySSLTest.Pages.ServerRNG" 
     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"> 
<Viewbox Stretch="None"> 
    <Grid Style="{StaticResource ContentRoot}" Height="301" Margin="0" Width="435"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition/> 
      <ColumnDefinition Width="0*"/> 
     </Grid.ColumnDefinitions> 

     <!-- TODO: set @SelectedSource --> 

     <mui:ModernTab Layout="Tab" Margin="0,52,0,0"> 
      <mui:ModernTab.Links> 
       <!-- TODO: set @Source --> 
       <mui:Link DisplayName="Client" Source="/Pages/ClientRNG.xaml" /> 
       <mui:Link DisplayName="Server" /> 
      </mui:ModernTab.Links> 
     </mui:ModernTab> 

     <Button Name ="r2but" Content="GENERATE R# 2" HorizontalAlignment="Left" VerticalAlignment="Top" Width="120" RenderTransformOrigin="0.055,0.397" Height="26" Margin="76,52,0,0" FontSize="11" Click="Button_Click_1" /> 
     <TextBox Name ="r2Out" HorizontalAlignment="Left" Height="57" Margin="76,88,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" RenderTransformOrigin="0.498,0.404"/> 

     <Button Content="GENERATE MS" HorizontalAlignment="Left" VerticalAlignment="Top" Width="119" RenderTransformOrigin="0.055,0.397" Height="26" Margin="249,52,0,0" /> 
     <TextBox Name ="msOutS" HorizontalAlignment="Left" Height="57" Margin="249,88,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="119" RenderTransformOrigin="0.498,0.404"/> 


     <Label Content="Random Number Generator" HorizontalAlignment="Left" Height="19" Margin="10,10,0,0" VerticalAlignment="Top" Width="415" FontWeight="Bold"/> 


    </Grid> 

</Viewbox> 

现在我试图用张贴Omribitan的解决方案,但我仍然在努力

+0

你是如何显示**'SplitPage1'?在你发布的代码中,你只是在实例化它... –

+0

你将不得不分享xaml来告诉两个用户控件之间的关系。他们是兄弟姐妹还是有亲子关系? – Nitin

+0

@nit他们是兄弟姐妹,对不起,我没有编码的xaml别人做了它 – mikey

回答

1

根据你在说已经显示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文本,你需要得到它是参考。这很难说,因为怎么也看不出你的整个代码,但是这是我会考虑:

  1. 使用IoC container解决的SplitPage1当前实例。
  2. 根据你的代码好像有一个第三方创建这些页面。如果这是真的,它可以通过ServerRNGSplitPage1它的创建,你就可以在以后使用,例如参考:

    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 
        } 
    } 
    
  3. 创建一个类将公开一个静态属性和事件,将触发当属性更改:

    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; } 
    } 
    

SplitPage1

public SplitPage1() 
    { 
     InitializeComponent(); 
     SharingManager.ValueChanged += UpdateTextBox; 

    } 

public void UpdateTextBox(object sender, NumericEventArgs e) 
{ 
    r1SSLBox.Text = e.Value.ToString(); // Update textBox 
} 
注册一个处理程序

Button_Click_1ServerNRG,更新值触发事件

Random r = new Random(2); 
    int number = r.Next(0, 100); 
    r2Out.Text = number.ToString(); 
    SharingManager.GlobalValue = number; 

希望这有助于

+0

我之前有类似的解决方案,但是我的和你的都得到这个错误:“对象引用没有设置为对象的一个​​实例”。它指的是'sp'变量...我必须在某处调用ServerRNG(SplitPage1 splitPage)吗? – mikey

+0

我忘记提及我们正在使用'mui' ...我不知道这是否有帮助是导致splitPage1 – mikey

+0

@lucaConfa是的,当然,就像我说的,如果有第三方创建这个类,它将不得不使用ServerRNG(SplitPage1 splitPage)构造函数来创建'ServerRNG',而不是它的默认构造函数。 –

0

你应该WPF使用MVVM设计模式的工作原理。 它有点儿讨厌不MVVM框架 我建议你使用http://caliburnmicro.codeplex.com/

使用本教程上手

http://www.mindscapehq.com/blog/index.php/2012/01/12/caliburn-micro-part-1-getting-started/

这也解释了如何使用调解模式(使用卡利万分之一事件aggerator)至在不同的窗口之间传递值/命令。

http://www.mindscapehq.com/blog/index.php/2012/2/1/caliburn-micro-part-4-the-event-aggregator/