在我的程序中,我同时打开了两个窗口,一个是 WPF 表单,另一个是 WinForms 表单。
我需要通过单击 WinForms 表单上的按钮来更改 WPF 表单上的标签背景颜色。
我该怎么做?
您可以设置一个在表单中的控件被按下EventHandler
时发布事件通知。这将由您监控以检测何时触发,然后请求将您设置为所需的设置。Button
WinForms
event
WPF
Window/UserControl
event
color
WPF
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
) 的一部分发送。
我确信有很多方法可以实现这一目标。一些更小更模糊,一些更冗长但更清晰。
就像您可以通过 win32 api 执行某些操作,通过内存映射文件进行通信或使用某种形式的通信传输(如 NamedPipes 或 MSMQ)。
您可以查看其中一些资源以获取想法:
祝你好运!:)
假设 Winform 对象在 WPF 表单中可用并且 Button1 是公共的,您需要在 WPF 表单中添加类似于下面的代码。
WinForm.Button1.Click += new System.EventHandler(Button1_Click);
private void Button1_Click(object sender, EventArgs e)
{
// Change label background
}