2011-03-28 11 views
0

WPF를 배우기 위해 로거 애플리케이션을 만들고 일부 리스너가 새 메시지를 선택할 때마다 스크롤바 맨 아래에 새 메시지를 표시하려고합니다. 나는 각 메시지는 다음과 같습니다 뭔가 만들려면 : 나는이 WPF 책 여기있어사용자 정의/사용자 정의 컨트롤 또는 템플릿/스타일을 사용하는 경우

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

을, 그들은 모두 사용자/사용자 컨트롤 이외의 간단하고 더 나은 메커니즘이 있다는 것을 말하는 "경고"가 대부분의 경우. 이것이 컨트롤 템플릿을 사용하여 해결할 수 있는지 궁금 해서요, 그렇다면 어떤 컨트롤 유형을 기본으로 사용해야합니까?

답변

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

+0

소스 및 메시지를 표 형식으로 표시하려면 (그리고 각각의 새 메시지는 새 항목으로 간주됩니다) 아마도 이것은 가장 간단한 방법입니다. 그러나 '꼬리'처럼 작동하고 최신 메시지 (예 : 10 개) 만 유지하려는 경우 다음 중 하나를 수행하십시오. A. 위의 솔루션에서 항목을 섞어 야합니다 (좋지 않거나 B. 대안을 찾아야 할 필요가 있습니다. – publicgk

+0

좋아요, 제가 제시 한 방식으로 문제에 대한 좋은 해결책이 되었기 때문에 대답을 드리겠습니다. 다른 문제로 인해 대안 B를 선택할 것입니다.) – carlsb3rg

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

관련 문제