C# 如何从App.XAML在wp8中设置根布局的背景图像

C# 如何从App.XAML在wp8中设置根布局的背景图像,c#,windows-phone-8,C#,Windows Phone 8,我正在使用App.Resources在所有wp8页面中设置网格布局的背景图像。我遇到了一个问题,用户可以从三个背景中选择一个。我不知道如何通过App.XAML实现这一点。我设计了一个界面,用户可以选择其中一个背景,但不知道如何激活所选背景 这是我的APP.XAML <Application.Resources> <Color x:Key="PageTitleForgroundColor">#000000</Color> <SolidColorBrus

我正在使用App.Resources在所有wp8页面中设置网格布局的背景图像。我遇到了一个问题,用户可以从三个背景中选择一个。我不知道如何通过App.XAML实现这一点。我设计了一个界面,用户可以选择其中一个背景,但不知道如何激活所选背景

这是我的APP.XAML

<Application.Resources>
 <Color x:Key="PageTitleForgroundColor">#000000</Color>
 <SolidColorBrush x:Key="PageTitleForegroundBrush" 
               Color="{StaticResource PageTitleForgroundColor}"/>

 <ImageBrush x:Key="AppBackgroundImage" ImageSource="/Assets/Background.jpg" 
               Stretch="UniformToFill"></ImageBrush>
 <ImageBrush x:Key="AppBackgroundImage_1" ImageSource="/Assets/Background.jpg" 
               Stretch="UniformToFill"></ImageBrush>
 <ImageBrush x:Key="AppBackgroundImage_2" ImageSource="/Assets/Background.jpg" 
               Stretch="UniformToFill"></ImageBrush>

 <!-- Grid Layout Background-->
 <Style x:Key="LayoutRootStyle" TargetType="Panel">
    <Setter Property="Background" Value="{StaticResource AppBackgroundImage}"></Setter>
 </Style>

</Application.Resources>

如您所见,我正在APP.XAML中设置Background属性,如何使其动态化?它应该是AppBackgroundImage_2、AppBackgroundImage_1和AppBackgroundImage,具体取决于用户选择。

我怀疑您试图在全景控件中更改此背景。 Panorama控件和Pivot控件在支持后期绑定方面也存在一些问题

要动态更改背景图像,应遵循以下步骤

在关联的ViewModel中创建一个属性MainBackGroundImage,该属性实现INotifyPropertyChanged接口,如果您使用的是MVVM模式,那么您已经有了这个基础结构。 每当您想要更改背景图像时,将任何图像路径(这可以是远程URL)指定给此属性。 在视图中,连接到ViewModel的属性更改事件,并更新将要显示背景图像的控件的布局:

 void viewModel_PropertyChanged(object sender,PropertyChangedEventArgs e)
    {

    if (e.PropertyName == “MainBackGroundImage”)
    {
          this.MainPanorama.UpdateLayout();
    }
    }
实现这一点的最佳方法是使用视图模型并授予对配置的访问权,然后使用直接向上绑定来实现这一点。最大的问题源于这样一个事实,即样式的内容一旦使用就无法更改——在大多数平台上,您会遇到访问被拒绝的异常

如果你执意使用资源,这就是我的想法。可能有更简单的方法来做到这一点

创建一个名为ObjectHolder的类。您将在资源模型中实例化它

公共类ObjectHolder:DependencyObject { 公共对象对象对象 { 获取{return objectGetValueHeldObjectProperty;} set{SetValueHeldObjectProperty,value;} }

}

在你的应用程序XAML中,实例化这个。你将需要2种风格-一个为每个背景以及我使用的背景,因为它更容易测试纯色刷子

<SolidColorBrush x:Key="AppBackgroundImage1" Color="Blue" />
<SolidColorBrush x:Key="AppBackgroundImage2" Color="Red" />

<!-- Grid Layout Background-->
<Style x:Key="LayoutRootStyle1" TargetType="Panel">
    <Setter Property="Background" Value="{StaticResource AppBackgroundImage1}"></Setter>
</Style>
<Style x:Key="LayoutRootStyle2" TargetType="Panel">
    <Setter Property="Background" Value="{StaticResource AppBackgroundImage2}"></Setter>
</Style>
<local:ObjectHolder x:Key="holder" HeldObject="{StaticResource LayoutRootStyle1}"></local:ObjectHolder>

谢谢,我发现这篇文章说明了改变帧背景,但不知道这是正确的方法吗?是的,但这里的背景图像是硬编码的。如果您还硬编码背景图像路径,则不使用绑定路径,您还可以显示静态图像。如果你想动态地改变图像,你应该按照我上面描述的步骤来做。或者你可以看看我的开源WP8项目,我在那里动态地改变背景图像:谢谢,我需要在每个页面上都这样做吗?我只想坐一次,这应该在我的应用程序中使用。这对我很有用,我在App.xaml.cs RootFrame.Background=System.Windows.Media.ImageBrushApp.Current.Resources[AppBackgroundImage_1]中添加了这段代码;我正在搜索使用MVVM来完成它。感谢您使用MVVM进行合作。
<SolidColorBrush x:Key="AppBackgroundImage1" Color="Blue" />
<SolidColorBrush x:Key="AppBackgroundImage2" Color="Red" />

<!-- Grid Layout Background-->
<Style x:Key="LayoutRootStyle1" TargetType="Panel">
    <Setter Property="Background" Value="{StaticResource AppBackgroundImage1}"></Setter>
</Style>
<Style x:Key="LayoutRootStyle2" TargetType="Panel">
    <Setter Property="Background" Value="{StaticResource AppBackgroundImage2}"></Setter>
</Style>
<local:ObjectHolder x:Key="holder" HeldObject="{StaticResource LayoutRootStyle1}"></local:ObjectHolder>
private void Button_Click(object sender, RoutedEventArgs e)
{

    var holder = (ObjectHolder)App.Current.Resources["holder"];
    holder.HeldObject = App.Current.Resources["LayoutRootStyle2"];
}