美好的一天, 我正在尝试创建一个应用程序,以便我可以对照片进行一些基本编辑。我已将一个集合绑定到一个列表框,我可以获取所有文本信息,但我无法显示我的图像。我看到的每个例子都使用uri设置图像,但是,我没有这样做来创建我的图像,我不确定这是不是为什么。我知道图像似乎正确加载,因为显示了有关图像的所有属性(高度宽度像素)。我相信我删除了与该问题无关的所有代码。
提前致谢, 克里斯
XML
<!--Step 1-->
<GroupBox x:Name="Step1">
<Grid>
<StackPanel>
<Label>Select Pictures</Label>
<ListBox x:Name="PictureNames" ItemsSource="{Binding}" Height="auto">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image x:Name="CurrentPhoto" Width="300" Height="200" Source="{Binding CurrentPhoto}"/>
<!--old code trying to make this work <Canvas x:Name="CurrentPhoto" Width="300" Height="200" Background="{Binding CurrentPhoto}"/>-->
<TextBlock x:Name="Name" Text="{Binding Path=Name}"></TextBlock>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Button x:Name="AddPicture" Click="AddPicture_Click">Click to upload Pictures</Button>
</StackPanel>
</Grid>
</GroupBox>
代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Win32;
using System.Collections.ObjectModel;
namespace S2IPictureWatermarker
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
ObservableCollection<picture> Pictures;
Position ThisStep = new Position();
public MainWindow()
{
InitializeComponent();
Startup();
}
private void Startup()
{
ThisStep.CurrentStep = 1;
Pictures = new ObservableCollection<picture>();
Step1.Visibility = System.Windows.Visibility.Visible;
Step2.Visibility = System.Windows.Visibility.Collapsed;
Step3.Visibility = System.Windows.Visibility.Collapsed;
Step4.Visibility = System.Windows.Visibility.Collapsed;
}
//GroupEditLstBx.ItemsSource = SelectedPhotos
private void AddPicture_Click(object sender, RoutedEventArgs e)
{//add picture to list of pictures
//get photo(s) location
OpenFileDialog openFileDialog1 = new OpenFileDialog();
InitializeOpenFileDialog(openFileDialog1);
Nullable<bool> result = openFileDialog1.ShowDialog();
//if photos are found, add to collection
if (result == true)
CreatePictureCollection(openFileDialog1.FileNames);
}
private void CreatePictureCollection(string[] FullPathNames)
{
foreach (string pathName in FullPathNames)
{
picture newPicture = new picture();
newPicture.NewPicture(pathName);
if(Pictures.Count >= 1)
{//dont do anything
}
else
{
PictureNames.ItemsSource = Pictures;
}
Pictures.Add(newPicture);
}
}
private void InitializeOpenFileDialog(OpenFileDialog openFileDialog1)
{
// Set the file dialog to filter for graphics files.
openFileDialog1.Filter =
"Images (*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF|" +
"All files (*.*)|*.*";
// Allow the user to select multiple images.
openFileDialog1.Multiselect = true;
// ^ ^ ^ ^ ^ ^ ^
openFileDialog1.Title = "My Image Browser";
}
}
}
图片类代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
using System.ComponentModel;
namespace S2IPictureWatermarker
{
class picture : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private int height;
public int Height
{
get { return height; }
set { height = value; OnPropertyChanged("Height"); }
}
private int width;
public int Width
{
get { return width; }
set { width = value; OnPropertyChanged("Width"); }
}
private string type;
public string Type
{
get { return type; }
set { type = value; OnPropertyChanged("Type"); }
}
private string location;
public string Location
{
get { return location; }
set { location = value; OnPropertyChanged("Location"); }
}
private string name;
public string Name
{
get { return name; }
set { name = value; OnPropertyChanged("Name"); }
}
private int orgHeight;
public int OrgHeight
{
get { return orgHeight; }
set { orgHeight = value; OnPropertyChanged("OrgHeight"); }
}
private int orgWidth;
public int OrgWidth
{
get { return orgWidth; }
set { orgWidth = value; OnPropertyChanged("OrgWidth"); }
}
private Image currentPhoto;
public Image CurrentPhoto
{
get { return currentPhoto; }
set { currentPhoto = value; OnPropertyChanged("CurrentPhoto"); }
}
//methods
//NEW PICTURE
public bool NewPicture(string PictureFullPath)
{
bool Created = false;
try
{
//set path(location), name, type
Location = Path.GetPathRoot(PictureFullPath);
Name= Path.GetFileNameWithoutExtension(PictureFullPath);
Type = Path.GetExtension(PictureFullPath);
//set current image
CurrentPhoto = Image.FromFile(PictureFullPath);
//set height and width
Height = CurrentPhoto.Height;
Width = CurrentPhoto.Width;
Created = true;
}
catch (Exception)
{
throw;
}
return Created;
}
//create the OnPropertyChanged method to raise
protected void OnPropertyChanged(string changedName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(changedName));
}
}
}
}
答案 0 :(得分:0)
我相信你不能把System.Windows.Image放在canvas元素的背景中。那是因为System.Windows.Image是UIElement而不能用作画笔。您可以从ImageSource(通过Uri)创建ImageBrush并将其放入后台。或者您可以创建ContentControl而不是canvas元素,并将演示者的图像放入其中。
答案 1 :(得分:0)
你好在canvas元素中尝试这样的东西。
<Canvas.Background>
<ImageBrush ImageSource="{Binding CurrentPhoto}" Stretch="UniformToFill"></ImageBrush>
</Canvas.Background>
编辑: 如果这不起作用,请将您的属性“CurrentPhoto”设置为图像画笔。