2

何かに頭が回らないようです。コードに次のロジックがあるとします。

namespace WPFTesting
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        ObservableCollection<Message> messages = new ObservableCollection<Message>();

        public MainWindow()
        {
            InitializeComponent();
            messages.Add(new Message(DateTime.Now, "This is a test."));
            ListView listView = new ListView();
            GridView gridView = new GridView();
            listView.View = gridView;
            GridViewColumn timeStampColumn = new GridViewColumn();
            timeStampColumn.DisplayMemberBinding = new Binding("Date");
            GridViewColumnHeader timeStampHeader = new GridViewColumnHeader();
            timeStampHeader.Content = "Time";
            timeStampColumn.Header = timeStampHeader;
            gridView.Columns.Add(timeStampColumn);
            GridViewColumn messageColumn = new GridViewColumn();
            messageColumn.DisplayMemberBinding = new Binding("Text");
            GridViewColumnHeader messageHeader = new GridViewColumnHeader();
            messageHeader.Content = "Message";
            messageColumn.Header = messageHeader;
            gridView.Columns.Add(messageColumn);
            Binding binding = new Binding();
            binding.Source = messages;
            listView.SetBinding(ItemsControl.ItemsSourceProperty, binding);
            MainGrid.Children.Add(listView);
        }

        public class Message
        {

            public Message(DateTime aDate, String aText)
            {
                Date = aDate;
                Text = aText;
            }

            public DateTime Date { get; set; }
            public String Text { get; set; }
        }
    }
}

すべての行が特定の背景色と高さを持つように、プログラムで ListView のスタイルを設定するにはどうすればよいですか? ListView の Items リストで foreach ループを実行し、各 ListViewItem のプロパティを設定することは避けたいと思います。このリストには非常に多くの項目が含まれている可能性があり、コストがかかる可能性があるためです。代わりに、Style クラスまたは実行時ロジックを使用してプログラムでこれを行う方法はありませんか?

4

2 に答える 2

10

私はそれを考え出した。例として、次のようにすることができます。

Style style = new Style();
style.TargetType = typeof(ListViewItem);
style.Setters.Add(new Setter(ListViewItem.BackgroundProperty, Brushes.Pink));
listView.ItemContainerStyle = style;

編集: データ セットの特定の値のトリガーを使用して、条件付きで ListView の項目にスタイルを設定することもできます。私はこれが非常に便利だと思ったので、これは他の人にも役立つかもしれません:

DataTrigger trigger = new DataTrigger();
trigger.Binding = new Binding("Text");
trigger.Value = "This is a test.";
trigger.Setters.Add(new Setter(ListViewItem.BackgroundProperty, Brushes.Pink));
style.Triggers.Add(trigger);
listView.ItemContainerStyle = style;

上記のコードは、テキスト フィールドが「これはテストです」に設定されているという条件の下で、行の背景のみを設定します。

于 2013-07-11T14:28:45.217 に答える
2

GridView 列はスタイリングをサポートせず、ヘッダーのスタイリングのみをサポートします。代わりに、セル テンプレートを使用して列セルのスタイルを設定します。これにより、列ごとに異なるスタイルを使用できます。たとえば、通貨の列は右揃えに、テキストの列は左揃えにするとします。

これは、赤い背景スタイルの Time 列に XAML を使用した場合の外観です。

<GridViewColumn Header="Time">                            
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Date}">
                <TextBlock.Style>
                    <Style TargetType="{x:Type TextBlock}">
                        <Setter Property="Background" Value="Red" />
                    </Style>
                </TextBlock.Style>
            </TextBlock>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

これはコードで行うことができます。FrameworkElementFactoryクラスは、テンプレートの作成をサポートする非推奨のクラスです。テンプレートをプログラムで作成するための推奨される方法は、 XamlReaderクラスのLoadメソッドを使用して、文字列またはメモリ ストリームから XAML を読み込むことです。以下のコードは、列のタイプに応じて異なるスタイルを許可するように変更する必要があります。

public MainWindow()
{
    InitializeComponent();

    messages.Add(new Message(DateTime.Now, "This is a test."));

    ListView listView = new ListView();
    GridView gridView = new GridView();
    listView.View = gridView;

    gridView.Columns.Add(CreateGridViewColumn("Time", "Date"));
    gridView.Columns.Add(CreateGridViewColumn("Message","Text"));

    listView.SetBinding(ItemsControl.ItemsSourceProperty, new Binding() { Source = messages });

    MainGrid.Children.Add(listView);
}

private static GridViewColumn CreateGridViewColumn(string header, string bindingPath)
{
    GridViewColumn gridViewColumn = new GridViewColumn();
    gridViewColumn.Header = new GridViewColumnHeader() { Content = header };

    string xaml = @"
        <DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml""> 
            <TextBlock Text=""{Binding " + bindingPath + @"}""> 
                <TextBlock.Style>
                    <Style TargetType=""{x:Type TextBlock}"">
                        <Setter Property=""Background"" Value=""Red"" />
                    </Style>
                </TextBlock.Style>
            </TextBlock>
            </DataTemplate>";
    StringReader stringReader = new StringReader(xaml);
    XmlReader xmlReader = XmlReader.Create(stringReader);
    gridViewColumn.CellTemplate = XamlReader.Load(xmlReader) as DataTemplate;

    return gridViewColumn;
}
于 2013-07-11T15:14:10.593 に答える