2013-02-27 13 views
0

WPF 응용 프로그램에서 WindowsFormHost가있는 패널이 있습니다. 결국 나는 포인트를 클릭하고 그릴 수 있어야합니다. 별도의 WinForm 양식에서 완전히 작업했습니다 ...하지만 Invalidate()가 호출 될 때 어떤 이유로 페인트 이벤트가 전혀 실행되지 않습니다! 메시지 상자가 클릭에 표시되면서 click 이벤트가 확실히 발생합니다. 그래도 페인트에서 들여다 보지 마라. 왜 내 인생에 대한 이유는 모르겠다. 여기 코드가있다.WindowsFormHost 페인트 이벤트가 실행되지 않음

XML :

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" 
    Title="MainWindow" Height="1000" Width="1000" 
    WindowState="Maximized" SizeChanged="Window_SizeChanged" LocationChanged="Window_LocationChanged" Background="Gray"> 

<DockPanel LastChildFill="True"> 
    <ToolBarTray DockPanel.Dock="Top"> 
    <ToolBar Width="Auto" HorizontalAlignment="Stretch"> 
      <Menu> 
       <MenuItem Header="File" VerticalAlignment="Center"> 
         <MenuItem Header="New" Click="MenuItem_Click_3" /> 
         <MenuItem Header="Open" Click="MenuItem_Click_4"/> 
         <MenuItem Header="Open Recent"> 
          <MenuItem Header="Some Recent Files"/> 
         </MenuItem> 
         <MenuItem Header="Import H2OFate File" Click="MenuItem_Click_7"/> 
         <Separator/> 
         <MenuItem Header="Save" Click="MenuItem_Click_1" /> 
         <MenuItem Header="Save As" Click="MenuItem_Click_5"/> 
         <MenuItem Header="Save without Results"/> 
         <MenuItem Header="Delete Unnecessary Files"/> 
         <Separator/> 
         <MenuItem Header="File Options"/> 
         <Separator/> 
         <MenuItem Header="Project Info"/> 
         <MenuItem Header="Supply Info" /> 
         <Separator/> 
         <MenuItem Header="Print" Click="MenuItem_Click_6" /> 
         <Separator/> 
         <MenuItem Header="Reload Current File"/> 
         <MenuItem Header="Exit    CTRL+Q" Click="MenuItem_Click"/> 
         </MenuItem> 
      <MenuItem Header="Network Design" VerticalAlignment="Center"> 
         <MenuItem Header="Something" Click="MenuItem_Click_8"/> 
      </MenuItem> 
      <MenuItem Header="Run Analysis" VerticalAlignment="Center"> 
        <MenuItem Header="Run" Click="MenuItem_Click_2"/> 
      </MenuItem> 
      <MenuItem Header="View Results" VerticalAlignment="Center"> 
        <MenuItem Header="Numeric"/> 
        <MenuItem Header="X-Y Plots"/> 
        <MenuItem Header="Contours"/> 
        <MenuItem Header="Reports"/>             
      </MenuItem> 
      <MenuItem Header="Facilities Management" VerticalAlignment="Center"> 
        <MenuItem Header="Some Item"/> 
        <MenuItem Header="Hydraulics"/> 
        <MenuItem Header="Contamination"/> 
        <MenuItem Header="Sensor Placement"/> 
      </MenuItem> 
      <MenuItem Header="Tools/Databases" VerticalAlignment="Center"> 
        <MenuItem Header="Some Item"/> 
        <MenuItem Header="Hydraulics"/> 
        <MenuItem Header="Contamination"/> 
        <MenuItem Header="Sensor Placement"/> 
      </MenuItem> 
      <MenuItem Header="Help" VerticalAlignment="Center"> 
        <MenuItem Header="Some Item"/> 
        <MenuItem Header="Help"/> 
        <MenuItem Header="Units"/> 
        <MenuItem Header="Demo Examples"/> 
        <MenuItem Header="Tutorial"/> 
        <MenuItem Header="How To"/> 
        <MenuItem Header="About"/> 
      </MenuItem> 
      </Menu> 
      </ToolBar> 

    <ToolBar> 

      <Button Height="38" Width ="50" VerticalAlignment="Center" Click="Button_Click_1">       
       <Ellipse Width="25" Height="25" Fill="Blue" Stroke="Black" VerticalAlignment="Center"/> 
      </Button > 
      <Button Height="38" Width ="50" VerticalAlignment="Center" Click="Button_Click_1"> 
       <Rectangle Width="38" Fill="Red" Height="7" Stroke="Black"/> 
      </Button > 
      <Button Height="38" Width ="50" VerticalAlignment="Center" Click="Button_Click_2"> 
       <Polygon Fill="Yellow" Stroke="Black" Points="0,10 30,10 30,0 28,0 28,3 2,3 2,0 0,0" VerticalAlignment="Center"/> 
      </Button > 
      <Button Height="38" Width ="50" VerticalAlignment="Center" Click="Button_Click_3"> 
       <Polygon Stroke="Black" Fill="Green" VerticalAlignment="Center" Points="22,0 22,7 15,7 15,15 9,15 9,7 0,7 0,0 "/> 
      </Button > 
    </ToolBar> 
     </ToolBarTray> 
      <TabControl Width ="1000" DockPanel.Dock="Left"> 
     <TabItem Header="Map"> 
      <Grid> 
       <Grid.RowDefinitions> 
        <RowDefinition/> 
       </Grid.RowDefinitions> 
       <WindowsFormsHost Grid.Row="0" x:Name="wfPanel" > 
        <WindowsFormsHost.Child> 
         <wf:Panel x:Name="wfSurface" MouseClick="wfSurface_MouseClick"/> 
        </WindowsFormsHost.Child> 
       </WindowsFormsHost> 
      </Grid> 
     </TabItem> 
     <TabItem Header="Map Settings"> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="250"/> 
        <ColumnDefinition/> 
       </Grid.ColumnDefinitions> 
       <Button Content="Testing 123"/> 
      </Grid> 
     </TabItem> 

    </TabControl> 
    <TabControl DockPanel.Dock="Right"> 

    </TabControl> 
</DockPanel> 

C#을

private void wfSurface_Paint(object sender, System.Windows.Forms.PaintEventArgs e) 
    { 
     Graphics g; 
     g = wfSurface.CreateGraphics(); 
     epanet epa = epanet.GetInstance(); 
     SolidBrush s = new SolidBrush(System.Drawing.Color.Blue); 
     g.FillEllipse(s, Convert.ToInt32(epa.xCord), Convert.ToInt32(epa.yCord), 50, 50); 
     g.FillEllipse(s, 400, 400, 500, 500); 
     MessageBox.Show("paint event fired"); 
    } 

    private void wfSurface_MouseClick(object sender, System.Windows.Forms.MouseEventArgs e) 
    { 
     epanet epa = epanet.GetInstance(); 
     epa.xCord = e.X; 
     epa.yCord = e.Y; 
     MessageBox.Show("xCord is: " + e.X.ToString()); 
     wfSurface.Invalidate(); 
    } 

편집 :

그리고 더 페인트 이벤트 내가 클릭으로 라인 g.FillEllipse(s,400,400,400,400);을 추가 문제가 있는지 확인하기 이벤트가 성공적으로 타원을 그렸습니다. WPF 사람의 많은하지

+0

내가 마우스 클릭 이벤트를 볼 수 있지만, 당신은 페인트 이벤트에 가입되어 어디 표시되지 않습니다. – LarsTech

+0

@LarsTech : 그게'개인 무효 wfSurface_Paint (개체 발신자, System.Windows.Forms.PaintEventArgs 전자)'아닌가요? 그리고'wfSurface.Invalidate() :'에 의해 해고 당했습니까? –

+0

아니, 그게 방법이야,하지만 난 아무것도 그것을 부르고 있다고 생각하지 않습니다. – LarsTech

답변

1

,하지만 내 생각 엔이를 추가하는 것입니다 :

<WindowsFormsHost.Child> 
    <wf:Panel x:Name="wfSurface" Paint="wfSurface_Paint" 
           MouseClick="wfSurface_MouseClick"/> 
</WindowsFormsHost.Child> 
+0

남자 ... 나는 어리 석다. Lars 감사합니다! –