我的MainWindow有4个单选按钮。用户必须选择一个,然后按一个按钮,以打开一个新窗口。根据所选的单选按钮,我想更改在新窗口中显示的背景。这是我的代码:
9220291542844303075
新窗口已经具有我在XAML代码的属性中设置的默认背景。上面的代码可以很好地运行和执行,但图片不会改变。我发现了一个快速修复程序,该修复程序基本上是删除背景(以便新窗口始终具有空白背景),然后在每次打开时对其进行设置。有什么更好的方法吗?
谢谢大家的帮助
答案 0 :(得分:0)
Practice
窗口的背景未更新的原因是,您在窗口的构造函数中设置了其背景,该构造函数仅在创建窗口时运行。为了对其进行更新,您必须在Checked
事件的每个复选框上添加事件处理程序,并更新处理程序中的背景。
但是,最简单,最推荐的方法是使用数据绑定。数据绑定是WPF和其他框架中的一种构造,您可以在其中声明性地指出将哪些属性链接在一起,从而不必手动更新它们。无需编写繁琐的事件事件处理程序,也无需跟踪复杂的更改。
Practice.xaml.cs :
public partial class Practice : Window
{
// INotifyPropertyChanged implementation is important!
// Without it, WPF has no way of knowing that you changed your property...
public class PracticeModel : INotifyPropertyChanged
{
private BitmapImage _background;
public BitmapImage Background
{
get => _background;
set { _background = value; PropertyChanged?.Invoke(nameof(Background)); }
}
public event PropertyChangedEventHandler PropertyChanged;
}
public Practice()
{
InitializeComponent();
// DataContext specifies which object the bindings are bound to
this.DataContext = new PracticeModel();
}
}
Practice.xaml:
<Window x:Class="MyApp.Practice" Background="{Binding Background}">
<!-- your content here; all other attributes of Window omitted for brevity -->
</Window>
MainWindow.xaml.cs:
public partial class MainWindow : Window
{
public Practice.PracticeModel PracticeModel { get; set; } = new Practice.PracticeModel();
// ...
public OnButtonClicked(RoutedEventArgs e)
{
var window = new Practice();
// DataContext specifies which object the bindings are bound to
window.DataContext = this.PracticeModel;
window.Show();
}
public OnPoissonRadioChecked(RoutedEventArgs e)
{
PracticeModel.Background = new BitmapImage(new Uri(BaseUriHelper.GetBaseUri(this), "images/poisson_practice_screen.jpg"));
}
// likewise for other radio buttons ...
}
MainWindow.xaml:
<Window x:Class="MyApp.MainWindow">
<RadioButton Group="TheButtons" x:Name="BinomialRadio" IsChecked="True" Checked="OnBinomialRadioChecked" />
<RadioButton Group="TheButtons" x:Name="HypergeometricRadio" Checked="OnHypergeometricRadioChecked" />
<RadioButton Group="TheButtons" x:Name="PoissonRadio" Checked="OnPoissonRadioChecked" />
<RadioButton Group="TheButtons" x:Name="TheOtherRadio" Checked="OnTheOtherRadioChecked" />
</Window>
在PracticeModel
上更改属性时,将触发PropertyChanged
事件。这告诉WPF该属性已更改,并且它会自动更新所有相关绑定。当您要拥有多个动态更新属性时,这将很快变得非常有用。此外,数据绑定可以自动从string
或Uri
转换为ImageSource
,因此您甚至不必自己创建BitmapImage
(如果您不这样做,不必,然后不必。)
您可能已经注意到,此代码中仍然有事件处理程序。那是因为我不想同时引入太多的复杂性,并且数据绑定单选按钮对于不习惯此操作的人可能会造成混淆。我希望这会有所帮助!