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

标签 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# 中访问图像以便交换它们?

最佳答案

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

<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 是我的程序集名称。

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

在那里添加你的图像,将它们的构建操作设置为资源,这应该是全部。

关于c# - 如何访问控件模板中的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30739913/

相关文章:

c# - 局部变量和垃圾生成

c# - 在将模型传递给 View 之前将其转换为列表

java - 位移位和字节转换在 Java 和 C# 中给出不同的结果

c# - 将鼠标悬停在元素上以显示并单击隐藏元素

wpf - 更改 WPF DatePicker 年/月标题区域背景颜色

c# - 检测 ScrollViewer 何时停止滚动

c# - 绑定(bind)到 ObservableCollection 中的项目字段的总数,并在值更改时更新

c# - Windows Phone WEB API 通过 HttpClient 发布返回 404 错误

wpf - 如何使用复选框列和绑定(bind)从 Xceed\Extended WPF 工具包设置数据网格控件

c# - wpf方法启动应用消息循环