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窗口与windowsForm窗体之间的问题,怎么调用close()
wpf中从windows中打开windows1但为啥不显示windows1中的控件