2011-12-16 13 views
0

私は、次のような制御を持っている:WPFキャンバス希望のサイズ

<UserControl x:Class="FooBar.AnnotationControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Height="400" Width="500" > 
    <ScrollViewer Height="400" Width="500"> 
     <Canvas Height="400" Width="500" Name="ctlCanvas" MouseLeftButtonDown="MouseLeftButtonDownHandler" MouseWheel="Canvas_MouseWheel" > 
      <Canvas.RenderTransform> 
       <ScaleTransform x:Name="ZoomTransform" /> 
      </Canvas.RenderTransform> 
     </Canvas> 
    </ScrollViewer> 
</UserControl> 

namespace FooBar 
{ 

    public partial class AnnotationControl : UserControl 
    { 
     public AnnotationControl() 
     { 
      InitializeComponent(); 

     } 

     private void MouseLeftButtonDownHandler(object sender, MouseButtonEventArgs args) 
     { 
      //Do Something 
     } 
     private void Canvas_MouseWheel(object sender, MouseWheelEventArgs e) 
     { 

      ctlCanvas.Measure(new Size(ctlCanvas.ActualWidth * ZoomTransform.ScaleX, ctlCanvas.ActualHeight * ZoomTransform.ScaleY)); 
     } 
    } 

} 

私はスクロール視聴者がキャンバスの拡大縮小に対応するために取得しようとしています。 Canvas.Measureを呼び出すと、キャンバスの希望サイズが変更されないように見えます。何がここで何が起こっている考えですか?

+0

最近の2つの質問のタイトルを改訂してください。タイトルにはタグ(WPFなど)が含まれていない2.問題の説明/適切な質問が必要です。 –

答えて

0

私は解決策を見つけたようです。キャンバスを別のキャンバスにラップすることができるように見えます。スケールするときは、外側キャンバスの高さと幅=初期高さと幅にScaleTransformの現在のXとYの倍率を設定するだけです。

0

キャンバスは最も基本的な要素であり、単にScrollViewerで動作するようには設計されていません。代わりに、Grid/StackPanel/WarPanel/UniformGridを使用してください。

+1

実際これは真実ではありません。もちろん、Canvasで動作しますが、誰かが期待しているように、そのままではありません。キャンバスのサイズがscrollviewerより大きい場合、scrollviewerはキャンバスを完全にスクロールします。 – dowhilefor

+0

どのレイアウト要素でもCanvasを使用する必要があります。それに私の言葉を持ってください。 –

+0

これは、矢印、楕円、線などを「描画」したり、ズームイン/ズームアウトするために使用しています。私はまだGrid/StackPanel/WarPanel/UniformGrid – PhilBrown

1

あなた自身で測定を呼び出すべきではありません。このメソッドはレイアウトステップで呼び出され、他の場所では呼び出されないはずです。また、RenderTransformはサイズを変更しません。 RenderTransformは、実際のLayoutが完了した後に適用されます。したがって、同じサイズのため、コンテンツをスクロールする必要のないスクロールビューアがあります。あなたが欲しいかもしれないものはLayoutTransformです。

+0

これは、ScaleTransformのようにマウスを中心に置かず、Silverlightでは機能しません。 – PhilBrown

+0

これは別の問題です。しかし、あなたは正しい、LayoutTransformはBEFOREレイアウト、RenderTransform AFTERレイアウトを変換するためのものです。しかし、レイアウトの後、Scrollviewerはどのくらいスケールしたいのか分かりません。あなたが達成したいのはもう少し複雑です。私はダイアグラムコントロールでも同じことをしました。私はRenderTransformを使用し、残りは手作業で作成しました。 – dowhilefor

関連する問題