從主視窗傳遞參數到頁面,直接寫頁面的字段就可以,而從頁面傳值回主視窗使用委托。
使用委托事件傳遞參數的好處是接收數值的頁面可以訂閱,這樣一些顔色改變或者資訊等自動處理了。
最關鍵的部分,傳遞界面先聲明委托,接收頁面(我這裡使用的是MainWindow)寫一個訂閱函數就可以了。
1 界面部分
1.1,主視窗,
1.1.1接收頁面參數:一個contentcontrol用于加載兩個頁面,并使用兩個button來切換頁面,一個label接收來自頁面的值;
1.1.2 傳值到頁面
兩個觸發傳值事件,一個textbox輸入值
下面時設計圖
主視窗的代碼
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="400">
<Grid>
<ContentControl x:Name="cnt1" Content="ContentControl" HorizontalAlignment="Left" Margin="140,90,0,0" VerticalAlignment="Top" Width="200" Height="200" BorderThickness="1"/>
<Button x:Name="btn1" Content="加載頁1" HorizontalAlignment="Left" Margin="140,30,0,0" VerticalAlignment="Top" Width="85" Height="30" Click="btn1_Click" RenderTransformOrigin="1.235,-2.333"/>
<Button x:Name="btn2" Content="加載頁2" HorizontalAlignment="Left" Margin="255,30,0,0" VerticalAlignment="Top" Width="85" Height="30" Click="btn2_Click"/>
<Label x:Name="lblMain" Content="來自頁面的值" HorizontalAlignment="Left" Margin="35,195,0,0" VerticalAlignment="Top" Width="85" Height="30" />
<Button x:Name="btnTransPage1" Content="傳值給頁面1" HorizontalAlignment="Left" Margin="35,320,0,0" VerticalAlignment="Top" Width="100" Height="30" Click="btnTransPage1_Click" RenderTransformOrigin="1.235,-2.333" />
<Button x:Name="btnTransPage2" Content="傳值給頁面2" HorizontalAlignment="Left" Margin="35,370,0,0" VerticalAlignment="Top" Width="100" Height="30" Click="btnTransPage2_Click" RenderTransformOrigin="1.235,-2.333" />
<TextBox x:Name="tbMain2Page" HorizontalAlignment="Left" Margin="180,350,0,0" VerticalAlignment="Top" Width="80" Height="20" Text="TextBox" TextWrapping="Wrap" />
</Grid>
</Window>
1.2,建立兩個page,每個page有一個button和textbox,觸發傳值回首頁面,增加一個ltextblock接收主視窗的值
xaml語言兩個page及其相似,這裡就貼一個xaml
<Page x:Class="WpfApp1.Page1"
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:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
d:DesignHeight="200" d:DesignWidth="200"
Title="Page1">
<Grid >
<Button x:Name="btnPage1" Content="傳值給主視窗-1" HorizontalAlignment="Left" Margin="30,68,0,0" VerticalAlignment="Top" Width="95" Height="40" Click="btnPage1_Click" RenderTransformOrigin="0.526,0"/>
<TextBox x:Name="tb1" HorizontalAlignment="Left" Height="23" Margin="30,40,0,0" TextWrapping="Wrap" Text="Page1" VerticalAlignment="Top" Width="120"/>
<TextBlock x:Name="tbRecivePg" HorizontalAlignment="Left" Margin="30,160,0,0" TextWrapping="Wrap" Text="接收主視窗值" VerticalAlignment="Top" Width="120" Height="20"/>
</Grid>
</Page>
2,代碼部分
2.1,在page裡建立委托和按鈕事件,下面的代碼時page1的,page2類似
public partial class Page1 : Page
{
public Page1()
{
InitializeComponent();
}
public delegate void SentValue(string value); //聲明委托
public SentValue sentValue;
private void btnPage1_Click(object sender, RoutedEventArgs e)
{
sentValue(tb1.Text);
}
}
2.2,主視窗 MainWindow的代碼
2.2.1 執行個體化page
Page1 p1 = new Page1();
Page2 p2 = new Page2();
2.2.2 在MainWindow加載時訂閱委托函數
public MainWindow()
{
InitializeComponent();
//構造函數裡加載訂閱委托函數
p1.sentValue = GetValueFormPage;
p2.sentValue = GetValueFormPage;
}
2.2.3 将訂閱值賦給label
public void GetValueFormPage(string value)
{//訂閱函數-> 将頁面的值賦給主視窗的label
lblMain.Content = value;
}
2.3 效果
3,主視窗傳給page,直接指派
private void btnTransPage1_Click(object sender, RoutedEventArgs e)
{
p1.tbRecivePg.Text = tbMain2Page.Text;
}
private void btnTransPage2_Click(object sender, RoutedEventArgs e)
{
p2.tbRecivePg.Text = tbMain2Page.Text;
}
效果
4.1 主視窗代碼
namespace WpfApp1
{
/// <summary>
/// MainWindow.xaml 的互動邏輯
/// </summary>
public partial class MainWindow : Window
{
Page1 p1 = new Page1();
Page2 p2 = new Page2();
public MainWindow()
{
InitializeComponent();
//構造函數裡加載訂閱委托函數
p1.sentValue = GetValueFormPage;
p2.sentValue = GetValueFormPage;
}
public void GetValueFormPage(string value)
{//訂閱函數-> 将頁面的值賦給主視窗的label
lblMain.Content = value;
}
#region 從主視窗到界面直接寫頁面的字段
private void btnTransPage1_Click(object sender, RoutedEventArgs e)
{
p1.tbRecivePg.Text = tbMain2Page.Text;
}
private void btnTransPage2_Click(object sender, RoutedEventArgs e)
{
p2.tbRecivePg.Text = tbMain2Page.Text;
}
#endregion
/// <summary>
/// 加載頁面1
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn1_Click(object sender, RoutedEventArgs e)
{
if (p1 == null)
{
p1 = new Page1();
}
cnt1.Content = new Frame()
{
Content = p1
};
}
/// <summary>
/// 加載頁面2
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn2_Click(object sender, RoutedEventArgs e)
{
if (p2 == null)
{
p2 = new Page2();
}
cnt1.Content = new Frame()
{
Content = p2
};
}
}
}
4.2 page代碼
namespace WpfApp1
{
/// <summary>
/// Page1.xaml 的互動邏輯
/// </summary>
public partial class Page1 : Page
{
public Page1()
{
InitializeComponent();
}
public delegate void SentValue(string value); //聲明委托
public SentValue sentValue;
private void btnPage1_Click(object sender, RoutedEventArgs e)
{
sentValue(tb1.Text);
}
}
}
小結 示例傳遞了字元串,實際使用時也可以傳遞類和其他參數。