【问题标题】:FrameworkElement method does not draw grid when called from from XAML - but does from Window_loaded从 XAML 调用 FrameworkElement 方法时不绘制网格 - 但从 Window_loaded 调用
【发布时间】:2016-12-25 00:23:35
【问题描述】:

我正在 wpf 中重建我的 vb6 应用程序,该应用程序自 2011 年以来运行良好。 我的应用程序处理 11 个文档。在 vb6 中,我在 MDI 中使用了 11 种形式。

在 wpf 中,我使用了一个名为 Hold 的 Canvas。此画布包含 11 个我称为 Doc 的 FrameworkElement 实例。

Doc 具有为我称为 Cell 的类绘制形状和文本的方法。 为了在Doc中放置单元格,需要Doc绘制一个网格。为此,如果真正的 Doc 绘制网格,我有一个布尔字段 (bool _showGrid;)。

我的问题是 Doc FrameworkElement 在从 xaml 调用时不绘制网格。但从 Window_Loaded 可以。

这是 Doc 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);
    }

这是 xaml,其中在 showGrid 中创建 Doc 的documentsReceipt 实例设置为 true,女巫不工作:

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

这是当我从Window_Loaded 中省略documentReceipt=true 时的应用程序

private void Window_Loaded(object sender, RoutedEventArgs e)
{
   //documentsReceipt.showGrid = true;
}

Window without grid

这是我启用 showGrid 时的输出 Window with grid

【问题讨论】:

    标签: wpf xaml frameworkelement


    【解决方案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));
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      相关资源
      最近更新 更多