-1

在我的程序中,我同时打开了两个窗口,一个是 WPF 表单,另一个是 WinForms 表单。

我需要通过单击 WinForms 表单上的按钮来更改 WPF 表单上的标签背景颜色。

我该怎么做?

4

3 回答 3

1

您可以设置一个在表单中的控件被按下EventHandler时发布事件通知。这将由您监控以检测何时触发,然后请求将您设置为所需的设置。ButtonWinFormseventWPF Window/UserControleventcolorWPF Label

主窗口.xaml

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        DataContext="{Binding RelativeSource={RelativeSource Self}}"
        Title="MainWindow" Height="150" Width="225">
    <Grid>
        <Label Content="Label" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Height="100" Width="197" Background="{Binding LabelBgColour}"/>
    </Grid>
</Window>

主窗口.xaml.cs

namespace WpfApplication1
{
    using System.Windows;
    using System.ComponentModel;
    using System.Windows.Media;

    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        public MainWindow()
        {
            InitializeComponent();
            var f = new Form1();
            f.ChangedColourEventHandler += TriggeredChangedColourEventHandler;
            f.Show();
        }

        private Brush labelBgColour;
        public Brush LabelBgColour
        {
            get
            {
                return this.labelBgColour;
            }
            set
            {
                this.labelBgColour = value;
                OnPropertyChanged();
            }
        }

        private void TriggeredChangedColourEventHandler(object sender, Brush color)
        {
            this.LabelBgColour = color;
        }

        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(string propertyName = null)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

Form1.cs

namespace WpfApplication1
{
    using System;
    using System.Windows.Forms;
    using System.Windows.Media;

    public partial class Form1 : Form
    {
        public EventHandler<Brush> ChangedColourEventHandler;

        public Form1()
        {
            InitializeComponent();
        }

        private Brush bgColour;
        private Brush BgColour
        {
            get
            {
                return this.bgColour;
            }
            set
            {
                this.bgColour = value;
                TriggerChangedColourEventHandler(value);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.BgColour = (Brush)new BrushConverter().ConvertFromString("#FF00B25A");
        }

        private void TriggerChangedColourEventHandler(Brush color)
        {
            var handler = ChangedColourEventHandler;
            if (handler != null)
            {
                handler(this, color);
            }
        }
    }
}

Form1有一个Button名为的控件button1(可以从示例 cs 中确定)。为简洁起见,我省略了Form1.Design.cs

此示例使WPF窗口转到 以WinForm获取所需的Color值。它可以很容易地进行调整,以便将Color值作为EventHandler事件 ( EventArgs) 的一部分发送。

于 2013-10-09T20:43:18.293 回答
0

我确信有很多方法可以实现这一目标。一些更小更模糊,一些更冗长但更清晰。

就像您可以通过 win32 api 执行某些操作,通过内存映射文件进行通信或使用某种形式的通信传输(如 NamedPipes 或 MSMQ)。

您可以查看其中一些资源以获取想法:

祝你好运!:)

于 2013-10-09T19:30:56.550 回答
0

假设 Winform 对象在 WPF 表单中可用并且 Button1 是公共的,您需要在 WPF 表单中添加类似于下面的代码。

WinForm.Button1.Click += new System.EventHandler(Button1_Click);

private void Button1_Click(object sender, EventArgs e)
{
// Change label background
}
于 2013-10-09T19:36:26.027 回答