0

迷路で経路探索を行うためのリー アルゴリズムの簡単なプログラム デモンストレーションをプログラミングするタスクがあります。グラフィカルにインタラクティブにしたい: セルをクリックできる可変量の行と列を持つ 2D テーブルを作成します (クリックされたセルの位置を追跡できる必要があります)。これは、ユーザーが迷路の障害物を描画したり、開始点を設定したりできるようにしたいためです。これを行うのに役立つ最適なグラフィカル コンポーネントは何でしょうか。また、そのセルと対話するにはどうすればよいですか?

4

1 に答える 1

2

あなたのコメントに続いて、WPFはカスタムレイアウトを行うように設計されているため、このタスクのより自然な候補であると言えます. これは、セルのグリッドを表示する均一なグリッドを持つ項目コントロールを使用してまとめたコード例です。セルをクリックするとセルが選択され、もう一度クリックすると選択が解除されます。

これは優れた WPF ではありませんが、いくつかのアイデアが得られ、作業を開始できるようになるかもしれません。

応用:

適用例イメージ

XAML:

<Window x:Class="LeeAlgorithm.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="380" Width="350">
    <Grid>
        <ItemsControl ItemsSource="{Binding Cells}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <UniformGrid Columns="5" />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <DataTemplate.Resources>
                        <Style TargetType="TextBlock">
                            <Setter Property="FontSize" Value="18"/>
                            <Setter Property="HorizontalAlignment" Value="Center"/>


        </Style>
                </DataTemplate.Resources>
                <Grid Width="30" Height="30" Margin="2">
                    <DockPanel ZIndex="9999">
                        <!-- This is a hack to capture the mouse click in the area of the item -->
                        <Rectangle 
                            Fill="Transparent" 
                            DockPanel.Dock="Top" 
                            MouseDown="UIElement_OnMouseDown" 
                            Tag="{Binding}" />
                    </DockPanel>
                    <Grid>
                    <Rectangle Fill="{Binding Path=Color}" Stroke="Red" StrokeDashArray="1 2" />
                    <TextBlock Margin="3,3,3,0" Text="{Binding Path=CellNumber}"/>
                    </Grid>
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

コード ビハインド (MainWindow.xaml.cs コード):

namespace LeeAlgorithm
{
    using System.Collections.ObjectModel;
    using System.ComponentModel;
    using System.Windows;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Shapes;

    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            this.Cells = new ObservableCollection<Cell>();

            for (int i = 0; i != 50; ++i)
            {
                this.Cells.Add(new Cell { CellNumber = i });
            }

            InitializeComponent();

            DataContext = this;
        }

        public ObservableCollection<Cell> Cells { get; private set; }

        private void UIElement_OnMouseDown(object sender, MouseButtonEventArgs e)
        {
            var cell = (Cell)((Rectangle)sender).Tag;

            if (!cell.IsSelected)
            {
                cell.Color = new SolidColorBrush(Colors.HotPink);
                cell.IsSelected = true;
            }
            else
            {
                cell.Color = new SolidColorBrush(Colors.Silver);
                cell.IsSelected = false;
            }
        }
    }

    public class Cell : INotifyPropertyChanged
    {
        private int cellNumber;

        private SolidColorBrush color = new SolidColorBrush(Colors.Silver);

        public event PropertyChangedEventHandler PropertyChanged;

        public int CellNumber
        {
            get
            {
                return this.cellNumber;
            }
            set
            {
                if (value == this.cellNumber)
                {
                    return;
                }
                this.cellNumber = value;
                this.OnPropertyChanged("CellNumber");
            }
        }

        public SolidColorBrush Color
        {
            get
            {
                return this.color;
            }
            set
            {
                if (Equals(value, this.color))
                {
                    return;
                }
                this.color = value;
                this.OnPropertyChanged("Color");
            }
        }

        public bool IsSelected { get; set; }

        protected virtual void OnPropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

ハッピーコーディング!

于 2013-02-27T12:48:19.267 に答える