2013-03-28 94 views
1

我需要爲用戶提供更改NLog規則日誌級別的選項。選擇WPF控件

有12個規則,每個規則都有自己的日誌記錄級別。

您可以推薦使用哪種控件在WPF中提供此選項?

+0

這取決於你想如何讓它看起來像?什麼是 也許是一個簡單的DataGrid? – 2013-03-28 07:19:08

+0

也許是一個組合框?但這一切都取決於你想要如何。 – Tan 2013-03-28 07:52:59

+0

那麼這樣的決定取決於各種因素。您想要展示的條目有多複雜?誰是前端的用戶(技術背景)?你的用戶界面的其他部分是什麼樣的?你有什麼樣的範例你必須遵循?當然,應該提供哪些功能? - 順便說一句,我認爲最好將這篇文章移到[ux.stackexchange.com](http://ux.stackexchange.com) – DHN 2013-03-28 08:16:35

回答

1

我對NLog並不熟悉,但我想如果您必須在少量的預先確定的選項之間進行選擇,那麼ComboBox就是最好的UI元素。

你說你有12個日誌級別,因此,在這種情況下,它使大多數使用一個ItemsControl實際顯示這些項目,而不是自己創建所有的UI元素的意義:

<Window x:Class="MiscSamples.LogLevelsSample" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="LogLevels" Height="300" Width="300"> 
    <ItemsControl ItemsSource="{Binding LogRules}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <TextBlock Width="100" Margin="2" Text="{Binding Name}"/> 
        <ComboBox ItemsSource="{Binding DataContext.LogLevels, RelativeSource={RelativeSource AncestorType=Window}}" 
           SelectedItem="{Binding LogLevel}" Width="100" Margin="2"/> 
       </StackPanel> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</Window> 

代碼背後:

public partial class LogLevelsSample : Window 
    { 
     public LogLevelsSample() 
     { 
      InitializeComponent(); 

      DataContext = new LogSettingsViewModel(); 
     } 
    } 

視圖模型:

public class LogSettingsViewModel 
    { 
     public List<LogLevels> LogLevels { get; set; } 

     public List<LogRule> LogRules { get; set; } 

     public LogSettingsViewModel() 
     { 
      LogLevels = Enum.GetValues(typeof (LogLevels)).OfType<LogLevels>().ToList(); 

      LogRules = Enumerable.Range(1, 12).Select(x => new LogRule() 
                   { 
                    Name = "Log Rule " + x.ToString(), 
                    LogLevel = MiscSamples.LogLevels.Debug 
                   }).ToList(); 
     } 
    } 

數據項:

public class LogRule 
    { 
     public string Name { get; set; } 

     public LogLevels LogLevel { get; set; } 
    } 

    public enum LogLevels 
    { 
     Trace, 
     Debug, 
     Warn, 
     Info, 
     Error, 
     Fatal 
    } 

結果:

enter image description here

注意事項:

  • 我看你有幾個懸而未決的問題WPF,你看起來很沮喪了。不要。這是一個美麗而優秀的框架。我創造了這個例子,希望你能看到它的真正魅力。如果沒有更多的代碼和努力,你就不可能在winforms中實現同樣的例子。
  • 看看這段代碼實際上是多麼簡單而美麗。我正在廣泛使用WPF的數據綁定功能,這使得一切都變得更容易。
  • 請注意,沒有任何引用或操作任何UI元素的代碼行。我所做的只是創建適當的數據結構,然後創建適當的用戶界面來顯示/操作它。
  • 數據和用戶界面之間的「膠合」是DataContext屬性,這是所有XAML綁定都解決的問題。
  • 如果你來自winforms或其他傳統背景,你真的需要忘記你所知道的一切,並擁抱MVVM(點擊鏈接它不是維基百科)。
  • 同樣,我不熟悉NLog,所以我不確定我創建的數據結構是否符合您的需求。無論如何,讓我知道。
  • 讓我知道你是否需要進一步的幫助。我很樂意在WPF的第一步中爲您提供幫助。