将事件分配给另一个wpf窗口

时间:2013-04-15 00:44:18

标签: c# wpf events

我阅读了WPF4释放书中的事件部分,但我找不到我想要的内容。

例如我有两个窗口两者都已打开)。

我的第一个按钮,第二个文本框数字作为内容)。

每当我点击按钮时,我希望文本框的数字增加而不再打开第二个窗口。期待您的帮助和建议!

我已经从主窗口打开了2个窗口,我在第一个窗口的click_event按钮上尝试了这个代码:

    private void b_Click(object sender, RoutedEventArgs e)
    {
        int i = int.Parse(WpfApplication22.Window2.textbox.Text);
        i++;
        WpfApplication22.Window1.textbox.Text = i.ToString();            
    }

3 个答案:

答案 0 :(得分:2)

我建议您使用自己的自定义事件处理程序来执行此类操作。对于你的问题需要什么可能有点过分,但它有更多的用途和更多的可扩展性。此外,WPF应该使用MVVM模式实现,这意味着您只需要让ViewModels相互通信。出于此示例的目的,我将假设每个窗口都有一个关联的ViewModel。

首先创建自己的事件参数,如下所示。

public class MyCustomEventArgs : EventArgs {

}

然后编写自己的事件处理程序类,如下所示。

public class CustomEventHander {
  static public event EventHandler CustomEvent;

  static public void RaiseMyCustomEvent(object sender, EventArgs args) {
    if (CustomEvent != null) CustomEvent(sender,args);
  }
}

然后你只需要连线。

在第一个Windows ViewModel上,您需要将事件处理程序放在构造函数中。

CustomEventHandler.CustomEvent += handleCustomEvent;

其次,您通过编写handleCustomEvent方法来编写句柄事件。这是您增加所需数量的地方。

private void handleCustomEvent(object sender, EventArgs e) {
  if (e is MyCustomEventArgs) {
    this.IntValue += 1;
  }
}

到目前为止,我们可以处理事件,提升事件但我们需要触发事件。

在第二个窗口控制器中,将ICommand连接到按钮,并将以下代码放入方法中。

CustomEventHandler.RaiseMyCustomEvent(this, new MyCustomEventArgs());

我希望这能回答你的问题。当然,我已经假设使用MVVM并将属性IntValue绑定到第一个窗口上的文本框。但是这段代码应该有希望满足你的需求。

答案 1 :(得分:1)

您可以将第二个DataContext上的Window分配给第一个Window并使用DependancyProperty绑定您想要的值

实施例

Window1代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    public int Count
    {
        get { return (int)GetValue(CountProperty); }
        set { SetValue(CountProperty, value); }
    }
    public static readonly DependencyProperty CountProperty =
        DependencyProperty.Register("Count", typeof(int), typeof(MainWindow), new UIPropertyMetadata(0));

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        //SetBinding windows DataContext to this window
        new PopupWindow { DataContext = this }.Show();
    }
}

Window1 Xaml:

<Window x:Class="WpfApplication10.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="325" Width="422" Name="UI">
    <Grid DataContext="{Binding ElementName=UI}">
        <StackPanel>
            <TextBox Text="{Binding Count, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
            <Button Content="Open Window 2" Click="Button_Click" />
        </StackPanel>
    </Grid>
</Window>

Window2代码:

public partial class PopupWindow : Window
{
    public PopupWindow()
    {
        InitializeComponent();
    }
}

Window2 Xaml:

<Window x:Class="WpfApplication10.PopupWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication10"
        Title="PopupWindow" Height="300" Width="300">
    <Grid>
        <TextBlock Text="{Binding Path=Count}" />
    </Grid>
</Window>

<强>结果:

enter image description here

答案 2 :(得分:0)

你的第一个窗口需要引用第二个窗口。

abc = New Window2
abc.Show()

然后,当按钮的点击事件触发时,您可以执行此操作。

abc.TextBox1.Text = CStr(CInt(abc.TextBox1.Text) + 1)