获取非主窗口WPF的窗口

本文关键字:窗口 WPF 获取 | 更新日期: 2023-09-27 18:24:10

我想从WPF应用程序中不是MainWindow的窗口的代码绑定中调用该方法,并在执行时转换窗口类型。

ClientCallBack.cs:

using ChattingInterfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace ChatClient
{
    [CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
    public class ClientCallback : IClient
    {
        public void GetMessage(string message, string userName)
        {
            //get casted instance of chat client window (NOT MainWindow!)
        }
    }
}

ChatWPFClient.xaml.cs:

using ChattingInterfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace ChatClient
{
    /// <summary>
    /// Interaction logic for ChatWPFClient.xaml
    /// </summary>
    public partial class ChatWPFClient : Window
    {
        public static IChattingService Server;
        private static DuplexChannelFactory<IChattingService> _channelFactory;
        public ChatWPFClient()
        {
            InitializeComponent();
            _channelFactory = new DuplexChannelFactory<IChattingService>(new ClientCallback(), "ChattingServiceEndpoint");
            Server = _channelFactory.CreateChannel();
        }
        private void sendMessage(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("Not available yet!");
        }
        public void TakeMessage(string message, string userName)
        {
            chatBox.Text += userName + ": " + message + "'n";
        }
    }
}

如何在另一个类中调用此方法的TakeMessage,以便使用该代码绑定窗口填充ChatWPFClient.XAML的XAML文件?提前感谢!

获取非主窗口WPF的窗口

首先创建一个可以传递给ClientCallback 的接口

public interface IMessageHandler
{
    void TakeMessage(string message, string userName);
}

然后在ClientCallBack中,将接口作为构造函数中的参数。

[CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
public class ClientCallback : IClient
{
    private IMessageHandler messageHandler;
    public ClientCallBack(IMessageHandler messageHandler)
    {
        this.messageHandler = messageHandler;
    }
    public void GetMessage(string message, string userName)
    {
        messageHandler.TakeMessage(message, userName);
    }
} 

使用ChatWpfClient的接口,并在构造函数中传递实例。

public partial class ChatWPFClient : Window, IMessageHandler
{
    ... 
    public ChatWPFClient()
    {
        InitializeComponent();
        _channelFactory = new DuplexChannelFactory<IChattingService>(new ClientCallback(this), "ChattingServiceEndpoint");
        Server = _channelFactory.CreateChannel();
    }
    ...
    // This is a part of the interface now and needs to be implemented here
    public void TakeMessage(string message, string userName) 
    {
        chatBox.Text += userName + ": " + message + "'n";
    }
}

此外,您可以在ChatWPFClient类上实现IClient,并使用CallBackBehavior属性进行装饰,然后将其本身作为回调传递。但不要认为这是推荐的,看起来很奇怪。

_channelFactory = new DuplexChannelFactory<IChattingService>(this, "ChattingServiceEndpoint");