スクロールバー付きのキャンバスを作成しようとしています。誰かが私がこれを行う方法についていくつかのアイデアを与えるのを手伝ってもらえますか?私はすでに1行1列のグリッドを使用しようとしましたが、特定の制約のためにキャンバスを使用したいと思います。
前もって感謝します!
スクロールバー付きのキャンバスを作成しようとしています。誰かが私がこれを行う方法についていくつかのアイデアを与えるのを手伝ってもらえますか?私はすでに1行1列のグリッドを使用しようとしましたが、特定の制約のためにキャンバスを使用したいと思います。
前もって感謝します!
スクロールビューアーの中にキャンバスを置くことができます。この簡単なテストを試してみたところ、キャンバスの内容をスクロールすることができました。
<ScrollViewer Height="100" Width="200">
<Canvas Height="400" Width="400">
//Content here
</Canvas>
</ScrollViewer>
編集:これは、スクロールバーが必要な場合にのみ表示され、キャンバスのサイズが変化すると動的に変化する例です。
<Button Content="Change Canvas Size" Click="ChangeCanvasSize_Click"/>
<ScrollViewer Height="100" Width="200" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
<Canvas x:Name="TestCanvas">
<TextBlock Text="Test Test"/>
</Canvas>
</ScrollViewer>
ボタンクリックでキャンバスサイズを変更する:
private void ChangeCanvasSize_Click(object sender, RoutedEventArgs e)
{
TestCanvas.Width = 600;
TestCanvas.Height = 600;
}
この例では、スクロールバーを使用せずに開始し、ボタンをクリックしてキャンバスを展開すると、スクロールバーが表示されます。
しばらくそれを使って作業した後、私は方法を見つけました。このようなXAMLを作成します
<ScrollViewer>
<Grid x:Name="drawingGrid" SizeChanged="drawingGrid_SizeChanged">
<Canvas Name="drawingCanvas"> /<Canvas>
</Grid>
</ScrollViewer>
windowLoad関数で、キャンバスの高さ/幅をグリッドの高さ/幅に等しく設定します。キャンバスのht/wdを更新します。
キャンバスの境界を超えて要素をドラッグするか、新しい要素を作成すると、キャンバスの端に近すぎます
double dHeight = 220;
if (drawingCanvas.Height < CurrentPosition.Y + dHeight)
{
// increase canvas height
drawingCanvas.Height += (2 * dHeight);
}
これがお役に立てば幸いです。誰かがこれを改善するためのより良いアイデアや提案があれば共有してください。
マリオサナムの答えとあなたの質問を組み合わせることで、私はほとんどの場合うまくいくはずの解決策を作りました。
<ScrollViewer>
<Grid x:Name="drawingGrid" SizeChanged="drawingGrid_SizeChanged">
<Canvas Name="c">
<TextBlock x:Name="draw_Text" Text="Test Test"/>
</<Canvas>
</Grid>
</ScrollViewer>
void drawingGrid_SizeChanged(object sender, SizeChangedEventArgs e)
{
try { c.Height = draw_Text.ActualHeight; } catch { }
try { c.Width = draw_Text.ActualWidth; } catch { }
}
これにより、scrollviewerがスクロールできるようにCanvasのサイズが変更されます...