0

これが私のコードです(VSで新しいWPFプロジェクトを作成して実行できます。MainWindowのXAMLでグリッドの名前をMainGridに設定するだけです):

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."));
            messages.Add(new Message(DateTime.Now, "This is a multi-line message.\nThis is a multi-line message."));
            messages.Add(new Message(DateTime.Now, "This is a multi-line message.\nThis is a multi-line message."));
            messages.Add(new Message(DateTime.Now, "This is a multi-line message.\nThis is a multi-line message.")); 
            ListView listView = new ListView();
            Style style = new Style();
            style.TargetType = typeof(ListViewItem);
            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);
            style.Setters.Add(new Setter(ListViewItem.HeightProperty, 20.0));
            style.Setters.Add(new Setter(ListViewItem.MarginProperty, new Thickness(0)));
            style.Setters.Add(new Setter(ListViewItem.BorderThicknessProperty, new Thickness(0)));
            listView.ItemContainerStyle = style;
            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; }
        }
    }
}

ご覧のとおり、各 ListViewItem の Height を 20.0 に制限しているため、複数行のメッセージが ListView に表示されるのは見苦しいものです。テキストメッセージの最初の行が表示されるようにしたいだけです。どうすればこの動作を実現できますか?

4

2 に答える 2

1

これがあなたの問題に対する1つの解決策です。フォーマットについて申し訳ありません...私はまだSOverFlowのフォーマットを適切に機能させることができません。

  1. XAML のコード ビハインド ファイルからすべての作成コードを削除しました。メッセージの定義を独自の ViewModel クラス (MSGviewModel.cs) に移動しました。

  2. メイン ウィンドウの XAML で、ListView を定義し、単純な ItemTemplate を設定しました。この ItemTemplate は、日付とメッセージ テキストを表示します。メッセージ テキストを表示するための TextBLock は、最大高さが 20 に制限されています。

  3. その TextBlock のツールチップを定義しました。そのツールチップは、メッセージの完全な Text プロパティにバインドされています。このようにして、単一行のメッセージにマウスオーバーすると、全文が表示されます。

メインウィンドウ XAML:

<Window x:Class="FixListView.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid Name="MainGrid">
        <ListView ItemsSource="{Binding Messages}">
          <ListView.ItemTemplate>        
            <DataTemplate>          
              <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Text}" MaxHeight="20">
                  <TextBlock.ToolTip>
                    <TextBlock Text="{Binding Text}"/>
                  </TextBlock.ToolTip>
                </TextBlock>
                <TextBlock Text=" -- "/>
                <TextBlock Text="{Binding Date}"/>
              </StackPanel>
            </DataTemplate>
          </ListView.ItemTemplate>
        </ListView>
      </Grid>
    </Window>

MAINWINDOW - コード ビハインド:

public partial class MainWindow : Window
{
  public MainWindow()
  {
    this.DataContext = new MSGviewModel();
    InitializeComponent();
  }
}

ビューモデル クラス:

public class MSGviewModel
{
private ObservableCollection<Message> messages = new ObservableCollection<Message>();
public ObservableCollection<Message> Messages
{
  get { return messages; }
}


public MSGviewModel()
{
  messages.Add(new Message(DateTime.Now, "This is a test."));
  messages.Add(new Message(DateTime.Now, "This is a multi-line message.\nThis is a multi-line message."));
  messages.Add(new Message(DateTime.Now, "This is a multi-line message.\nThis is a multi-line message."));
  messages.Add(new Message(DateTime.Now, "This is a multi-line message.\nThis is a multi-line message.")); 
}
}

public class Message
{

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

  public DateTime Date { get; set; }
  public String Text { get; set; }
}
}
于 2013-07-11T15:58:14.697 に答える
0

これは、現在のコードを維持しながらそれを行う 1 つの方法です。

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."));
            messages.Add(new Message(DateTime.Now, "This is a multi-line message.\nThis is a multi-line message."));
            messages.Add(new Message(DateTime.Now, "This is a multi-line message.\nThis is a multi-line message."));
            messages.Add(new Message(DateTime.Now, "This is a multi-line message.\nThis is a multi-line message.")); 
            ListView listView = new ListView();
            Style style = new Style();
            style.TargetType = typeof(ListViewItem);
            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);
            style.Setters.Add(new Setter(ListViewItem.HeightProperty, 20.0));
            style.Setters.Add(new Setter(ListViewItem.MarginProperty, new Thickness(0)));
            style.Setters.Add(new Setter(ListViewItem.BorderThicknessProperty, new Thickness(0)));
            listView.ItemContainerStyle = style;
            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 = CreateGridViewColumn("Message", "Text");
            gridView.Columns.Add(messageColumn);
            Binding binding = new Binding();
            binding.Source = messages;
            listView.SetBinding(ItemsControl.ItemsSourceProperty, binding);
            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""> 
              <StackPanel Orientation=""Horizontal"">
                <TextBlock Text=""{Binding Text}"" MaxHeight=""20"">
                  <TextBlock.ToolTip>
                    <TextBlock Text=""{Binding Text}""/>
                  </TextBlock.ToolTip>
                </TextBlock>
                <TextBlock Text="" -- ""/>
                <TextBlock Text=""{Binding Date}""/>
              </StackPanel>
            </DataTemplate>";
            StringReader stringReader = new StringReader(xaml);
            XmlReader xmlReader = XmlReader.Create(stringReader);
            gridViewColumn.CellTemplate = XamlReader.Load(xmlReader) as DataTemplate;

            return gridViewColumn;
        }

        public class Message
        {

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

            public DateTime Date { get; set; }
            public String Text { get; set; }
        }
    }
}
于 2013-07-11T16:43:20.153 に答える