0

私は現在 C# WPF 4.5 で作業しており、インタラクティブ グリッドを作成しようとしています。グリッド セルの正方形のサイズ (幅 = 高さ)、列数、行数を指定して、画面上にグリッドを動的に生成したいと思います。

生成されたグリッドについては、グリッド ラインが表示されるようにしたいと思います。他に何もなければ、各セル内に境界線を引くだけでこれをエミュレートできると思います。さらに、一度に 1 つ以上のセルを選択できる機能を備えた、ユーザーがどのセルをクリックしたか (つまり、グリッドの列と行を返すクリック) を判断できるイベントが必要です。

このようなものを作成する方法についての助けやアイデアはありますか、それとももっと良い方法がありますか? 前もって感謝します!

編集:ここに私が行ったいくつかの進歩があります:

  1. カスタムチェックボックスを作成しました:

        <Style x:Key="styleCustomCheckBox" TargetType="{x:Type CheckBox}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type CheckBox}">
                    <Grid x:Name="Background" Background="Transparent">
                        <Rectangle x:Name="fillCheckBox"/>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsChecked" Value="False">
                            <Setter TargetName="fillCheckBox" Property="Fill" Value="Transparent"/>
                        </Trigger>
                        <Trigger Property="IsChecked" Value="True">
                            <Setter TargetName="fillCheckBox" Property="Fill" Value="Red"/>
                            <Setter TargetName="fillCheckBox" Property="Opacity" Value=".3"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

次に、そのスタイルのカスタム チェックボックスをグリッドに入力します。

<CheckBox Grid.Column="1" Grid.Row="1" Style="{StaticResource styleCustomCheckBox}" />

それでは、チェックボックスがチェックされているかどうか、およびそれがどのグリッドの行と列にあるかを収集できるグリッド内の各チェックボックスをマップしたいと思います。これについてどうすればよいですか?

4

1 に答える 1

2

私はItemsControlItemsPanelTemplatea に設定して使用しUniformGrid、それItemTemplateはあなたに設定されていますCheckBox

ItemsControl.ItemsSourceコード ビハインドでデータ オブジェクトのコレクションにバインドできれば、最も簡単です。例えば:

<ItemsControl ItemsSource="{Binding MyCollection}">
    <!-- ItemsPanelTemplate -->
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Rows="5" Columns="5" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

    <!-- ItemTemplate -->
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Border BorderBrush="Red" BorderThickness="1">
               <CheckBox Style="{StaticResource styleCustomCheckBox}" />
            </Border>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

チェックした項目の行または列のインデックスを指定する必要がある場合は、それをデータ項目に追加し、 のGrid代わりに通常の を使用して、次のようUniformGridに を適用できます。ItemContainerStyle

<!-- ItemContainerStyle -->
<ItemsControl.ItemContainerStyle>
    <Style>
        <Setter Property="Grid.Column" Value="{Binding ColumnIndex}" />
        <Setter Property="Grid.Row" Value="{Binding RowIndex}" />
    </Style>
</ItemsControl.ItemContainerStyle>

クリックされたアイテムを決定するには、データオブジェクトをどのように構造化するか、およびクリックで実際に何をしたいかによって異なります。

四角形の後ろにデータ項目が必要な場合は、次のDataContextように を使用できます。

void MyCheckBox_Clicked(object sender, EventArgs e)
{
    var selectedItem = ((CheckBox)sender).DataContext;
}

IsCheckedまたは、次のようなプロパティを持つデータ項目のようなものがある場合:

<CheckBox IsChecked="{Binding IsChecked}" 
          Style="{StaticResource styleCustomCheckBox}" />

PropertyChangedデータ項目のIsCheckedプロパティのイベントにイベントを簡単に添付し、そこでコードを実行できます。

Button3 番目の方法として、 for を使用してItemTemplate、選択したアイテムをCommandParameter

<Border BorderBrush="Red" BorderThickness="1">
    <Button CommandParameter="{Binding }" ... />
</Border>

私はあなたのコードベースとあなたが何をしようとしているのかを知らないので、明確な答えを与えることはできませんが、これがあなたに大まかな出発点を与え、あなたの正しい方向性を示すのに十分な情報を与えてくれることを願っています.状況。

于 2013-02-28T17:49:33.133 に答える