首页 文章

如何在UWP中更新页面上的图像?

提问于
浏览
0

我有一个GridviewItem . 这个GridviewItem有一个背景,它是一个ImageBrush . 现在,我想在单击某个按钮时将此ImageBrush更改为新的源 .

为此,我正在使用:

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

它确实有效,但只要我点击相应的GridviewItem,新图像就会显示 . 任何人都可以告诉我如何更新它而无需单击GridviewItem?

我已经尝试将其置于此块内但没有成功:

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

1 回答

  • 1

    最好的是,如果您已经使用合适的属性定义了ItemClass并实现了INotifyPropertyChanged - 通过适当的绑定,每次更改都将更新UI . 这是一个小样本 - 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>
    

    和背后的代码:

    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; }
    }
    

相关问题