0

2011 年から完全に動作している vb6 アプリケーションを wpf で再構築しています。私のアプリは 11 個のドキュメントを処理します。vb6 では、MDI で 11 のフォームを使用しました。

wpf では、Hold と呼ばれる Canvas を使用しています。このキャンバスには、私が Doc と呼んだ FrameworkElement の 11 個のインスタンスが保持されます。

Doc には、私が Cell と呼んだクラスの図形とテキストを描画するためのメソッドがあります。Doc にセルを配置するには、グリッドを描画する Doc が必要です。そのために、true 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 で、doc の documentsReceipt インスタンスが showGrid で作成され、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>

を省略した場合のアプリdocumentReceipt=trueですWindow_Loaded

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

グリッドのないウィンドウ

これは、グリッドで showGrid ウィンドウを有効にしたときの出力です

4

1 に答える 1

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));
            }
        }
    }
}
于 2016-12-25T08:09:03.927 に答える