C#wpf绑定图像的问题

时间:2013-06-26 13:34:10

标签: c# wcf-binding

美好的一天, 我正在尝试创建一个应用程序,以便我可以对照片进行一些基本编辑。我已将一个集合绑定到一个列表框,我可以获取所有文本信息,但我无法显示我的图像。我看到的每个例子都使用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));
            }
        }
    }
}

2 个答案:

答案 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”设置为图像画笔。