防止XAML图像的本地副本

时间:2014-08-20 08:50:32

标签: c# wpf xaml user-interface wpf-controls

我在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;。

3 个答案:

答案 0 :(得分:7)

我不太确定我是否理解正确。我想你可能希望能够一次更改ImageSource并自动更新两个图像,而不是在每次更改时明确设置每张图片的Source。那就是Binding的描述。

以下是该案例的实施:

enter image description here enter image description here

视图模型:

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 的源属性发生更改时进行更新。

你的问题并不是那么清楚,你关心的是什么?您是否担心内存中的图像复制或只是看起来一样?