C # WPF OnPaint метод альтернативы? - PullRequest
7 голосов
/ 27 июля 2010

В C # WinForms при создании небольшой игры здесь или там я бы написал быстрый класс, который был подклассом для System.Windows.Forms.Panel и в конструкторе, установив DoubleBuffered в значение true.Затем вы можете переопределить метод OnPaint для отображения игровых элементов.Я делал это в течение 2 или 3 лет, но я действительно стараюсь использовать WPF и XAML, мне очень нравится это для обычных макетов приложений.Какой эквивалент есть в WPF?

Ответы [ 4 ]

4 голосов
/ 27 июля 2010

Не ответ, который вы ищете, но: вы не должны использовать WPF для игр. Придерживайтесь форм (которые не будут выбрасываться MS, поскольку WPF не заменяет формы) или попробуйте XNA, если хотите перейти на следующий уровень.


ОБНОВЛЕНИЕ: Вчера я очень быстро ответил на вопрос, потому что я спешил и , потому что я также изучал WPF, чтобы делать игры, поэтому я не хотел оставить ОП без правильного ответа.

Вот сделка:

Цель WPF - упростить разработку с богатым пользовательским интерфейсом. Во-первых, MS поняла, что Forms способ кодирования сочетает поведение с представление . Это плохо, как для разработки приложений, так и для удобства обслуживания. Кроме того, в формах все должно быть закодировано; Сама библиотека очень мало делает для пользователя. Например, если вы хотите, чтобы кнопка имела другой вид, вы должны переопределить ее метод Draw, а затем каким-то образом нарисовать любую графику, которая ее представляет.

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

Все это, конечно, обходится дорого; например, WPF медленнее, чем формы. Игры должны быть быстрыми и стараться не тратить ресурсы. В играх каждое поведение, как правило, кодируется (конечно, не пользовательский интерфейс), каждая презентация настраивается (2D-графика или 3D-объект), поэтому вам все равно придется много писать. Таким образом, вы используете дорогую технологию, но отбрасываете большинство ее преимуществ.

Но я не специалист. Вы можете проверить этот блог, где бывший сотрудник Microsoft почти два года пытался использовать WPF для игр. И он делает вывод:

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

Оттуда я сделал большинство своих выводов.

2 голосов
/ 27 июля 2010

UIElement.OnRender .

Быть использованным экономно; это не так эффективно .

Это немного смена парадигмы.

1 голос
/ 27 июля 2010

Есть несколько контейнеров для отображения материала.Тот, который вы хотели бы использовать, - это Canvas (единственный с системой координат) некоторые подробности

Ключ в том, какая игра вам нужна.Используя xaml, это может быть какая-то базовая игра, похожая на приложение (базовые рисунки и т. Д.).Для чего-то большего рассмотрите использование XNA.Преимущество xaml в том, что с пользователем легко взаимодействовать с помощью обработчиков, например, просто вывести строку на экран, что немного сложнее для XNA.Также использование xmal u может сделать игру для IE (XABP), Windows Phone и Silverlight.

То, что вы делали с формой, - это игра в стиле петли.

Update ();Paint ();

, и это больше соответствует XNA.Но если вы хотите использовать WPF и Xaml, используйте Canvans и LayoutUpdate Handler.

0 голосов
/ 30 января 2017

Вы можете попробовать добавить пользовательский элемент управления Windows Form внутри WPF с помощью хоста WinForms и рисовать там с помощью OnPaint

//WPF XAML
<WindowsFormsHost x:Name="formsHost" HorizontalAlignment="Left" Visibility="Visible" Grid.Column="0" Grid.Row="0"></WindowsFormsHost>


//WPF CodeBehind
YourCustomWinFormsControls panel = new YourCustomWinFormsControls ();
        panel.Width = XXX;
        panel.Height = XXX;
        formsHost.Child = panel;

//WinForms Custome Control Code

protected override void OnPaint(PaintEventArgs pe)
    {
        //DO STUFF HERE
        base.OnPaint(pe);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...