wpf中两个Windows之间的更新

Posted

技术标签:

【中文标题】wpf中两个Windows之间的更新【英文标题】:Update between two Windows in wpf 【发布时间】:2018-08-29 02:16:52 【问题描述】:

我有以下代码:

窗口 1:

        public MainWindow()
    
        InitializeComponent();
    

    private void Button_Click(object sender, RoutedEventArgs e)
    
        SecondWindow sndW = new SecondWindow(btnFirstWindow);
        sndW.Show();
    


<Grid>
    <Button Name="btnFirstWindow" Content="Button" HorizontalAlignment="Left" Margin="317,166,0,0" VerticalAlignment="Top" Width="148" Height="70" Click="Button_Click"/>

</Grid>

第二个窗口:

        private Button firstWindowButton;
    public SecondWindow(Button firstWindowButton) 
        this.firstWindowButton = firstWindowButton;
        InitializeComponent();
    
    private void Button_Click(object sender, RoutedEventArgs e)
    
        firstWindowButton.Click += firstWindowButton_Click;
    
    void firstWindowButton_Click(object sender, RoutedEventArgs e)
    
        lblShowUser.Content = "First window button clicked on: " + DateTime.Now.ToString();
    

<Label Name="lblShowUser" Content="" HorizontalAlignment="Left" Margin="275,175,0,0" VerticalAlignment="Top" Height="92" Width="205"/>

如果我按下 window1 中的按钮,它应该会更改 window2 中 lblShowUser 的内容。从here 得到这个例子。但它不会工作.. 两个窗口将打开,但内容不会改变。如果我将标签中的内容设置为“测试”,它不会更改为正确的时间,例如“单击第一个窗口按钮:...”

【问题讨论】:

But it won't work. 请告诉我们什么不起作用。另外,如果有异常,请添加异常。 好吧,我加了一点描述。希望对您有所帮助。 【参考方案1】:

移动此代码 firstWindowButton.Click += firstWindowButton_Click;

到 SecondWindow 构造函数。所以它应该是这样的:

    public SecondWindow(Button firstWindowButton) 
    this.firstWindowButton = firstWindowButton;
    firstWindowButton.Click += firstWindowButton_Click;
    InitializeComponent();

【讨论】:

是的,它有效!但它只有在我每次按下按钮时都会打开一个新窗口时才有效? 如果您愿意,可以再添加一个按钮,这样一个按钮将打开新窗口,另一个按钮将更改标签文本 嗯..每次我问的事情都很简单..谢谢!【参考方案2】:

另一种方法是将两个窗口绑定到同一个ViewModel,并在App.xaml中将该ViewModel定义为StaticResource

添加一个Command 类和一个SharedViewModel 类并定义所需的属性/命令:

public class Command : ICommand

    private readonly Action _action;
    public Command(Action action)
    
        _action = action;
    

    public event EventHandler CanExecuteChanged;
    public bool CanExecute(object parameter)
    
        return true;
    

    public void Execute(object parameter)
    
        _action();
    

public class SharedViewModel : INotifyPropertyChanged

    private string _labelText;
    public string LabelText
    
        get  return _labelText; 
        set
        
            _labelText = value;
            OnPropertyChanged();
        
    


    private ICommand _buttonClickCommand;
    public ICommand ButtonClickCommand => _buttonClickCommand ?? (_buttonClickCommand = new Command(ButtonClickAction));

    public void ButtonClickAction()
    
        LabelText = "Updated Text";
    

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    

App.xaml中将SharedViewModel实例定义为StaticResource

<Application.Resources>
<ResourceDictionary>
<local:SharedViewModel x:Key="SharedViewModel"/>
</ResourceDictionary>

窗口1:

Title="MainWindow" Height="450" Width="800" DataContext="StaticResource SharedViewModel">

<Grid>
    <Button Name="BtnFirstWindow" Content="Button" HorizontalAlignment="Left" Margin="317,166,0,0" VerticalAlignment="Top" Width="148" Height="70"  Command="Binding ButtonClickCommand"/>
</Grid>

窗口2

Title="Window2" Height="450" Width="800" DataContext="StaticResource SharedViewModel">
<Grid>
    <Label Name="lblShowUser" Content="Binding LabelText" HorizontalAlignment="Left" Margin="275,175,0,0" VerticalAlignment="Top" Height="92" Width="205"/>
</Grid>

【讨论】:

哇,这将在几天内帮助我很多。目前我对 MVVM 了解不多。但这将是下一步,谢谢!【参考方案3】:

只需将这两个窗口的 DataContext 绑定到一个通用的 ViewModel 上。然后将新窗口的 Datacontext 设置为旧窗口。 喜欢-

Window2 Obj = new();
obj.DataContext = this;
obj.Show();

在您的第一个窗口中喜欢,然后所有更新/更改都会相应地发生。

【讨论】:

以上是关于wpf中两个Windows之间的更新的主要内容,如果未能解决你的问题,请参考以下文章

WPF 窗口位置绑定

WPF窗口与windowsForm窗体之间的问题,怎么调用close()

WPF 插拔触摸设备触摸失效

wpf中从windows中打开windows1但为啥不显示windows1中的控件

在Windows服务的WPF应用程序中托管的命名管道上使用WCF服务

wpf 怎么实现 窗口和窗口之间的传值?页面和页面之间?窗口和页面之间?