2016-12-25 26 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)); 
      } 
     } 
    } 
} 
相关问题