2017-04-14 3 views
0

J'ai un GridviewItem. Ce GridviewItem a un arrière-plan qui est un ImageBrush. Maintenant je veux changer cette ImageBrush à une nouvelle source en cliquant sur un certain bouton.Comment mettre à jour une image sur une page dans UWP?

Pour cela, je suis en utilisant:

blck.Background = new ImageBrush(new BitmapImage(new Uri("ms-appx:///Assets/SensorBG.png"))); 

Il fonctionne cependant la nouvelle image montre que chaque fois que je clique sur le GridviewItem correspondant. Quelqu'un peut-il me dire comment le mettre à jour sans avoir à cliquer sur le GridviewItem?

J'ai déjà essayé de le mettre dans ce bloc sans succès:

  CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
      () => 
      { 
       blck.Background = new ImageBrush(new BitmapImage(new Uri("ms-appx:///Assets/SensorBG.png"))); 
      } 
      ); 

Répondre

1

Le mieux serait, si vous avez défini votre ItemClass avec des propriétés appropriées et mettre en œuvre INotifyPropertyChanged - avec approprié liaison, chaque modification mettra à jour l'interface utilisateur. Voici un petit échantillon - XAML:

<StackPanel> 
    <Button Content="Change background of second item" Click="Button_Click"/> 
    <GridView Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" ItemsSource="{x:Bind Items}"> 
     <GridView.ItemTemplate> 
      <DataTemplate x:DataType="local:ItemClass"> 
       <Border> 
        <Border.Background> 
         <ImageBrush ImageSource="{x:Bind Image, Mode=OneWay}"/> 
        </Border.Background> 
        <TextBlock Text="{x:Bind Name}"/> 
       </Border> 
      </DataTemplate> 
     </GridView.ItemTemplate> 
    </GridView> 
</StackPanel> 

et le code derrière:

public sealed partial class MainPage : Page 
{ 
    public List<ItemClass> Items = new List<ItemClass>(); 

    public MainPage() 
    { 
     Items.Add(new ItemClass { Name = "First item", Image = new BitmapImage(new Uri("ms-appx:///Assets/StoreLogo.png")) }); 
     Items.Add(new ItemClass { Name = "Second item", Image = new BitmapImage(new Uri("ms-appx:///Assets/StoreLogo.png")) }); 
     this.InitializeComponent(); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) => Items[1].Image = new BitmapImage(new Uri("ms-appx:///test.jpg")); 
} 

public class ItemClass : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void RaiseProperty(string name) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); 

    private ImageSource image; 
    public ImageSource Image 
    { 
     get { return image; } 
     set { image = value; RaiseProperty(nameof(Image)); } 
    } 

    public string Name { get; set; } 
}