天天看點

WPF頁面和主視窗之間傳遞參數

從主視窗傳遞參數到頁面,直接寫頁面的字段就可以,而從頁面傳值回主視窗使用委托。

使用委托事件傳遞參數的好處是接收數值的頁面可以訂閱,這樣一些顔色改變或者資訊等自動處理了。

最關鍵的部分,傳遞界面先聲明委托,接收頁面(我這裡使用的是MainWindow)寫一個訂閱函數就可以了。

1 界面部分

1.1,主視窗,

1.1.1接收頁面參數:一個contentcontrol用于加載兩個頁面,并使用兩個button來切換頁面,一個label接收來自頁面的值;

1.1.2 傳值到頁面

兩個觸發傳值事件,一個textbox輸入值

下面時設計圖

WPF頁面和主視窗之間傳遞參數

主視窗的代碼

<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接收主視窗的值

WPF頁面和主視窗之間傳遞參數

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

WPF頁面和主視窗之間傳遞參數
WPF頁面和主視窗之間傳遞參數

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

效果

WPF頁面和主視窗之間傳遞參數
WPF頁面和主視窗之間傳遞參數

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

小結 示例傳遞了字元串,實際使用時也可以傳遞類和其他參數。