2009-06-10 18 views
10

ho voluto avvolgere un controllo Windows Form in un controllo utente WPFWPF WindowsFormsHost dimensionamento

<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> 

noti che altezza e la larghezza sono auto.

Quando lo ho in un controllo stackpanel o griglia, imposta la sua altezza su 0 e scompare praticamente. L'utente è quindi tenuto a ridimensionare la finestra (che è rimpicciolita perché l'usercontrol ha detto che non ho bisogno di spazio, grazie). Quando l'utente ridimensiona, si estende a qualunque cosa l'utente specifichi.

Quindi la mia domanda è: cosa ho sbagliato? Come faccio a rendere il mio sistema di gestione degli accessi tutto lo spazio disponibile invece di non chiederlo?

risposta

3

Ho avuto lo stesso problema. Il modo in cui l'ho risolto è stato modificare la dimensione del controllo all'interno di WindowsFormsHost in fase di runtime.

Nel mio caso ho usato uno StackPanel per ospitare il controllo e in fase di esecuzione ho impostato l'altezza e la larghezza del controllo all'interno del mio WindowsFormsHost all'altezza e alla larghezza dello Stackpanel. Si desidera utilizzare le proprietà ActualHieight e ActualWidth.

Sfortunatamente dovevo collegarmi all'evento di dimensionamento cambiandolo ogni volta che la finestra veniva ridimensionata.

19

Trovo una risposta migliore.

Utilizzare un dockPanel con LastChildFill = true e quindi inserire all'interno WindowsFormsHost con Alineament orizzontale e verticale su Strech e ovviamente il controllo WindowsForms deve essere compilato.

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

Godetevi',

2

ho avuto qualche tipo di problema simile. Sono stato in grado di risolvere il mio problema rimuovendo le impostazioni di altezza e larghezza min e max dal modulo winForm.

Successivamente ho usato il DockPanel come suggerito da ykatchou. Ho ancora alcuni problemi con DPI, ma non credo che contino molto. È brutto, ma funziona

4

Lo stesso problema qui. Quello che ho fatto è di associare le dimensioni del controllo WindowsForm (che devono essere incorporate) alle dimensioni (Larghezza e Altezza) dell'host genitore (cioè WindowsFormHost) vedere il codice seguente. Questo viene fatto dopo che il modulo di Windows viene caricato:

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

} 

Dove UserWinFormControl è il controllo deve essere embeded/ospitata dal WindowsFormHost Nella scrittura 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> 

Tutti nessuna ammenda sta lavorando sfarfallio quando ridimensionamento dell'app.

+1

Grazie - dando qualche modo il controllo di un colore di sfondo drasticamente ridotto il tremolio dei controlli. – Justin

4

Alcune correzioni: DockPanel ha LastChildFill abilitato per impostazione predefinita e gli allineamenti orizzontali e verticali vengono automaticamente impostati per allungare.

Quindi la risposta concisa è: utilizzare un DockPanel

<DockPanel> 
    <WindowsFormsHost> 
    </WindowsFormsHost> 
</DockPanel> 
Problemi correlati