У меня есть 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");
}
...
}