简体   繁体   中英

Adding Custom Class to XAML in WPF

So I created this class Sprite.cs:

class Sprite : INotifyPropertyChanged
{
    double _Speed;        
    RectangleGeometry _SpriteRectangleGeometry;
    Path _SpritePath;
    public Sprite()
    {
        _SpriteRectangleGeometry = new RectangleGeometry();
        _SpriteRectangleGeometry.Rect = new Rect(0, 0, 50, 50);
        Speed = 50;
        _SpritePath = new Path();
        Color = Brushes.Black;
        _SpritePath.Data = _SpriteRectangleGeometry;
    }
    public Sprite(double xpos, double ypos, double height, double width, double speed, SolidColorBrush color)
    {
        _SpriteRectangleGeometry = new RectangleGeometry();
        _SpriteRectangleGeometry.Rect = new Rect(xpos, ypos, width, height);
        this.Speed = speed;
        _SpritePath = new Path();
        this.Color = color;
        _SpritePath.Data = _SpriteRectangleGeometry;
    }
    public double XPos
    {
        get { return _SpriteRectangleGeometry.Rect.X; }
        set
        {
            _SpriteRectangleGeometry.Rect = new Rect(value, YPos, Width, Height);
            //Notify the binding that the value has changed.
            this.OnPropertyChanged("XPos");
        }
    }
    public double YPos
    {
        get { return _SpriteRectangleGeometry.Rect.Y; }
        set
        {
            _SpriteRectangleGeometry.Rect = new Rect(XPos, value, Width, Height);
            //Notify the binding that the value has changed.
            this.OnPropertyChanged("YPos");
        }
    }
    public double Speed
    {
        get { return _Speed; }
        set { _Speed = value; }
    }
    public double Width
    {
        get { return _SpriteRectangleGeometry.Rect.Width; }
        set { _SpriteRectangleGeometry.Rect = new Rect(XPos, YPos, value, Height); }
    }
    public double Height
    {
        get { return _SpriteRectangleGeometry.Rect.Height; }
        set { _SpriteRectangleGeometry.Rect = new Rect(XPos, YPos, Width, value); }
    }
    public SolidColorBrush Color
    {
        get { return (SolidColorBrush)_SpritePath.Fill; }
        set { _SpritePath.Fill = value; }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string strPropertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(strPropertyName));
    }
}

What I want to do now is add an instance of Sprite to the Xaml, but when i do i get this error:

The value of type 'Sprite" cannot be added to collection or dictionary of type UIElementCollection

Any advice?

The Sprite should derive from the UIElement class to be added to UIElementCollection . Also you could wrap it with ContentControl and provide a DataTemplate which would create some UIElement for your sprite object.

You have to add it to the resources section rather than just inline (and make sure it has a key)

<src:Sprite x:Key="data"/>

You also need to have declared your namespace at the top of the file

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM