Динамически нарисовать изображение на холсте в Silverlight - PullRequest
1 голос
/ 16 февраля 2012

Я пытаюсь собрать небольшой игровой движок в Silverlight.

Однако в настоящее время я застрял на проблеме более низкого уровня: способность рисовать изображения в разных положениях. Я намерен делать это динамически с помощью кода, поскольку, как я видел, большинство всего в XAML имеет тенденцию быть чем-то статичным.

Вместо этого я изменил базовую «сетку» на холст, чтобы я мог рисовать на ней где угодно. Возможно, это была плохая идея, хотя, я не знаю. Любой или все советы помогут.

        InitializeComponent();
        Image img = new Image();
        img.Source = new BitmapImage(new Uri("Generic URL here"));
        ((BitmapImage)(img.Source)).DownloadProgress += new System.EventHandler<DownloadProgressEventArgs>(TestEventHandler);

        Rect position = new Rect(new Point(25, 25), img.RenderSize);

        LayoutRoot.Children.Add(img);
        img.Arrange(position);

Моя первоначальная попытка выше заключалась в том, чтобы использовать выше функцию Arrange, чтобы «переместить» изображение на новую позицию. Однако я понятия не имею, как это работает, и когда я сделал приведенный выше код, изображение больше не отображалось на экране.

Несвязанный вопрос: возможно ли хранить изображения в приложении Silverlight, чтобы они не загружались через URL? Я знаю, что, скорее всего, так и есть, но я действительно хочу спросить, как мне поступить?

Спасибо всем за любую помощь.

-Stefan Zuefeldt

Ответы [ 4 ]

1 голос
/ 21 февраля 2012
  • Хорошая идея - использовать Canvas вместо Grid. Canvas лучше, чем Grid, если вы хотите изменить положение дочерних элементов управления

  • Чтобы переместить изображение в точку p, вы можете сделать это:

    • добавить изображение на холст
    • вызов Canvas.SetLeft (img, p.X) и Canvas.SetTop (img, p.Y)


  • Если вы хотите добавить изображения в xap, вы можете легко добавить изображения в проект и установить тип сборки изображений на «Содержимое» (по умолчанию «Нет» или «Ресурс», я не уверен), а затем использовать относительный url: img.Source = new BitmapImage (new Uri ("/ tmp.jpg", UriKind.Relative));
1 голос
/ 16 февраля 2012

XAML не должен быть статичным.Если вы комбинируете свой XAML с моделью данных и используете привязку данных, XAML может с радостью использовать.

Вы можете перемещать элементы на холсте, что вам нужно, это свойства зависимостей Canvas.Top и Canvas.Left

здесь представляет собой небольшой учебник о простой анимации, которую вы описываете.если вы заглянете в «учебник по игре с Silverlight», вы найдете тонны и тонны блогов, статей и демонстраций с исходным кодом.

что касается другого вашего несвязанного вопроса ... вы можете встроить изображения в свое приложение. здесь - хороший источник информации о большинстве методов доступа к файлам и изображениям

1 голос
/ 16 февраля 2012

Я работаю над SL-приложениями с базовым интерфейсом некоторое время. Я могу дать вам несколько советов, основываясь на моем небольшом опыте.

Вместо этого я изменил базовую сетку на Canvas, чтобы я мог рисовать где угодно на нем. Возможно, это была плохая идея ...

Я думаю, что это очевидный выбор. Что касается размещения материала на холсте, то из этой ссылки SL Layout - Absolute Layout

Чтобы создать макет на основе абсолютного позиционирования, необходимо заменить Сетка с холстом. ... Чтобы расположить элементы управления на Canvas, вы устанавливаете следующие вложенные свойства для элемента управления: Canvas.Left & Canvas.Top


.. возможно ли хранить изображения с помощью приложения Silverlight, как не загружать их через URL? Я знаю, что это вероятно, но то, что я действительно хочу спросить, а как бы я поступил так?

Вы всегда можете хранить свои изображения и фигуры в словаре или чего-либо (следовательно, в памяти), поэтому изменение размера изображений (например, когда загрузка завершена) может спасти вас от чрезмерного потребления памяти.

Это некоторые из вещей, которые приходят мне в голову. Удачи.

1 голос
/ 16 февраля 2012

Свойство зависимости изображения должно быть установлено для размещения изображения на холсте.

Canvas.SetTop , Canvas.SetLeft

Ко второму.Конечно, ваши изображения могут быть сохранены в приложении Silverlight.Но их действие сборки должно быть установлено на Embeded Resource.

img.Source = new BitmapImage(new Uri("/MyNameSpace;components/images/someimage.png", UriKind.Relative));
...