0

这是我的代码(您可以在 VS 中创建一个新的 WPF 项目并运行它,只需将 MainWindow 的 XAML 中的 Grid 名称设置为 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 的高度限制为 20.0,因此多行消息在 ListView 中显示出一种令人讨厌的感觉。我真的只想显示文本消息的第一行。我怎样才能实现这种行为?

4

2 回答 2

1

这是您的问题的一种解决方案。很抱歉格式化...我仍然无法让 SOverFlow 的格式化为我正常工作。

  1. 我已经从 XAML 的代码隐藏文件中删除了所有创建代码。我将 Messages 的定义移至它自己的 ViewModel 类(MSGviewModel.cs)

  2. 在主窗口的 XAML 中,我定义了 ListView 并设置了一个简单的 ItemTemplate。这个 ItemTemplate 将显示日期和消息文本。用于显示消息文本的 TextBLock 的最大高度限制为 20。

  3. 我为那个 TextBlock 定义了一个工具提示。该工具提示绑定到消息的完整文本属性。这样,您可以将鼠标悬停在单行消息上并显示全文。

主窗口 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>

主窗口 - 后面的代码:

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

这是在维护当前代码的同时执行此操作的一种方法:

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 回答