2011-03-28 33 views
0

我創建一個記錄器應用的東西去學習WPF,我想新的消息出現在每一部分聽衆拿起一個新的消息,時間的ScrollViewer的底部。我想每個消息創造的東西,看起來像這樣:何時使用自定義/用戶控制或模板/風格

================================== 
= Source | Message    = 
=  |      = 
=  |      = 
================================== 

我來到這裏2點WPF書,都以「警告」說,還有其他更簡單,更好的機制不是在自定義/用戶控件在大多數情況下。我想知道是否可以使用控件模板解決這個問題,如果可以,我應該使用哪種控件類型作爲基礎?

回答

0

嘗試使用ListView使用和設置其查看到GridView

<ListView> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="Source" Width="120" /> 
      <GridViewColumn Header="Message" Width="400" /> 
     </GridView> 
    </ListView.View> 
</ListView> 

參見:How to: Display ListView Contents by Using a GridView

+0

如果沒有更適合變成了我給它一個嘗試和信貸您的回答。我很新的WPF,我不能確認這是否是最好的解決辦法:) – carlsb3rg 2011-03-28 15:15:33

+0

如果你想顯示源和消息以表格的形式(每個新的消息被認爲是一個新的訂單項),可能這是最簡單的方法。但是,如果你希望它更像一個'尾巴',並且只想保留最新的(比如說10條)消息,那麼:A.你需要在上面的解決方案中洗牌(不是好主意,或者B.你。需要尋找替代品 – publicgk 2011-03-28 16:57:57

+0

好吧,我會認可您的答案,因爲它本來是一個很好的解決問題,我提出它的方式我會選擇的,但因爲其他問題的替代B;) – carlsb3rg 2011-03-29 11:59:44

1

也許結合可幫助。 (它可能過於複雜的事情,如果你還在學習WPF雖然)。
用結合,我們可以使ListView只能是你的日誌記錄的可見表示,這意味着添加的邏輯/刪除日誌,可以留在ListView完全獨立。

class LogEntry 
{ 
    public string Source { get; set; } 
    public string Message { get; set; } 

    public LogEntry(string source, string message) 
    { 
     Source = source; 
     Message = message; 
    } 
} 

class Listener 
{ 
    private int m_maxLogs = 10; 

    private ObservableCollection<LogEntry> m_logEntries; 
    public ObservableCollection<LogEntry> LogEntries { get { return m_logEntries; } } 

    public Listener() 
    { 
     m_logEntries = new ObservableCollection<LogEntry>(); 
    } 

    public void AddLogEntry(string source, string message) 
    { 
     if (LogEntries.Count >= m_maxLogs) 
     { 
      //Remove the oldest LogEntry. 
      LogEntries.RemoveAt(0); 
     } 
     LogEntries.Add(new LogEntry(source, message)); 
    } 
} 

如果DataContext設置監聽器實例的XAML變(基於以前的答案):

<ListView ItemsSource="{Binding LogEntries}"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="Source" Width="120" DisplayMemberBinding="{Binding Source}"/> 
      <GridViewColumn Header="Message" Width="400" DisplayMemberBinding="{Binding Message}"/> 
     </GridView> 
    </ListView.View> 
</ListView> 

如果要動態地更改日誌條目的文本出於某種原因,您需要在LogEntry類中實現INotifyPropertyChanged接口以更新列表視圖。

+0

這就是我最終要做的。 – carlsb3rg 2011-03-29 20:18:56