Я пытаюсь создать пользовательский элемент управления в WPF для представления платы Движения, которая является по существу просто сеткой черных линий с точками на некоторых пересечениях.
В данный момент я использую управление Сеткой для обработки размещения камней, но одна из трудностей - то, что камни помещаются в пересечения линий сетки, а не между ними, поэтому если я хочу провести линии, они должны пройти центры ячеек сетки.
Я все еще довольно плохо знаком с WPF, таким образом, я не действительно уверен, как я должен приближаться к этому; я должен вручную красить строки каждым разом рендеринг управления (если так, как?), или там лучший путь?
Я только что добавил эту запись в свой блог:
EDIT: Переместил файл на мой Google диск
Думаю, это поможет вам, вот результат, который вы получите. Вы можете скачать проект там же.
К этому можно подходить разными способами.
Например. Один из способов - использовать DrawingBrush для заливки фона панели. Вот несколько примеров DrawingBrush:
(источник: microsoft.com )
Скорее всего, вам не нужно использовать Grid. Для случайного позиционирования Canvas подходит лучше. Если вам не нравятся кисти, вы можете использовать Геометрии или Фигуры для рисования линий или других фигур. Я не отсылаю вас к DrawingVisuals , потому что они могут быть немного сложнее для понимания с самого начала.
Обновлено : нашел эту статью в CodeProject: Нарисуйте настольную игру в WPF . Может быть, тебе это пригодится.
Надеюсь, это поможет,
Ура, Анвака.
Некоторое время назад я создал шахматную доску, я создал ItemsControl, каждый элемент которого является ItemsControl тоже с шаблонами маленьких прямоугольников. вот мой код
<UserControl x:Class="Checker.Controls.Board"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:models="clr-namespace:Checker.Models"
xmlns:usercontrols="clr-namespace:Checker.Controls"
xmlns:converters="clr-namespace:Checker.Converters">
<UserControl.Resources>
<models:BoardModel x:Key="boardModel"/>
<converters:BoolToBorderColorConverter x:Key="boolToBorderColorConverter"/>
<DataTemplate DataType="{x:Type models:Figure}">
<usercontrols:FigureControl/>
</DataTemplate>
</UserControl.Resources>
<Border>
<ItemsControl ItemsSource="{Binding Source={StaticResource boardModel}, Path=BoardItems}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<ItemsControl ItemsSource="{Binding}" MouseDown="ItemsControl_MouseDown">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Background="{Binding Path='IsFirstColor', Converter={StaticResource boolToBorderColorConverter}}" BorderBrush="Black" BorderThickness="1" Width="50" Height="50" MouseDown="ItemsControl_MouseDown">
<ContentPresenter Content="{Binding FigureOnBoard}">
</ContentPresenter>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Border>
</UserControl>
Надеюсь, это поможет
Не зная больше о том, какого эффекта вы пытаетесь достичь, я просто отмечу, что вы также можете нарисовать прямо на BufferedImage. Так что все, что вы можете сделать на экране, вы можете сделать прямо на самом изображении.
Так что если все, что вы хотите, это один нарисованный поверх другого, это очень легко. Просто захватите объект Graphics для базового изображения и нарисуйте на нем другой.
Опять же, в зависимости от того, на какой эффект вы идете, это может не сработать. Более подробная информация позволила бы лучше помочь. Например, является ли это заданием для AlphaComposite, как упоминает другой ответчик, или пользовательским ImageOp (или некоторой комбинацией существующих ImageOps).
-121--835974-Мне также интересно, почему вы хотите это сделать, но если у вас действительно есть причины, у вас есть как минимум два варианта:
Если требуется отключить генерацию трассировки стека для собственных реализаций Exception, можно просто переопределить метод fillInStackTrace:
public static class MyException extends Exception {
@Override
public Throwable fillInStackTrace() {
return this;
}
}
Если вы хотите отключить его для всех исключений , можно использовать агент инструментария с байтовым кодом для замены метода fillInStackTrace в классе Throwable. Однако это будет работать только для Java 6, поскольку в Java 5 невозможно заменить собственный метод (fillInStackTrace) методом Java с помощью инструментария.
-121--3823311-Случайные мысли, которые могут помочь:
На самом деле не подробный способ - но именно так я бы подошел к проблеме