2016-12-25 27 views
0

我正在wpf中重建我的vb6應用程序,該應用程序自2011年以來完美運行。 我的應用程序處理11個文檔。在vb6中,我使用了MDI中的11個表單。FrameworkElement方法在從XAML調用時不繪製網格 - 但是從Window_loaded中執行

在wpf中我使用了一個我稱之爲「保持」的畫布。這個畫布包含我稱爲Doc的FrameworkElement的11個實例。

Doc具有繪製我稱爲Cell的類的形狀和文本的方法。 爲了將單元格放置在Doc中,需要Doc繪製網格。爲此我有一個布爾字段(布爾_showGrid;)如果真正的Doc繪製網格。

我的問題是,從xaml調用時,Doc FrameworkElement不繪製網格。但從Window_Loaded它的確如此。

這是文件FrameworkElement的的一部分:

public class Doc : FrameworkElement 
{ 
    VisualCollection paper; 
    DrawingVisual cellMaker; 

    bool _showGrid; 

    public Doc() 
    { 
     paper = new VisualCollection(this); 
     //SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased); 
    } 

    public bool showGrid 
    { 
     set 
     { 
      _showGrid = value; 
      if (_showGrid) 
      { 
       drawGrid(); 
      } 
     } 
    } 

    private void drawGrid() 
    { 
     DrawingVisual grid = new DrawingVisual(); 
     using(DrawingContext dc = grid.RenderOpen()) 
     { 
      for(int i = 0; i <= Width; i += 18) 
      { 
       dc.DrawLine(new Pen(Brushes.OrangeRed, 1), new Point(i, 0), new Point(i, Height)); 
      } 
      for(int j = 0; j <= Height; j += 18) 
      { 
       dc.DrawLine(new Pen(Brushes.OrangeRed, 1), new Point(0, j), new Point(Width, j)); 
      } 
      dc.Close(); 
     } 
     paper.Add(grid); 
    } 

而這正是文檔的documentsReceipt例如在showGrid創建設置爲true,巫不工作XAML:

<ScrollViewer Grid.Row="1" Grid.Column="0"> 
     <Canvas Name="Hold" Width="21cm" Height="29.7cm" Background="White" Margin="17"> 
      <dc:Doc Name="documentsReceipt" 
        Width="{Binding Path=ActualWidth,ElementName=Hold}" 
        Height="{Binding Path=ActualHeight,ElementName=Hold}" 
        showGrid="True" 
        Loaded="documentsReceipt_Loaded"> 
      </dc:Doc> 
      <TextBox Name="txt" 
        TextChanged="txt_TextChanged" 
        KeyDown="txt_KeyDown" 
        PreviewKeyDown="txt_PreviewKeyDown"/> 
     </Canvas> 
    </ScrollViewer> 

這是當我忽略documentReceipt=trueWindow_Loaded

應用3210

Window without grid

這就是輸出的時候我能showGrid Window with grid

回答

1

通常你實現這樣一個有點不同的控制。首先,您需要ShowGrid的依賴項屬性才能進行綁定。接下來是你重寫OnRender來繪製你的形狀(或者什麼)。這裏是控制的完整實施:

public class Doc : FrameworkElement 
{ 
    public bool ShowGrid 
    { 
     get { return (bool)GetValue (ShowGridProperty); } 
     set { SetValue (ShowGridProperty, value); } 
    } 

    public static readonly DependencyProperty ShowGridProperty = 
     DependencyProperty.Register ("ShowGrid", typeof (bool), typeof (Doc), new FrameworkPropertyMetadata (false, FrameworkPropertyMetadataOptions.AffectsRender)); 

    protected override void OnRender (DrawingContext dc) 
    { 
     if (ShowGrid) 
     { 
      for (int i = 0; i <= ActualWidth; i += 18) 
      { 
       dc.DrawLine (new Pen (Brushes.OrangeRed, 1), new Point (i, 0), new Point (i, Height)); 
      } 

      for (int j = 0; j <= ActualHeight; j += 18) 
      { 
       dc.DrawLine (new Pen (Brushes.OrangeRed, 1), new Point (0, j), new Point (Width, j)); 
      } 
     } 
    } 
} 
相關問題