← Back

Дерево логируемых классов

Здравствуйте! Как можно вложить логируемый класс в основной что бы в StockSharp.Xaml.Monitor он выводился внутри дерева основного? Устанавливал значение Parent и IsRoot разными способами но никаких изменений нет.

<Window x:Class="WpfApp2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp2"
        xmlns:xaml="http://schemas.stocksharp.com/xaml"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="800">
    <Grid>
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
        <xaml:Monitor Name="Monitor"/>
        <Button Content="Start" Click="Button_Click" Grid.Row="1" Margin="3"/>
    </Grid>
</Window>
using System;
using System.Windows;
using StockSharp.Logging;
using StockSharp.Xaml;

namespace WpfApp2
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : ILogSource
    {
        public readonly LogManager LogManager;
        public Guid Id { get; }
        public new ILogSource Parent { get; set; }
        public LogLevels LogLevel { get; set; }
        public DateTimeOffset CurrentTime => DateTimeOffset.Now;
        public bool IsRoot { get; }

        public event Action<LogMessage> Log;

        public MainWindow()
        {
            InitializeComponent();
            Name = "MainWindow";
            LogManager = new LogManager();
            LogLevel = LogLevels.Info;
            LogManager.Sources.Add(this);
            LogManager.Listeners.Add(new GuiLogListener(Monitor));
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Log?.Invoke(new LogMessage(this, CurrentTime, LogLevel, "Сообщение главного класса."));
            var testSourceWindow = new TestClass()
            {
                Parent = this
            };
            LogManager.Sources.Add(testSourceWindow);
            testSourceWindow.Test();
        }

        public void Dispose()
        {
            throw new NotImplementedException();
        }

    }


    class TestClass : ILogSource
    {
        private ILogSource _parent;

        public void Dispose()
        {
            throw new NotImplementedException();
        }

        public Guid Id { get; }
        public string Name { get; set; } = "TestClass";
        public ILogSource Parent
        {
            get => _parent;
            set
            {
                _parent = value;
                LogLevel = value.LogLevel;
            }
        }

        public LogLevels LogLevel { get; set; }
        public DateTimeOffset CurrentTime => DateTimeOffset.Now;
        public bool IsRoot { get; }
        public event Action<LogMessage> Log;

        public void Test()
        {
            Log?.Invoke(new LogMessage(this, CurrentTime, LogLevel, $"Сообщение вторичного класса."));
        }
    }
}

Comments (5)

Login or Create account, Log in or register to leave a comment

Support
Support

Добавлять дочерние источники не нужно:

LogManager.Sources.Add(testSourceWindow);

Как только ваш источник пошлёт первое сообщение он появится в дереве.

Константин
Константин Author

Support: Добавлять дочерние источники не нужно:

LogManager.Sources.Add(testSourceWindow);

> 
> Как только ваш источник пошлёт первое сообщение он появится в дереве.

Если дочерний источник не добавлять то от него вывода нет вообще.
Support
Support

Дополнительно требуется отнеследовать от интерфейса ILogReceiver. Родительские через метод AddLog получает сообщения от дочерних элементов.

Константин
Константин Author

Support: Дополнительно требуется отнеследовать от интерфейса ILogReceiver. Родительские через метод AddLog получает сообщения от дочерних элементов.

Я не понимаю какая должна быть реализация метода AddLog что бы дочерние элементы появились в дереве. Каким образом нужно передавать LogMessage родителю?

Support
Support
Константин