如何访问控件模板中的元素?

时间:2015-06-09 18:23:14

标签: c# wpf

我在WPF中为我的图像需要Click事件,我在XAML中将它们定义为:

 <Button Click="Button_Click" Name="B1" x:Uid="7">
        <Button.Template>
            <ControlTemplate>
                <Image Source="E:\Photos\Me\DSC_0002.jpg" Name="im1" />
            </ControlTemplate>
        </Button.Template>
    </Button>

我有7个像这样声明的图像,每个图像都在一个单独的Button标签中。

我为所有按钮分配了一个常用的Click功能,在C#中我有一个名为clickCount的变量来跟踪点击次数。 现在我想在用户点击它们时交换任意2个图像的位置。

如何在C#中访问图像以便我可以交换它们?

1 个答案:

答案 0 :(得分:3)

您无法使用按钮名称从后面的代码访问它们。为此,您需要按以下方式设置图像:

<Image Source="{Binding ImagePath}" 
       HorizontalAlignment="Left" 
       Stretch="Fill" 
       VerticalAlignment="Bottom" 
       Width="200"/>

这样您就可以在模型中定义图像。

public class Model : INotifyPropertyChanged
{
    private Uri _ImagePath;
    public Uri ImagePath
    {
        get
        {
            return _ImagePath;
        }
        set
        {
            _ImagePath = value;

            PropertyChanged(this, new PropertyChangedEventArgs("ImagePath"));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged = delegate { };
}

我不确定您是否需要使用MVVM来更改具有Button Click事件的图像,但对于此背后的代码是其中一种方式:

public partial class MainWindow : Window
{
    public Model ImageModel { get; set; }

    public MainWindow()
    {
        InitializeComponent();

        ImageModel = new Model();
        ImageModel.ImagePath = new Uri(@"/ImageSource;component/Images/Image1.jpg", UriKind.RelativeOrAbsolute);
        this.DataContext = ImageModel;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        ImageModel.ImagePath = new Uri(@"/ImageSource;component/Images/Image2.jpg", UriKind.RelativeOrAbsolute);
    }
}

这是解决此问题的最简单,最快捷的方法。如果你需要MVVM只需举手,我们就可以得到一个Command而不是那个Click事件。 还有一件事,你有一个图像列表吗?如果是这样,我们将不得不使用ObservableCollection<Model>并实例化许多模型,以便为所有按钮提供信息。

还有一件事:

  • ImageSource是我的程序集名称。

  • 图片是在我的项目中创建的文件夹。

在那里添加你的图片,将他们的Build Action设置为Resource,这应该是全部。