WPF, COM Interop и DoEvents - PullRequest
       26

WPF, COM Interop и DoEvents

0 голосов
/ 23 октября 2018

У меня есть WPF TextBox в пользовательском контроле WPF, размещенный в элементе host в пользовательском контроле winforms.Пользовательский контроль winforms является ComVisible и теперь размещается в старом пользовательском контроле vb6.

У меня также есть тестовый набор winforms, где форма содержит пользовательский контроль winforms для тестирования поведения вне взаимодействия COM.

ЕслиВ тестовом жетоне winforms я установил задний цвет пользовательского элемента управления winforms, он делегирует свойство background текстового поля wpf и успешно изменяет фоновое поле текстового поля wpf.

Если в моем тесте vb6Я установил задний цвет элемента управления winforms (теперь работающего через COM-взаимодействие), и обнаружил, что мне нужно запустить DoEvents в тестовом жгуте vb6, чтобы увидеть изменение фона.

(Я должен добавить, что я также создал "чистый" (не wpf) пользовательский контроль winforms, содержащий текстовое поле winforms просто для проверки поведения взаимодействия vb6 / winforms. Если я установил его backcolor из vb6, я не нужно выдавать какие-либо DoEvents, чтобы увидеть изменения - поэтому кажется, что это может быть связано с переносом WPF, что означает, что мне нужно принудительно перерисовать пользовательский интерфейс)

Очевидно, я действительно не хочу выпускать DoEvents для обновления пользовательского интерфейса, но похоже ли это на правильное поведение?

Вот различные сегменты кода - (я использую шаблон MVVM длябит wpf)

[ComVisible(true)]
[ProgId("xxxControls.TextBox")]
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(ITextBox))]
[Guid("...")]
public partial class TextBox : UserControl, ITextBox
{
    private System.Windows.Forms.Integration.ElementHost _textBoxHost;
    private TextBoxExViewModel _viewModel;
    private TextBoxEx _textBoxEx;

    ...

    int ITextBox.Backcolour
    {
        get => this._viewModel.Backcolour.AsValue();
        set => this._viewModel.Backcolour = value.AsBrush();                
    }

    ...
}

И немного xaml

<UserControl x:Class="xxxControls.TextBoxEx" ... >

    ...

    <TextBox 
        x:Name="MainBox"    
        ... 
        Background="{Binding Path=Backcolour}" 
        ...
        />
</UserControl>

и модель представления

[ComVisible(false)]
public class TextBoxExViewModel : ViewModelBase
{        

    private wpf.Brush _background = new wpf.SolidColorBrush(wpf.Colors.White);
    public wpf.Brush Backcolour
    {
        get => _background;
        set => SetField(ref _background, value, "Backcolour");
    }

    ...

}
...