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 ウィンドウを有効にしたときの出力です