【问题标题】:Can I capture events from a WPF combobox in a winform?我可以从 Winform 中的 WPF 组合框捕获事件吗?
【发布时间】:2011-07-15 00:59:48
【问题描述】:

我已经在 winform 中实现了一个 wpf 组合框,现在必须以某种方式使其在我的 winform 中更改框时调用函数或事件,并且能够更改 winform 中的值。

主要:

namespace main
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            ElementHost elhost = new ElementHost();
            elhost.Size = new Size(174, 24);
            elhost.Location = new Point(93,60);
            MyWPFControl wpfctl = new MyWPFControl();
            elhost.Child = wpfctl;
            this.Controls.Add(elhost);
            elhost.BringToFront();
        }


        public void status_change(int val)
        {
            MessageBox.Show("Box value has changed to:" + Convert.ToString(val)   );
        }

和 wpf:

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

        }


        private void statComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            main.status_change(statComboBox.SelectedIndex);
            /// says:
            /// Error   1   The type or namespace name 'status_change' does not exist in the namespace 'main' (are you missing an assembly reference?)  C:\Users\Robert\documents\visual studio 2010\Projects\XMPP\main\wpf_combo_status.xaml.cs    31  18  main

        }


    }
    }

知道我可能做错了什么吗?谢谢!

【问题讨论】:

    标签: c# wpf winforms combobox wpf-controls


    【解决方案1】:

    MyWPFControl 中公开一个事件,例如:

    public SelectionChangedEventArgs:EventArgs
    {
        public int SelectedIndex {get; private set;}
        public SelectionChangedEventArgs (int selIdx)
        {
            this.SelectedIndex = selIdx;
        }
    }
    
    public partial class MyWPFControl : UserControl
    {
        public event EventHandler<SelectionChangedEventArgs> SelectionChanged;
    
        public MyWPFControl()
        {
            InitializeComponent();
        }
    
        private void statComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            OnSelectionChanged(statComboBox.SelectedIndex);
        }
    
        private void OnSelectionChanged(int selIdx)
        {
            if (SelectionChange != null)
                SelectionChanged(this, new SelectionChangedEventArgs(selIdx));
        }
    }
    

    然后在您的表单中订阅它,例如:

    public Form1()
    {
        InitializeComponent();
    
        ElementHost elhost = new ElementHost();
        elhost.Size = new Size(174, 24);
        elhost.Location = new Point(93,60);
        MyWPFControl wpfctl = new MyWPFControl();
        elhost.Child = wpfctl;
        this.Controls.Add(elhost);
        elhost.BringToFront();
    
        wpfctl.SelectionChanged += myWPFControls_SelectionChanged;
    }
    
    private void myWPFControls_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        status_change(e.SelectedIndex);
    }
    

    附注:

    我无法测试它,所以可能会有一些错误,但只是给你一个想法......;)

    【讨论】:

      【解决方案2】:

      没有更多上下文很难说,但看起来你想要的代码可能是:

      private void statComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
      {
          main.status_change(statComboBox.SelectedIndex);
      }
      

      假设main 是您要调用status_changeForm1 的实例。

      【讨论】:

      • 我同意“我们需要更多上下文”,但有些事情告诉我这是访问冲突;他们试图访问实际上由于私有而尚未声明的变量。
      • 试过了,不是说“名称空间'main'中不存在类型或名称空间名称'status_change'(您是否缺少程序集引用?)”......虽然它们都是在一个命名空间中.. 嗯...在上面编辑以显示整个上下文。
      • 好的,我对新代码的理解更好。我会使用 digEmAll 的代码 ;)
      猜你喜欢
      • 2019-01-13
      • 1970-01-01
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多