簡體   English   中英

在Mainwindows內部的兩個UserControl之間傳輸數據

[英]Transfer data Between two Usercontrol inside of Mainwindows

目標:
位於文本框(usercontrol_menu.xaml)內的輸入數據應進行傳輸,然后使用並顯示在usercontrol_number1.xaml內的標簽中。 當您按下usercontrol_menu.xaml中的“輸入”按鈕或單擊“發送”按鈕時,將執行輸入數據的傳輸。

問題:
為了實現目標,您是否在我的源代碼上結合了具體示例?

信息:
-MainWindows.xaml位於單獨的項目中。

在此處輸入圖片說明

在此處輸入圖片說明

XAML

-- MainWindow.xaml

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:usercontrol_menu="clr-namespace:usercontrol_menu;assembly=usercontrol_menu" xmlns:usercontrol_number1="clr-namespace:usercontrol_number1;assembly=usercontrol_number1" x:Class="MainWindows.MainWindow"
        Title="MainWindow" Height="350" Width="525">
    <Grid>

        <usercontrol_menu:UserControl1 HorizontalAlignment="Left" VerticalAlignment="Top" Height="124" Width="434" Margin="24,28,0,0"/>
        <usercontrol_number1:UserControl1 HorizontalAlignment="Left" Margin="24,176,0,0" VerticalAlignment="Top" Height="115" Width="434"/>

    </Grid>
</Window>



-- usercontrol_menu         UserControl1.xaml

<UserControl x:Class="usercontrol_menu.UserControl1"
             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" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid Background="#FFF3CBCB">
        <Button x:Name="btn_send" Content="Send" HorizontalAlignment="Left" Margin="99,100,0,0" VerticalAlignment="Top" Width="75"/>
        <TextBox x:Name="txt_input" HorizontalAlignment="Left" Height="23" Margin="54,57,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="120"/>
    </Grid>
</UserControl>



-- usercontrol_number1         UserControl1.xaml

<UserControl x:Class="usercontrol_number1.UserControl1"
             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" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid Background="#FFFF9D9D">
        <Label x:Name="lbl_text" Content="Text" HorizontalAlignment="Left" Margin="31,44,0,0" VerticalAlignment="Top"/>
    </Grid>
</UserControl>

下面的C#代碼:

  namespace MainWindows
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void test()
        {
            usercontrol_menu.UserControl1 aaa = new usercontrol_menu.UserControl1();
            usercontrol_number1.UserControl1 bbb = new usercontrol_number1.UserControl1();

            aaa.OnParameterChange += bbb.OnUserControl1ParameterChange;  


        }



    }
}

----------------

namespace usercontrol_menu
{
    /// <summary>
    /// Interaction logic for UserControl1.xaml
    /// </summary>
    public partial class UserControl1 : UserControl
    {

        public UserControl1()
        {
            InitializeComponent();
        }

        public delegate void ParameterChange(string Parameter);
        public ParameterChange OnParameterChange { get; set; }


        private void btn_send_Click(object sender, RoutedEventArgs e)
        {
            ParameterChange myParameterChange = new ParameterChange(OnParameterChange);

            OnParameterChange("test");
        }



    }


}

-----------------

namespace usercontrol_number1
{
    /// <summary>
    /// Interaction logic for UserControl1.xaml
    /// </summary>
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }

        public void OnUserControl1ParameterChange(string pData)
        {
            lbl_text.Content = pData;
        }
    }
}

因為您的問題與其他視圖模型中的“ 如何在主視圖模型中調用函數”不完全一樣 問題,我沒有將其作為重復項關閉。 但是,我相信您對這個問題的答案就在於我對鏈接問題的回答,以及它所鏈接的問題,即使用delegate s

這些問題的不同之處在於,它們使用的是視圖模型,而似乎您將在后面使用代碼。 無論哪種方式,它都沒有什么區別,因為只要您有一個公共的父代,就可以在代碼中以相同的方式使用delegate MainWindow.xaml.cs可能是您的共同父母。


更新>>>

您提供的鏈接不符合我的目的。 就我而言,它位於mainwindows.xaml內部的兩個用戶控件之間

這正是我提到的。 定義你的delegateusercontrol_menu.xaml.cs文件和處理程序usercontrol_number1.xaml.cs文件,並將它們連接在MainWindow.xaml.cs 從另一個鏈接的問題( 在viewmodels之間傳遞參數 )擴展我的示例,您可以執行以下操作:

MainWindow.xaml.cs

usercontrol_menu.ParameterChange += usercontrol_number1.OnUserControl1ParameterChange;

再次閱讀鏈接的答案和MSDN上的鏈接頁面,您將獲得它。

使用棱鏡的EventAggregator。 這里給出一個很好的解釋。 只需下載示例並運行。 正是您所期望的。

1.下載並安裝所有用戶控件的軟件包。 https://www.nuget.org/packages/MvvmLight/

2.定義所有用戶控件都可以訪問的消息類。 它將位於解決方案內部的位置無關緊要

public class MyMessage
{
   public string Text { get; set; }
}

3.在usercontrol_menu中,創建此類的實例,並將其傳遞給用戶控件中Messenger的Send方法:

using GalaSoft.MvvmLight.Messaging;
...
private void btn_send_Click(object sender, RoutedEventArgs e)
{
    var msg = new MyMessage2() { Text = txt_input.Text };
    Messenger.Default.Send<MyMessage2>(msg);
}

4.在usercontrol_number1的構造函數中注冊給定消息類型:

Messenger.Default.Register<MyMessage>
( 
     this, 
     ( action ) => { lbl_text.Content = action.Text; }
);

為了使用Messenger,您需要在每個項目中都有一個對它的引用,並在每個類中需要一個Using。

Messenger的工作方式是發布者/發送者創建特定類型的消息(如該類中的)。 接收者訂閱該類型的消息。 因此,(對象的)類型定義了消息是什么。 並且當然也可以包含數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM