2009-06-10 123 views
10

我想在一個WPF用戶控件來包裝一個Windows窗體控件WPF WindowsFormsHost漿紗

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

注意高度和寬度自動。

當我在一個堆棧面板或網格控件中它將其高度設置爲0並基本消失。然後用戶需要調整窗口大小(因爲用戶控件說我不需要空間,所以縮小了窗口大小,謝謝)。當用戶調整大小時,它會延伸到用戶指定的任何地方。

所以我的問題是我做錯了什麼?我如何讓我的用戶控件獲得所有可用空間而不是不要求任何?

回答

3

我有同樣的問題。我修正它的方式是在運行時改變WindowsFormsHost中控件的大小。

在我的情況下,我用一個StackPanel託管控件,並在運行時將我的WindowsFormsHost中的控件的高度和寬度設置爲Stackpanel的高度和寬度。您想要使用ActualHieight和ActualWidth屬性。

不幸的是,每次窗口大小調整時,我都必須調整大小調整事件。

19

我找到了更好的答案。

使用帶有LastChildFill = true的dockPanel,然後放入帶有水平和垂直對齊的WindowsFormsHost到Strech中,當然必須填寫WindowsForms控件。

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

享受」,

2

我有某種類似的問題的。我能夠通過從winForm窗體中刪除最小和最大高度和寬度設置來解決我的問題。

之後,我用DockPanel像ykatchou建議。我仍然與DPI有一些問題,但我認爲他們不會太重要。這是醜陋的,但它的工作

4

這裏同樣的問題。我所做的是將WindowsForm控件(必須嵌入)尺寸綁定到父主機的尺寸(寬度和高度)(即WindowsFormHost),請參閱下面的代碼。這樣做是Windows窗體加載後:

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

} 

凡UserWinFormControl是由WindowsFormHost 託管在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> 

所有工作正常,沒有閃現調整應用程序的大小。

+1

謝謝 - 不知怎的,給予控制背景顏色大大減少控件的閃爍。 – Justin 2012-05-29 15:59:39

4

一些更正:DockPanel默認啓用LastChildFill,水平和垂直對齊也會自動設置爲伸展。

所以簡潔的答案是:使用DockPanel中

<DockPanel> 
    <WindowsFormsHost> 
    </WindowsFormsHost> 
</DockPanel>