0

こんにちは、写真の基本的な編集を行うためのアプリケーションを作成しようとしています。コレクションをリストボックスにバインドしました。すべてのテキスト情報を入力できますが、画像を表示できません。私が見るすべての例は、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));
            }
        }
    }
}
4

2 に答える 2

0

Canvas 要素の背景に System.Windows.Image を配置することはできないと思います。これは、System.Windows.Image が UIElement であり、ブラシとして使用できないためです。ImageSource から (Uri によって) ImageBrush を作成し、それを背景に配置できます。または、キャンバス要素の代わりに ContentControl を作成し、プレゼンターからの画像を配置することもできます。

于 2013-06-26T13:50:27.120 に答える
0

こんにちは、キャンバス要素でこのようなことを試してください。

<Canvas.Background>
                    <ImageBrush ImageSource="{Binding CurrentPhoto}" Stretch="UniformToFill"></ImageBrush>
</Canvas.Background>

編集:これが機能しない場合は、プロパティ「CurrentPhoto」をイメージブラシにします。

于 2013-06-26T14:39:43.640 に答える