我有一个包含图像,名称(字符串)和引用(字符串)的网格视图,图像大小为50x50并包含在一个按钮中,所以我希望每次用户点击图像“按钮”时图像显示在新窗口中。
这就是我如何进行
网格视图的XAML代码:
<Grid Background="#FFE5E5E5">
<ListView Name="ListView">
<ListView.View>
<GridView>
<GridViewColumn Header="Image" Width="120">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Button Content="{Binding Image}" Click="ImageButtonClicked"></Button>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="reference" Width="100" DisplayMemberBinding="{Binding Reference}"></GridViewColumn>
<GridViewColumn Header="name" Width="100" DisplayMemberBinding="{Binding Name}"></GridViewColumn>
</GridView>
</ListView.View>
</ListView>
</Grid>
按钮点击事件:
private void ImageButtonClicked(object sender, RoutedEventArgs args)
{
ImageWindow imageWindow = new ImageWindow();
Button btn = args.OriginalSource as Button;
Image img = (Image) btn.Content;
imageWindow.ImageToDisplay = img;
imageWindow.Show();
}
将显示图像的窗口:
public partial class ImageWindow : Window
{
public Image ImageToDisplay { get; set; }
public ImageWindow()
{
Imagee.Source = ImageToDisplay.Source;
InitializeComponent();
;
}
}
当我运行此代码时,我得到一个'System.NullReferenceException';附加信息:对象引用未设置为对象的实例。
在Imagee.Souurce = ImageToDisplay.Source;
任何帮助将不胜感激;提前谢谢。
答案 0 :(得分:1)
InitializeComponent()
。属性值在构造函数中不可用,因为它们是在对象构造之后设置的。
public ImageWindow()
{
InitializeComponent();
//this line will always have error as ImageToDisplay is set after the constructor
//Imagee.Source = ImageToDisplay.Source;
}
所以为它创建一个新方法并删除属性ImageToDisplay
为不需要的
例如
public SetImage(Image imageToDisplay)
{
Imagee.Source = imageToDisplay.Source;
}
并像这样打电话
private void ImageButtonClicked(object sender, RoutedEventArgs args)
{
ImageWindow imageWindow = new ImageWindow();
Button btn = args.OriginalSource as Button;
imageWindow.SetImage(img);
imageWindow.Show();
}
或者如果您只想在新窗口中显示整体图像,您也可以利用内容属性
private void ImageButtonClicked(object sender, RoutedEventArgs args)
{
ImageWindow imageWindow = new ImageWindow();
Button btn = args.OriginalSource as Button;
imageWindow.Content = btn.Content;
imageWindow.Show();
}
上面的代码只要按钮上有内容设置就可以使用,无论它是什么。