如何显示WPF窗口(UserControl(WPF))后按下按钮在WindowsForms?

x6492ojm  于 11个月前  发布在  Windows
关注(0)|答案(1)|浏览(129)

在我的项目中,我有:

Form1.cs

using System;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        Form2 Form2 = new Form2();

        public Form1()
        {
            InitializeComponent();
            Form2.Show();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var random = new Random();
            string number = random.Next(-10,10).ToString();
            textBox1.Text = number;
            Form2.InsertText(number);
        }
    }
}

字符串

Form2.cs

using System.Windows.Forms;
using System.Windows.Forms.Integration;

namespace WindowsFormsApp1
{
    public partial class Form2 : Form
    {
        UserControlWPFVM UserControlWPFVM = new UserControlWPFVM();
        ElementHost host = new ElementHost();
        public Form2()
        {
            InitializeComponent();

            UserControlWPF userControlWPF=new UserControlWPF();
            host.Dock = DockStyle.Fill;
            host.Child = userControlWPF;
            this.Controls.Add(host);
        }
        public void InsertText(string text)
        {
            UserControlWPFVM.InsertText(text);
            host.Update();
        }
    }
}

UserControlWPF.xaml

<UserControl x:Class="WindowsFormsApp1.UserControlWPF"
             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:WindowsFormsApp1"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <TextBox Text="{Binding Text1,UpdateSourceTrigger=PropertyChanged}" />
    </Grid>
</UserControl>

UserControlWPF.xaml.cs

using System.Windows.Controls;

namespace WindowsFormsApp1
{
    public partial class UserControlWPF : UserControl
    {
        public UserControlWPFVM UserControlWPFVM { get; set; }
        public UserControlWPF()
        {
            UserControlWPFVM = new UserControlWPFVM();
            InitializeComponent();
            DataContext = UserControlWPFVM;
        }
    }
}

UserControlWPFVM.cs

using Prism.Mvvm;

namespace WindowsFormsApp1
{
    public class UserControlWPFVM : BindableBase
    {
        
        private string text1 = "333";
        public string Text1
        {
            get { return text1; }
            set { SetProperty(ref text1, value); }
        }

        public void InsertText(string text)
        {
            Text1 = text;
        }
    }
}


按下Form1中的按钮后,将生成随机数,并应插入UserControl(WPF)中的TextBox中。UserControlWPFVM.cs中的属性Text1已更新,但我看不到UserControl中TextBox的任何更改。

vsdwdz23

vsdwdz231#

当我试图重现你的示例时,唯一缺少的似乎是将userControlWPF的DataContext设置为Model。


的数据

public partial class Form2 : Form
{
    public Form2() => InitializeComponent();

    UserControlWPFVM Model = new UserControlWPFVM();
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        // Try setting the DataContext
        UserControlWPF userControlWPF = new UserControlWPF { DataContext = Model };

        ElementHost host = new ElementHost { Child = userControlWPF};
        host.Dock = DockStyle.Fill;
        host.Child = userControlWPF;
        host.BackColor = Color.Azure;
        host.Font = new Font(Font.FontFamily, 18);
        Controls.Add(host);
    }
    internal void InsertText(object o)
    {
        Model.InsertText(o.ToString() ?? string.Empty);
    }
    protected override void OnFormClosing(FormClosingEventArgs e)
    {
        base.OnFormClosing(e);
        switch (e.CloseReason)
        {
            case CloseReason.UserClosing:
                e.Cancel = true;
                Hide();
                break;
        }
    }
}

字符串
其中,出于测试目的:

<UserControl x:Class="winforms_plus_wpf.UserControlWPF"
             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:winforms_plus_wpf"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <TextBox 
            Text="{Binding Text1}" 
            TextAlignment="Center"
            Padding="25,5"
            Width="80"
            HorizontalAlignment="Center"
            VerticalAlignment="Center"/>
    </Grid>
</UserControl>

相关问题