C# 如何从App.XAML在wp8中设置根布局的背景图像
我正在使用App.Resources在所有wp8页面中设置网格布局的背景图像。我遇到了一个问题,用户可以从三个背景中选择一个。我不知道如何通过App.XAML实现这一点。我设计了一个界面,用户可以选择其中一个背景,但不知道如何激活所选背景 这是我的APP.XAMLC# 如何从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
<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"];
}