2009-06-10 20 views
10

quería envolver un control de formas de las ventanas en un control de usuario de WPFWPF WindowsFormsHost dimensionamiento

<UserControl x:Class="MVVMLibrary.ReportViewer" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:ws="clr-namespace:Microsoft.Reporting.WinForms;assembly=Microsoft.ReportViewer.WinForms" 
    Height="Auto" Width="Auto"> 
    <Grid> 
     <WindowsFormsHost Name="Host"> 
      <ws:ReportViewer/> 
     </WindowsFormsHost> 
    </Grid> 
</UserControl> 

en cuenta que la altura y la anchura son de auto.

Cuando lo tengo en un panel de pila o control de cuadrícula, establece su altura en 0 y básicamente desaparece. Luego se requiere que el usuario cambie el tamaño de la ventana (que se redujo porque el usuario dijo que no necesitaba espacio, gracias). Cuando el usuario cambia el tamaño, se extiende a lo que especifique el usuario.

Entonces mi pregunta es: ¿qué hice mal? ¿Cómo hago que mi usercontrol tome todo el espacio disponible en lugar de no solicitar ninguno?

Respuesta

3

Tuve este mismo problema. La forma en que lo arreglé fue para cambiar el tamaño del control dentro de WindowsFormsHost en tiempo de ejecución.

En mi caso utilicé un StackPanel para alojar el control y en el tiempo de ejecución establecí el alto y el ancho del control dentro de mi WindowsFormsHost a la altura y el ancho del Stackpanel. Desea utilizar las propiedades ActualHieight y ActualWidth.

Lamentablemente tuve que conectarme al evento de dimensionamiento para cambiarlo cada vez que se redimensionaba la ventana.

19

Encuentro una mejor respuesta.

Utilice un dockPanel con LastChildFill = true y luego coloque dentro de WindowsFormsHost con alineación horizontal y vertical en Strech y, por supuesto, el control de WindowsForms debe cumplimentarse.

<DockPanel LastChildFill="true"> 
    <WindowsFormsHost HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
     <Panel Dock=Fill /> 
    </WindowsFormsHost> 
</DockPanel> 

Disfrute',

2

que tenía algún tipo de problema similar. Pude solucionar mi problema eliminando la configuración de Altura y Ancho mínima y máxima del formulario de WinForm.

Después de eso utilicé el DockPanel como se sugirió ykatchou. Todavía tengo algunos problemas con DPI, pero no creo que importen mucho. Es feo, pero está funcionando

4

El mismo problema aquí. Lo que he hecho es vincular las dimensiones de control de WindowsForm (que deben incluirse) con las dimensiones (ancho y alto) del host principal (es decir, el WindowsFormHost), ver el código a continuación. Esto se hace después de cargar el formulario de ventanas:

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    UserWinFormControl.Height = UserWinFormControl.Parent.Height; 
    UserWinFormControl.Width = UserWinFormControl.Parent.Width; 

} 

Dónde UserWinFormControl es el control para ser embebido/organizado por el WindowsFormHost En la escritura Xaml:

<Window x:Class="myAppWpf.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:WinForms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" 
     Title="MyApp" 
     Height="737" 
     Width="1024" 
     WindowStartupLocation="CenterScreen" 
     Loaded="Window_Loaded"> 
     <......> 
     <DockPanel LastChildFill="true"> 
         <WindowsFormsHost Name="windowsFormsHost1"DockPanel.Dock="Top" 
              Background="Yellow"   
              HorizontalAlignment="Stretch"    
              VerticalAlignment="Stretch" > 
         </WindowsFormsHost> 
     </DockPanel> 
     </....> 
</Window> 

Todo sin bien está trabajando parpadea cuando cambiar el tamaño de la aplicación.

+1

Gracias - De alguna manera dando el control de un color de fondo reduce drásticamente el parpadeo de los controles. – Justin

4

Algunas correcciones: DockPanel tiene LastChildFill habilitado por defecto, y las alineaciones horizontales y verticales también se configuran automáticamente para estirar.

Así que la respuesta correcta es: Utilice un DockPanel

<DockPanel> 
    <WindowsFormsHost> 
    </WindowsFormsHost> 
</DockPanel> 
Cuestiones relacionadas