我在XAML中设置了两个图像元素的来源。如何使它们指向同一个对象,这样如果其中一个图像的源更改,则第二个图像会自动更改。目前,通过设置XAML图像的源,它们都保持自己的本地副本。 例如,我有两个图像元素
<Image x:Name="abc" /> and <Image x:name="def"/>
我设置了abc.Source =&#34; xyz&#34;和def.Source =&#34; xyz&#34;。现在两个(abc和def)都有自己的图像副本&#34; xyz&#34;。如何让它们指向同一个图像对象。因此,没有必要保留2份&#34; xyz&#34;。
答案 0 :(得分:7)
我不太确定我是否理解正确。我想你可能希望能够一次更改ImageSource并自动更新两个图像,而不是在每次更改时明确设置每张图片的Source。那就是Binding的描述。
以下是该案例的实施:
视图模型:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Input;
namespace WpfApplication1
{
public class MyViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
private string _source;
public string Source { get { return _source; } set { _source = value; OnPropertyChanged("Source"); } }
public ICommand ChangeImageCommand { get; private set; }
private List<string> _pics = new List<string>()
{
"/Themes/Evernote.png",
"/Themes/Skype.png",
"/Themes/Twitter.png"
};
private int i = 0;
public MyViewModel()
{
this.Source = _pics[i++];
this.ChangeImageCommand = new ActionCommand(ChangeImage);
}
private void ChangeImage()
{
this.Source = _pics[i++ % _pics.Count];
}
}
public class ActionCommand : ICommand
{
public event EventHandler CanExecuteChanged;
private Action _action;
public ActionCommand(Action action) { _action = action; }
public bool CanExecute(object parameter) { return true; }
public void Execute(object parameter) { if (_action != null) _action(); }
}
}
的Xaml:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="500">
<Window.DataContext>
<local:MyViewModel />
</Window.DataContext>
<StackPanel Background="Maroon">
<Image x:Name="Image1" Source="{Binding Source}" Margin="20" Width="100" />
<Image x:Name="Image2" Source="{Binding Source}" Margin="20" Width="100" />
<Button Command="{Binding ChangeImageCommand}" Content="Change Image" HorizontalAlignment="Center" />
</StackPanel>
</Window>
答案 1 :(得分:2)
您可以在ResourceDictionary中将图像定义为StaticResource,并在所有视图中重复使用
<BitmapImage x:Key="MyImage" UriSource="path/to/MyImage.png" />
<Image x:Name="MyImage1" Source="{StaticResource MyImage}"/>
<Image x:Name="MyImage2" Source="{StaticResource MyImage}"/>
答案 2 :(得分:1)
<Image x:Name="Image1"/> <Image Source="{Binding Source, ElementName=Image1,UpdateSourceTrigger=PropertyChanged}/>
这样做是设置第二个图像的源属性,以便在 Image1 的源属性发生更改时进行更新。
你的问题并不是那么清楚,你关心的是什么?您是否担心内存中的图像复制或只是看起来一样?