打开新窗口时如何更改C#wpf背景图像?

时间:2018-11-21 23:56:53

标签: c# wpf image background window

我的MainWindow有4个单选按钮。用户必须选择一个,然后按一个按钮,以打开一个新窗口。根据所选的单选按钮,我想更改在新窗口中显示的背景。这是我的代码:

9220291542844303075

新窗口已经具有我在XAML代码的属性中设置的默认背景。上面的代码可以很好地运行和执行,但图片不会改变。我发现了一个快速修复程序,该修复程序基本上是删除背景(以便新窗口始终具有空白背景),然后在每次打开时对其进行设置。有什么更好的方法吗?

谢谢大家的帮助

1 个答案:

答案 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该属性已更改,并且它会自动更新所有相关绑定。当您要拥有多个动态更新属性时,这将很快变得非常有用。此外,数据绑定可以自动从stringUri转换为ImageSource,因此您甚至不必自己创建BitmapImage(如果您不这样做,不必,然后不必。)

您可能已经注意到,此代码中仍然有事件处理程序。那是因为我不想同时引入太多的复杂性,并且数据绑定单选按钮对于不习惯此操作的人可能会造成混淆。我希望这会有所帮助!