0

Canvasにあるすべての画像とテキストの「レイヤー」をSilverlightで表示するリストボックスが必要です。リストボックスを表示しようとしたとき、または要素を追加したときにリストボックスを表示しているときに、現在使用しているコードがクラッシュします。理由がわかりません。誰かがこれで私を正しい方向に向けることができますか?

XML-

                            <Grid DataContext="{Binding Path=Project}">
                                ...
                                ...
                                <TextBlock Name="textBlock1" Text="Layers" Margin="18,16,0,0" />

                                <StackPanel Grid.Row="1" Grid.RowSpan="2" Grid.ColumnSpan="2">
                                    <ListBox ItemsSource="{Binding Path=Elements}" Height="175" Name="listBox1" Width="172"/>
                                </StackPanel>

                            </Grid>

Project.cs

        //List of elements
    private ObservableCollection<FrameworkElement> elements;
    public ObservableCollection<FrameworkElement> Elements
    {
        get { return elements; }
        set
        {
            elements = value;
            NotifyPropertyChanged("Elements");
        }
    }
// An example of how an element is added to the Elements collection
// There are also image elements added similarly
private void AddTextElement(object param)
    {
        TextBlock textBlock = new TextBlock();
        textBlock.Text = "New Text";
        textBlock.Foreground = new SolidColorBrush(Colors.Gray);
        textBlock.FontSize = 25;
        textBlock.FontFamily = new FontFamily("Arial");
        textBlock.Cursor = Cursors.Hand;
        textBlock.Tag = null;


        this.Elements.Add(textBlock);
        numberOfElements++;


        this.SelectedElement = textBlock;
        this.selectedTextElement = textBlock;
    }

private void AddImageElement(object param)
    {
        bool? gotImage;
        string fileName;
        BitmapImage imageSource = GetImageFromLocalMachine(out gotImage, out fileName);


        if (gotImage == true)
        {
            Image image = new Image();
            OrderElements(image);
            image.Name = fileName;
            image.Source = imageSource;
            image.Height = imageSource.PixelHeight;
            image.Width = imageSource.PixelWidth;
            image.MaxHeight = imageSource.PixelHeight;
            image.MaxWidth = imageSource.PixelWidth;
            image.Cursor = Cursors.Hand;
            image.Tag = null;


            AddDraggingBehavior(image);
            image.MouseLeftButtonUp += element_MouseLeftButtonUp;

            this.Elements.Add(image);
            numberOfElements++;

            this.SelectedElement = image;
            this.SelectedImageElement = image;

        }
    }
4

3 に答える 3

1

1つの理由は、Grid要素でPathプロパティを使用してバインドするためである可能性があります。

バインディングソースを使用し、プロジェクトオブジェクトをバインディングソースを呼び出すときに指すことができる静的リソースとして設定する必要があります。

このような:

<Window
    xlmns:local="NamespaceOfMyProject">

    <Window.Resources>
        <local:Project x:key="MyProjectResource" />
    </Window.Resources>

    <Grid DataContext="{Binding Source={StaticResource MyProjectResource}}>
    ....
    </Grid>
    ....
</Window>

理由は次のとおりです。オブジェクトを指す場合は「ソース」を使用し、プロパティを指す場合は「パス」を使用します。

DataContextを設定する別の方法は、このC#コードを使用して、コードビハインドでそれを行うことです。ただし、最初にグリッドに名前を付けて、コードビハインドで参照できるようにします。

<Grid x:Name="myGrid">

コードビハインド:

myGrid.DataContext = new Project();
于 2012-09-26T16:08:05.407 に答える
0

キャンバスに追加した FrameworkElements を持っているため、クラッシュしていると思いますが、それらをリストにも追加しています。FrameworkElements は通常、ビジュアル ツリーに複数回追加されることを好みません。

これが問題である場合は、次のような方法で回避できます (リストを にバインドしますElementsAsStrings)。

    private ObservableCollection<FrameworkElement> elements;
    public ObservableCollection<FrameworkElement> Elements
    {
        get { return elements; }
        set
        {
            if(elements != null)
                elements.CollectionChanged -= onElementsChanged;
            elements = value;
            if(elements != null)
                elements.CollectionChanged += onElementsChanged;

            NotifyPropertyChanged("Elements");
            NotifyPropertyChanged("ElementsAsStrings");
        }
    }

    public IEnumerable<string> ElementsAsStrings
    {
        get
        {
            foreach(var element in Elements)
            {
                if(element is TextBox)
                    yield return (element as TextBox).Text;
                // More cases here
            }
        }
    }

    private void onElementsChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        NotifyPropertyChanged("ElementsAsStrings");
    }
于 2012-09-28T01:27:56.120 に答える
0

画像を正しく操作しないと、通常、クラッシュが発生します。要素を実装するためのコードと、画像の設定方法を示します。

また、XAMLには、画像とテキストを設定するItemTemplateがありません。

于 2012-09-27T14:35:22.730 に答える