Добавление дополнительных функции для пользовательского обьекта
В прошлой статье был создан обьект с собственным представлением. Добавим для него возможность отображения на панели управления и работы с ним с помощью блока.
Добавление возможности отображения на панели управления
Model
Для Model необходимо добавить параметр IsDashboardSupported = true в имеющийся атрибут:
...
[CustomType("[GUID]", Category = "TEST", IsDashboardSupported = true)]
public class TestResult : IECustomTypeBase
...
ViewModel
Для ViewModel необходимо реализовать интерфейс IDashboardSupport:
...
[CustomTypeViewModel("[GUID]", typeof(TestResult))]
public partial class TestResultViewModel : ObservableObject, IDashboardSupport
...
public object? Entity => _testResult;
...
View
Для View необходимо добавить еще один атрибут DashboardCustomTypeView:
...
[CustomTypeView("[GUID]", typeof(TestResultViewModel))]
[DashboardCustomTypeView("[GUID]",
typeof(TestResultViewModel),
400, 300,
toolItemIconResourceKey:"TestResult_Icon")]
public partial class TestResultView : UserControl
...
В атрибуте указывается размер элемента, а также название иконки в формате svg.
Пример содержания такого файла:
M10.25 10a1.25 1.25 0 1 0-2.499 0a1.25 1.25 0 0 0 2.499 0m6 0a1.25 1.25 0 1 0-2.499 0a1.25 1.25 0 0 0 2.499 0m-6.114 5.106a.75.75 0 0 0-.772 1.286c.767.46 1.72.67 2.636.67s1.87-.21 2.636-.67a.75.75 0 1 0-.772-1.286c-.483.29-1.154.456-1.864.456s-1.38-.166-1.864-.456M22.002 12c0-5.524-4.478-10.002-10.002-10.002S2 6.476 2 12c-.001 5.523 4.476 10 10 10s10.002-4.477 10.002-10M3.499 12a8.502 8.502 0 1 1 17.003 0a8.502 8.502 0 0 1-17.003 0
Для отображение иконки, она должна быть помещена в директорию проекта Assets с расширением .geometry.
Файл .geametry в проекте должен иметь параметр BuildAction = AvaloniaResource.
Добавление блока для взаимодействия с обьектом
Для примера добавим блок установки количества пройденных испытание и бракованных изделий.
Создание Action
Создадим класс TestResultActions. Опишем его подобно блоку CustomDivision из первой статьи:
[ActionsContainer(
"[GUID]",
Name = "TestAction",
Category = "Test",
Lifetime = InstanceLifetime.Singleton)]
public class TestResultActions
{
[Action("[GUID]", Name = "SetTestResult")]
public void SetTestResult(
[InputArgument("[GUID]")]
TestResult testResult,
[InputArgument("[GUID]")]
double passed,
[InputArgument("[GUID]")]
double failed)
{
testResult.Passed = passed;
testResult.Failed = failed;
}
}
Зарегистрируейм его в классе EPlugin:
public override void Register(IEmikaRegistry registry)
{
registry.AddActions(typeof(TestResultActions));
registry.AddDataType<TestResult>(typeof(TestResultViewModel), [typeof(TestResultView)]);
...
registry.RemoveActions(typeof(TestResultActions));
registry.RemoveDataType(typeof(TestResult));
}
Model
Добавим события о том, что изменилось количество пройденных и бракованных изделий, чтобы соответственно обновить модель представления:
[JsonIgnore]
public EventHandler? PassedChanged;
[JsonIgnore]
public EventHandler? FailedChanged;
private double _passed = 100.0;
public double Passed
{
get
{
return _passed;
}
set
{
_passed = value;
PassedChanged?.Invoke(this, EventArgs.Empty);
}
}
private double _failed = 45.0;
public double Failed
{
get
{
return _failed;
}
set
{
_failed = value;
FailedChanged?.Invoke(this, EventArgs.Empty);
}
}
ViewModel
Подпишемся на события:
public TestResultViewModel(TestResult testResult)
{
_testResult = testResult;
_testResult.PassedChanged += OnModelPassedChanged;
_testResult.FailedChanged += OnModelFailedChanged;
Passed = _testResult.Passed;
Failed = _testResult.Failed;
}
private void OnModelPassedChanged(object? sender, EventArgs e)
{
Passed = _testResult.Passed;
}
private void OnModelFailedChanged(object? sender, EventArgs e)
{
Failed = _testResult.Failed;
}
partial void OnPassedChanged(double value)
{
_testResult.Passed = value;
}
partial void OnFailedChanged(double value)
{
_testResult.Failed = value;
}
Готово. Теперь с обьектом можно взаимодействовать через блок и выносить его на панель уравления.