选择WPF控件(Choosing WPF controls)

2019-10-17 22:20发布

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

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

控制您会推荐使用提供WPF这个选项?

Answer 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
    }

结果:

需要注意的事项:

  • 我看你有几个悬而未决的问题WPF,你看起来很沮丧了。 不要。 这是一个美丽和优秀的框架的工作。 我创造了这个例子,希望你能看到它的真正的美。 有没有机会可以实现的WinForms同样的例子,没有大量的更多的代码和努力。
  • 看看这段代码实际上是多么简单而美丽。 我在做大量使用WPF的数据绑定功能,这让一切变得更加简单。
  • 注意有没有一个单一的代码行引用或操纵任何UI元素。 我所做的是创建合适的数据结构,然后创建适当的UI显示/操纵它。
  • “胶水”的数据和UI之间是DataContext属性,它是所有XAML绑定是针对解决。
  • 如果你来自的WinForms或其他传统的背景,你真的需要忘记你从什么都知道,拥抱MVVM (点击链接它不是维基百科上)。
  • 同样,林不熟悉NLOG所以我不知道我所创建的数据结构是否符合你的需要。 在任何情况下,让我知道。
  • 让我知道如果你需要进一步的援助。 我很乐意帮助你在你的WPF的第一个步骤。


文章来源: Choosing WPF controls