1

NLog ルールのログ レベルを変更するオプションをユーザーに提供する必要があります。

12 のルールがあり、それぞれに独自のログ レベルがあります。

WPF でこのオプションを提供するには、どのコントロールを使用することをお勧めしますか?

4

1 に答える 1

1

私は NLog に詳しくありませんが、あらかじめ決められた少数のオプションから選択する必要がある場合は、aComboBoxが最適な 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 要素を参照または操作するコードは 1 行もありません。私が行ったのは、適切なデータ構造を作成し、それを表示/操作するための適切な UI を作成することだけです。
  • データと UI の間の "接着剤" は、DataContextすべての XAML バインディングが解決されるプロパティです。
  • winform やその他の従来のバックグラウンドを持っている場合は、そこから知っていることをすべて忘れて、MVVMを採用する必要があります(ウィキペディアではないリンクをクリックしてください)。
  • 繰り返しますが、私は NLog に精通していないため、作成したデータ構造が必要なものと一致するかどうかはわかりません。いずれにせよ、私に知らせてください。
  • さらにサポートが必要な場合はお知らせください。WPF の最初のステップで、喜んでお手伝いさせていただきます。
于 2013-04-20T05:22:53.677 に答える