WPF - 将2维int数组显示为表

时间:2014-06-09 21:56:59

标签: wpf multidimensional-array

我有int[40,40],包含1和0。

我想创建一个二维表40x40,这样绿色方块代表1,红色方块代表0。

我还想为每个单元格添加一个工具提示,并显示索引。

这样的事情:

Bit map

我该怎么做?

2 个答案:

答案 0 :(得分:3)

我会首先创建一个锯齿状数组(我不认为这是绑定到多维数组的好方法,因为它不是IEnumerable)。然后,您可以执行简单的2级嵌套项控件,例如:

<ItemsControl ItemsSource="{Binding Items}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <ItemsControl ItemsSource="{Binding Bits}">
                <ItemsControl.Resources>
                    <converters:BoolToBrushConverter x:Key="BoolToBrush" TrueBrush="Green" FalseBrush="Red" />
                </ItemsControl.Resources>
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal" />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Rectangle Width="10" Height="10" 
                            Fill="{Binding Converter={StaticResource BoolToBrush}}"
                            Stroke="White" StrokeThickness="1"
                        />
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

&#34; BoolToBrushConverter&#34;是IValueConverter,它将true / false转换为绿色/红色画笔:

public class BoolToBrushConverter : IValueConverter
{
    public Brush TrueBrush { get; set; }
    public Brush FalseBrush { get; set; }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return ((value as bool?).GetValueOrDefault(false) ? TrueBrush : FalseBrush);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

修改

我使用锯齿状数组bool[][]对其进行了测试,并遇到了一些奇怪的行为 - 似乎运行时将每个嵌套的bool[]转换为字符串。所以我创建了一个包装类&#34; BitArray&#34;,并制作了#34; Items&#34;类型BitArray[],它按预期工作。

public class BitArray
{
    public bool[] Bits { get; set; }

    public BitArray(params bool[] args)
    {
        Bits = args;
    }
}

测试数据:

Items = new BitArray[]
{
    new BitArray(true, false, true, true),
    new BitArray(false, false, true, false),
    new BitArray(false, true, true, false),
    new BitArray(true, false, true, false),
};

Bit map

编辑#2 请注意,由于您希望将索引显示为工具提示,因此我建议制作另一个包装类来保存内部bool以及当前(i,j)索引。

答案 1 :(得分:1)

工作很棒。 对于工具提示,我改变了一点,就像你说的那样。

这是最终代码

1位类

public class Bit
{
    public string Index { get; set; }
    public bool Value { get; set; }
}

1行(40位)的等级

public class BitsArray
{
    public Bit[] Bits { get; set; }
    public BitsArray()
    {
        Bits = new Bit[40];
        for (int i = 0; i < 40; i++)
            Bits[i] = new Bit();
    }
}

最后是40x40阵列。

BitsArray[] MyBits= new BitsArray[40];
for (int i = 0; i < 40; i++)
    MyBits[i] = new BitsArray();

xaml

<DataTemplate>
    <Rectangle Width="10" Height="10"
    Fill="{Binding Path=Value, Converter={StaticResource BoolToBrush}}"
    ToolTip="{Binding Path=Index}" Stroke="White" StrokeThickness="1"/>
</DataTemplate>