Изменение свойств хоста WinForm из ViewModel, привязанного к ElementHost - PullRequest
0 голосов
/ 27 марта 2012

Может кто-нибудь предложить подходы, которые позволят мне изменить свойства хоста WinForm из элемента WPF в ElementHost?

Prism Stack

У меня есть приложение MVVM, использующее Prism, которое привязано к ElementHost. Я хотел бы изменить заголовок WinForm, изменить его размер и закрыть WinForm из моей ViewModel.

Я понимаю получение данных от составного элемента управления WPF, описанного в этой статье , но не могу понять, как это будет работать в ViewModel.

Приложение - это WinForm ChartWizardViewModel - это модель представления, из которой я хочу изменить свойства приложения. Все остальное - это архитектура Призма. Shell, Bootstrapper и т. Д.

Public Class App
Public Sub New(ByVal modulesToLoad As List(Of String))
        ' This call is required by the designer.
        InitializeComponent()

        If Application.Current Is Nothing Then
            Dim wpfAppAdapter As New WpfApplicationAdapter
        End If

        '   Load the application modules
        Dim formBootstrapper As New Bootstrapper(modulesToLoad)
        formBootstrapper.Run()

        '   Get the current instance of shell and bind it to the ElementHost
        Dim shellElement = formBootstrapper.Container.Resolve(Of Shell)()
        ehMaster.Child = shellElement
End Sub
End Class

Public NotInheritable Class Bootstrapper
Inherits UnityBootstrapper

Private _modulesToLoad As List(Of String)   '   The modules that we want to load

Public Sub New(ByVal modulesToLoad As List(Of String))
    _modulesToLoad = modulesToLoad
End Sub

Protected Overrides Function CreateShell() As DependencyObject
    Dim shell = Container.Resolve(Of Shell)()
    Return shell
End Function

Protected Overrides Function GetModuleCatalog() As IModuleCatalog
    Dim catalog As ModuleCatalog = New ConfigurationModuleCatalog()
    For Each moduleToLoad As String In _modulesToLoad
        Select Case StringHelper.CleanString(moduleToLoad)
            Case "chartwizardmodule"
                catalog.AddModule(GetType(ChartWizardModule))
        End Select
    Next
    Return catalog
End Function
End Class

Public NotInheritable Class ChartWizardModule
Implements IModule

Private ReadOnly regionManager As IRegionManager

Public Sub Initialize() Implements IModule.Initialize
    regionManager.RegisterViewWithRegion("MainRegion", GetType(MainWindow))
End Sub

Public Sub New(regionManager As IRegionManager)
    Me.regionManager = regionManager
End Sub
End Class

Partial Public Class MainWindow
Private _objChartWizardViewModel As ChartWizardViewModel    '   The chart wizard base view model that controls the rest of the views

Private Sub MainWindow_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
    Dim objChartWizardViewModel As New ChartWizardViewModel()
    _objChartWizardViewModel = objChartWizardViewModel
    '   Data Context for the Chart Wizard
    Me.DataContext = _objChartWizardViewModel
End Sub
End Class

Public Class ChartWizardViewModel
Implements INotifyPropertyChanged
    '   I need to change the properties of the WinForm (App) from here
End Class

1 Ответ

0 голосов
/ 29 марта 2012

Я решил это с помощью EventAggregator, как описано в этом посте

Использование EventAggregator для связи между WPF в ElementHost и хостом WinForm

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