7

私は問題があります。

VS Designer を使用せずに、すべてを C# でプログラム的に記述したいと考えています。

だから、私は画像と DataGrid を作成しています (そしてそれを MainWindow Grid の子として追加しています):

  Image img = new Image();
  Uri uri = new Uri(@"C:\d1.jpg");
  img.Source = new System.Windows.Media.Imaging.BitmapImage(uri);

  DataGrid dg = new DataGrid();
  grid1.Children.Add(dg);

次に、たとえば、テキストの 3 つと画像の 1 つの 4 つの列を追加します。最初に、サンプル データを使用して DataTable と DataRow を作成する必要があります。

  DataTable dt = new DataTable();

  dt.Columns.Add("Column1");
  dt.Columns.Add("Column2");
  dt.Columns.Add("Column3");
  dt.Columns.Add("Column4", typeof(Image)); // type of image!

  DataRow dr = dt.NewRow();
  dr[0] = "aaa";
  dr[1] = "bbb";
  dr[2] = "ccc";
  dr[3] = img; // add a sample image

  dt.Rows.Add(dr);

これで、4 列と 1 行のデータを持つ DataTable ができました。

次に、次のように DataGrid の ItemsSource を設定するだけです。

dg.ItemsSource = dt.DefaultView;

私が間違っていることは何ですか?最後のグリッドに実際の画像ではなく System.Windows.Controls.Image が並んでいるのはなぜですか? バインドする必要がありますか?

デザイナーなしで、プログラムで行う必要があるすべてのこと。

その文字列の代わりに実際の画像を表示するには?

4

2 に答える 2

4

プログラムで100%それを行う方法はまだわかりませんが、私はそれを理解しています。

最も重要なことは、DataGrid (または GridView) が Image をサポートしていないことです。なんで?私に聞かないでください。だから私は画像を BitmapImage に変更しましたが、それは魅力のように機能します。

だから私の修正があります:

        Uri uri = new Uri(@"C:\d1.jpg");
        BitmapImage bmp = new System.Windows.Media.Imaging.BitmapImage(uri);

        ...

        DataGrid dg = new DataGrid();
        dg.AutoGenerateColumns = false;

        DataGridTemplateColumn col1 = (DataGridTemplateColumn)this.FindResource("dgt");
        dg.Columns.Add(col1);

        DataGridTextColumn col2 = new DataGridTextColumn();
        col2.Header = "Column2";
        col2.Binding = new Binding("Column2");
        dg.Columns.Add(col2);

        ...

        DataTable dt = new DataTable();
        dt.Columns.Add("Column1", typeof(BitmapImage));
        dt.Columns.Add("Column2");

        DataRow dr = dt.NewRow();
        dr[0] = bmp;
        dr[1] = "test";
        dt.Rows.Add(dr);

        ...

        dg.ItemsSource = dt.DefaultView;
        grid1.Children.Add(dg);

しかし、リソースを XAML に追加する必要がありました (プログラム方法がわかりません)。だからコードがあります:

<Window.Resources>
    <DataGridTemplateColumn x:Key="dgt" Header="Column1" Width="SizeToCells">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <Image Source="{Binding Column1}" />
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
</Window.Resources>

そして、すべて正常に動作しています!

GridView または ListView についても同様です。それが誰かを助けることを願っています。

于 2012-11-23T23:16:08.290 に答える
1

ここに私をとても助けてくれた非常に簡単な例があります

http://www.c-sharpcorner.com/Forums/Thread/80586/displaying-images-in-datagrid-in-wpf-C-Sharp.aspx

サンプルコードをMVVMに合わせました

意見

    <DataGrid x:Name="dgGrid" ItemsSource="{Binding collection}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Image">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Image Height="25" Width="50" Source="{Binding path}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
        <DataGridTextColumn Header="Name" Binding="{Binding name}"/>
    </DataGrid>

実在物

public class File
{
    public string path{ get; set; }
    public string name{ get; set; }
}

ビューモデル

var collection = new ObservableCollection<File>();
collection.Add(new File() { path=@"C:\Users\homeIcon.png", name="Home" });
于 2015-10-04T02:32:02.000 に答える