Как потянуть сетку в WPF

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

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

Я все еще довольно плохо знаком с WPF, таким образом, я не действительно уверен, как я должен приближаться к этому; я должен вручную красить строки каждым разом рендеринг управления (если так, как?), или там лучший путь?

5
задан Will Vousden 28 November 2012 в 13:07
поделиться

4 ответа

Я только что добавил эту запись в свой блог:

EDIT: Переместил файл на мой Google диск

Думаю, это поможет вам, вот результат, который вы получите. Вы можете скачать проект там же.

0
ответ дан 14 December 2019 в 04:36
поделиться

К этому можно подходить разными способами.

Например. Один из способов - использовать DrawingBrush для заливки фона панели. Вот несколько примеров DrawingBrush:

alt text
(источник: microsoft.com )

Скорее всего, вам не нужно использовать Grid. Для случайного позиционирования Canvas подходит лучше. Если вам не нравятся кисти, вы можете использовать Геометрии или Фигуры для рисования линий или других фигур. Я не отсылаю вас к DrawingVisuals , потому что они могут быть немного сложнее для понимания с самого начала.

Обновлено : нашел эту статью в CodeProject: Нарисуйте настольную игру в WPF . Может быть, тебе это пригодится.

Надеюсь, это поможет,

Ура, Анвака.

5
ответ дан 14 December 2019 в 04:36
поделиться

Некоторое время назад я создал шахматную доску, я создал 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>

Надеюсь, это поможет

2
ответ дан 14 December 2019 в 04:36
поделиться

Не зная больше о том, какого эффекта вы пытаетесь достичь, я просто отмечу, что вы также можете нарисовать прямо на 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-

Случайные мысли, которые могут помочь:

  1. Используйте сетку - она там, и она должна хорошо работать для позиционирования вещей
  2. Сетка Камера» - это в основном вещь с тремя состояниями, линии сетки ни при чем, линии сетки с белым камнем сверху, линии сетки с черным камнем сверху - это должна быть многоразовая часть разметки WPF - возможно, пользовательский контроль, возможно, что-то еще (я все еще слишком новичок для WPF тоже). У меня будет соблазн связать это с вашими данными.
  3. Вы можете присоединить поведение к содержимому ячейки для, когда она нажата, и для других вещей

На самом деле не подробный способ - но именно так я бы подошел к проблеме

1
ответ дан 14 December 2019 в 04:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: