Как я могу контролировать последовательность загрузки элементов управления? - PullRequest
1 голос
/ 17 октября 2019

У меня плохое знание английского, потому что я не являюсь носителем английского языка.

В моем приложении есть MainWindowView и MainWindowBehavior, а MainWindowView имеет элемент управления (редактор) в виде следующего кода.

<MainWindowView>
  <Grid>
    <TabControl>
      <TabItem>
        <Grid>
          <Editor x:Name="editor"/>
        </Grid>
      </TabItem>
    </TabControl>
  </Grid>

  <i:Interaction.Behaviors>
    <behaviors:MainWindowBehavior/>
  </i:Interaction.Behaviors>
</MainWindowView>

MainWindowBehavior использует свойство Editor в LoadedEventHandler объекта MainWindowView. Следующий код демонстрирует приведенную выше логику.

protected override void OnDetaching()
{
    this.AssociatedObject.Loaded -= AssociatedObject_Loaded;

    base.OnDetaching();
}

protected override void OnAttached()
{
    base.OnAttached();

    this.AssociatedObject.Loaded += AssociatedObject_Loaded;
}

private void AssociatedObject_Loaded(object sender, RoutedEventArgs e)
{
    this.mainWindow = sender as MainWindow;

    // run time error
    this.mainWindow.editor.Parser.ParsingFailed += Parser_ParsingFailed;
}

Но компилятор показывает ошибку во время выполнения, поскольку значение свойства Parser редактора равно нулю. Я попытался инициализировать свойство синтаксического анализатора редактора в функции Constructer, OnApplyTemplate, Loaded EventHandler, но все три случая были вызваны позже, чем Loaded EventHandler из MainWindow.

И в результате выдается ошибка времени выполнения.

Я думаю, что Loaded EventHandler редактора нужно вызывать раньше, чем Loaded EventHandler из MainWindowBehavior. Но на самом деле последовательность обратная.

Не знаю, почему последовательность обратная.

Как мне изменить последовательность загрузки, как я думал?

Спасибо зачтение.

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Возможно, вы не можете изменить последовательность событий, но вы можете изменить способ прослушивания этих событий. Я предлагаю вам подключиться к событию в вашем mainWindow, которое будет указывать вам, когда установлено его свойство editor.

Ваш код станет:

private void AssociatedObject_Loaded(object sender, RoutedEventArgs e)
{
    this.mainWindow = sender as MainWindow;
    // Here we don't access mainWindow.editor anymore, we hook-up to an event instead
    this.mainWindow.OnEditorPropertyChanged += MainWindow_EditorPropertyChanged;
}

private void MainWindow_EditorPropertyChanged(object sender){
{
    var mainWindow = sender as MainWindow;
    if (mainWindow.editor != null) {
        mainWindow.editor.Parser.ParsingFailed += Parser_ParsingFailed;
    }
}

И вваш MainWindow, обязательно вызовите событие, когда установлено его свойство editor, например:

public delegate void OnEditorPropertyChangedEventHandler(object sender);

public event OnEditorPropertyChangedEventHandler OnEditorPropertyChanged;

// Backing field
private Editor _editor;

public Editor editor {
    get => _editor;
    set => {
        _editor = value;
        OnEditorPropertyChanged?.Invoke(this); // Raise the event
    }
}
0 голосов
/ 17 октября 2019

Я нашел причину своей проблемы, следуя вашему совету.

Я думаю, что функция OnApplyTemplate редактора вызывается раньше, чем событие Loaded объекта MainWindowView. Но на самом деле функция OnApplyTemplate редактора не вызывается.

Я неправильно понял мою проблему. Извините ... Теперь я исправлю свою проблему.

Редактор - Custom-Control. Я пропустил добавление кода в файл Generic.xaml, следующий код:

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="/WpfControls;component/Themes/Editor.xaml"/>
</ResourceDictionary.MergedDictionaries>

Теперь я добавил вышеупомянутый код в Generic.xaml и функция редактора OnApplyTemplate вызывается нормально, и она вызывается раньше, чемЗагруженное событие MainWindowView.

Спасибо за вашу помощь и интерес к моей проблеме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...