首页 \ 问答 \ 事件识别C#WPF(Event recognition C# WPF)

事件识别C#WPF(Event recognition C# WPF)

我遇到了一个事件问题。 我有一个第一个看起来像这样的窗口:

using System.Windows;

namespace EventsTests
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            /*Binding Event to MainWindow
              dont work until you will help*/
            MainWindow mw = new MainWindow();
            mw.RaiseEvent += raiseEvent_EventHandler;
        }
        public void raiseEvent_EventHandler()
        {
             MessageBox.Show("MAINWINDOW Event Fired");
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
             SecondPage sp = new SecondPage();
             sp.Show();
        }
    }
}

现在,借调页面做得不够:

using System.Windows;

namespace EventsTests
{
    /// <summary>
    /// Interaction logic for SecondPage.xaml
    /// </summary>
    public partial class SecondPage : Window
    {
        SecondPageViewModel spvm = new SecondPageViewModel();
        public SecondPage()
        {
            this.DataContext = spvm;
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            spvm.raiseEventActivate();
        }
    }
}

最后我有SecondPageViewModel:

namespace EventsTests
{
    public delegate void raiseEventEventHandler();

    class SecondPageViewModel 
    {
        public event raiseEventEventHandler raiseEvent;
        public void raiseEventActivate()
        {
            if(raiseEvent != null)
            {
                raiseEvent();
            }
        }
    }
}

现在我想,当我点击第二页上的按钮时,会触发事件,MainWindow会识别该事件。 使用此代码我得到错误:

错误1无法分配给'RaiseEvent',因为它是'方法组'

有人能帮我吗? 或者举个例子?

谢谢你的每一个提示;)


I got an Problem with Events. I got a first Window which looks like this:

using System.Windows;

namespace EventsTests
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            /*Binding Event to MainWindow
              dont work until you will help*/
            MainWindow mw = new MainWindow();
            mw.RaiseEvent += raiseEvent_EventHandler;
        }
        public void raiseEvent_EventHandler()
        {
             MessageBox.Show("MAINWINDOW Event Fired");
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
             SecondPage sp = new SecondPage();
             sp.Show();
        }
    }
}

Now the seconde Page don´t do very much:

using System.Windows;

namespace EventsTests
{
    /// <summary>
    /// Interaction logic for SecondPage.xaml
    /// </summary>
    public partial class SecondPage : Window
    {
        SecondPageViewModel spvm = new SecondPageViewModel();
        public SecondPage()
        {
            this.DataContext = spvm;
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            spvm.raiseEventActivate();
        }
    }
}

And at last I have the SecondPageViewModel:

namespace EventsTests
{
    public delegate void raiseEventEventHandler();

    class SecondPageViewModel 
    {
        public event raiseEventEventHandler raiseEvent;
        public void raiseEventActivate()
        {
            if(raiseEvent != null)
            {
                raiseEvent();
            }
        }
    }
}

Now I want, when I click the button on the second page, the Event is fired an the MainWindow recognise the event. With this code i get the Error:

Error 1 Cannot assign to 'RaiseEvent' because it is a 'method group'

Can someone help me? Or give me an example?

Thanks for every hint ;)


原文:https://stackoverflow.com/questions/31591755
更新时间:2019-06-23 01:16

最满意答案

RaiseEvent不是你的事件,它是Window的一种方法。

我想你想这样做:

SecondPage sp = new SecondPage();
sp.raiseEvent += raiseEvent_EventHandler;    
sp.Show();

也就是说,使用第二页事件注册事件处理程序。

虽然我不会提倡event处理程序。 虽然我不知道你想要实现什么,但我宁愿做一些事情,比如将ViewModel对象传递给SecondPage ,主窗口可以响应该ViewModel上的状态变化。

在WPF中,我始终追求代码。

在回答讨论时,一个VM如何引用另一个VM。 首先通过VM:

SecondPageViewModel spvm;
public SecondPage(SecondPageViewModel model)
{
    spvm = model;
    this.DataContext = spvm;
    InitializeComponent();
}

然后,SecondpageVM将MainVM作为构造函数中的参数:

SecondPage sp = new SecondPage(new SecondPageViewModel(mainVM));

主模型的更新在SecondPageViewModel中完成。 第二页本身没有引用它。

ThirdPage tp = new ThirdPage(new ThirdPageViewModel(spvm))

第三页VM可以通过第二页vm: spvm.MainVm上的属性访问主页VM


RaiseEvent is not your event, it's a method of the Window.

I think you want to do this:

SecondPage sp = new SecondPage();
sp.raiseEvent += raiseEvent_EventHandler;    
sp.Show();

That is, register an event handler with the second page event.

Though I wouldn't advocate event handlers for this. While I don't know what you are trying to achieve I'd rather do something like pass a ViewModel object to the SecondPage and the main window can respond to state changes on that ViewModel.

In WPF, I always aim for zero code behind.

In response to discussion, how one VM could have reference to another. First pass the VM in:

SecondPageViewModel spvm;
public SecondPage(SecondPageViewModel model)
{
    spvm = model;
    this.DataContext = spvm;
    InitializeComponent();
}

Then the SecondpageVM takes a MainVM as a paramter in the constuctor:

SecondPage sp = new SecondPage(new SecondPageViewModel(mainVM));

Updates to the main model are done within the SecondPageViewModel. The second page itself has no references to it.

ThirdPage tp = new ThirdPage(new ThirdPageViewModel(spvm))

Third page VM can access main page VM via property on second page vm: spvm.MainVm

2015-07-24

相关问答

更多

c#,wpf - 模板窗口?(c#, wpf - template window?)

WPF上没有母版页。 ASP.NET中真正强大的增强功能之一是引入母版页。 它们可以帮助开发人员为应用程序中的页面创建一致的布局。 不幸的是,WPF和XAML中没有这样的概念。 目标是构建一个包含三个页面的简单WPF应用程序。 每个页面应包含三个方面: 标题 摘要 主要内容 因此,我们需要在WPF文件中引用Master类: xmlns:m="clr-namespace:MasterPages.Master ”。 我为我的Master类选择了前缀m。 使用此前缀,我可以向页面添加新的Master实例 ...

如何测试窗口是否被拖动C#WPF(How to test if a window is being dragged C# WPF)

有一个名为Thumb的WPF元素(控件),我使用它来制作可拖拽的零件。 它有一个DragDelta事件,您可以使用它来检查可拖动部件的HorizontalOffset和VerticalOffset 。 您可以保存以前的值并检查新值是否相同或更改; 这意味着它正在被拖拽。 (只是一个建议,为我工作)。 There is a WPF element (control) named Thumb, I use that for making drag-able parts. It has a DragDe ...

如何隐藏文本框,标签和按钮C#WPF(How to hide textboxes, labels and buttons C# WPF)

你的代码看起来工作正常,所有其他消失后出现“Signing in ...”标签。 我建议你只需将.xaml.cs文件和.xaml文件中的所有代码复制到一个新项目中,但请确保不要复制第一行"<Window x:Class="..."因为如果新项目中的类名称不同,它可能会产生错误。 对于xaml代码,我建议你不要像你设计windows窗体应用程序那样。 WPF有布局系统,在重新调整窗口大小时重新定向或重新定义元素的大小。 所以你不应该在边界属性中指定确切的数字,就像它们在哪里坐标一样。 创建网格,为每 ...

未处理的c#wpf异常(c# wpf Exception Unhandled)

在您的XAML中将绑定的Mode设置为OneWay : <TextBox Text="{Binding Booze, Mode=OneWay}" /> ...或者将一个公共setter添加到Booze源属性中: public string Booze { get; set; } Set the Mode of the binding to the Booze property to OneWay in your XAML: <TextBox Text="{Binding Booze, Mode ...

使用多个绑定的WPF IsEnabled?(C# WPF IsEnabled using multiple bindings?)

我相信你可能不得不使用MultiBinding和MultiValueConverter。 看到这里: http : //www.developingfor.net/wpf/multibinding-in-wpf.html 这是一个直接相关的示例: http : //social.msdn.microsoft.com/Forums/en-US/wpf/thread/5b9cd042-cacb-4aaa-9e17-2d615c44ee22 I believe you may have to use a ...

C#WPF:填充DataGrid失败(C# WPF : Fail in populating DataGrid)

我在你的xaml中看到的基本问题是你设置ItemsSource = {binding SeiveData},如果你将这个属性传递给网格的数据上下文,这是错误的。 以下代码现在正在运行。 核实。 如果你想将chagnes通知给Seive类,那么还有一件事就是必须实现INotifyPropertyChange接口。 XAML <DataGrid Name="serverGrid" ItemsSource="{Binding}"> <DataGrid.Columns> ...

代表在Windows C#WPF之间传递数据(Delegates to Pass Data Between Windows C# WPF)

就像Mat链接一样,事件是一种特殊的委托,这可能就是你要找的东西。 我写了一个小例子,希望这足以让你解决问题。 public partial class Form1 : Form { public event EventHandler PersonSelected; public String PersonName { get; set; } public Form1() { InitializeComponent(); Perso ...

带有边框的C#WPF透明窗口(C# WPF transparent window with a border)

我将基于Microsoft.com上的本教程的一个快速Transparancy Converter类放在一起,您可以使用它来实现此目的: using System; using System.Runtime.InteropServices; using System.Windows; using System.Windows.Interop; namespace WpfApplication2 { class TransparancyConverter { pri ...

相关文章

更多

最新问答

更多
  • Android宽度:100%修复(网站接管问题)(Android width:100% fix (website takeover issue))
  • C ++函数/方法设计的良好实践(Good practice in C++ function/method design)
  • 计算其他表中不存在的所有记录 - SQL查询(Count all records that does not exist to other table - SQL Query)
  • 为什么我要用JPA共享ID?(Why do I get shared Ids with JPA?)
  • asp.net - 如何显示来自html格式的数据行的字段(asp.net - how to display a field from data row that is in html format)
  • 我们如何使用ActiveRecord从连接表中删除行?(How can we delete rows from a join table by using ActiveRecord?)
  • ng-class搞乱了类的顺序(ng-class messing with the order of classes)
  • oracle 12g无效数字错误(oracle 12g invalid number error)
  • 更改ng-src值onclick(Change ng-src value onclick)
  • 如何在android中自动添加自定义依赖项以创建新项目?(How to add custom dependencies automatically in android for ever a new project is created?)
  • datetime函数在PHP中(datetime function in php)
  • 在javascript中获取会话数组的值(in javascript get the value of a session array)
  • 如何在UTF8中编译LaTeX?(How can I compile LaTeX in UTF8? [closed])
  • Rspec:“array.should == another_array”,但不用担心订单(Rspec: “array.should == another_array” but without concern for order)
  • Logcat错误:无法在android片段中加载视图(Logcat error: unable to load view in android fragments)
  • JavaFX的。(JavaFX. Adding items to the list in different threads is not working)
  • 从GDATA日历资源迁移到Google Calendar Resource api(Migrate from GDATA calendar resource to Google Calendar Resource api)
  • SSRS 2008 - 以零情景处理分割(SSRS 2008 - Dealing with division by zero scenarios)
  • 我如何以编程方式添加一个listView列标题的点击事件(How can I add a listView column header a click event programmatically)
  • Wxpython:无法检索有关列表控件项XXX的信息(Wxpython: Couldn't retrieve information about list control item XXX)
  • 使用Tortoise SVN在SVN存储库中移动目录(Move Directory across SVN repository using Tortoise SVN)
  • 天蓝色服务结构集群中的web api无状态服务是否在一段时间不活动后进入休眠状态?(Do web api stateless services in azure service fabric cluster go to sleep after a period of inactivity?)
  • 我可以设置intelliJ来突出显示PHP编码风格吗?(Can I set intelliJ to highlight php coding style?)
  • 用javafx创建一个Truetype字体文件(Creating a Truetype Font file with javafx)
  • Spring ftp配置错误(Spring ftp configuration is wrong)
  • 使用gsub去除多个字符(Using gsub to strip multiple characters)
  • 续订推送证书并保持当前的App Store App正常工作(Renew Push certificate and keep current App Store App working)
  • js:ES5和ES6之间关于'this'关键字用法的一个令人困惑的观点(js: one confusing point about 'this' keyword usage between ES5 and ES6)
  • window.onload vs $(document).ready()(window.onload vs $(document).ready())
  • 在Swift中,如何声明一个符合一个或多个协议的特定类型的变量?(In Swift, how can I declare a variable of a specific type that conforms to one or more protocols?)