1

我需要为用户提供更改 NLog 规则的日志记录级别的选项。

有 12 条规则,每条规则都有自己的日志记录级别。

您可以推荐使用哪些控件来在 WPF 中提供此选项?

4

1 回答 1

1

我不熟悉 NLog,但我想如果你必须在少量预先确定的选项之间进行选择,那么 aComboBox是最好的 UI 元素。

ItemsControl你说你有 12 个日志级别,所以在这种情况下,使用 an来实际显示这些项目而不是自己创建所有 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
    }

结果:

在此处输入图像描述

注意事项:

  • 我看到您有几个未回答的 WPF 问题,您对此感到非常沮丧。不要这样。这是一个美丽而优秀的框架。我创建了这个例子,希望你能看到它真正的美。如果没有更多的代码和努力,您不可能在 winforms 中实现同样的示例。
  • 看看这段代码实际上是多么的简单和漂亮。我正在广泛使用 WPF 的数据绑定功能,这让一切变得更容易。
  • 请注意,没有一行代码引用或操作任何 UI 元素。我所做的只是创建适当的数据结构,然后创建适当的 UI 来显示/操作它。
  • 数据和 UI 之间的“粘合剂”DataContext是属性,它是所有 XAML 绑定所针对的解析对象。
  • 如果你来自 winforms 或其他传统背景,你真的需要忘记你所知道的一切并拥抱MVVM(点击链接它不是维基百科)。
  • 同样,我不熟悉 NLog,所以我不确定我创建的数据结构是否符合您的需要。无论如何让我知道。
  • 如果您需要进一步的帮助,请告诉我。我很乐意帮助您迈出 WPF 的第一步。
于 2013-04-20T05:22:53.677 回答