2012-01-03 6 views
0

私はWPFExtensionsからZoomControlを使用しています。ソースコードはhereです。MeasureOverrideとArrangeOverrideは呼び出されません

私はOnRenderメソッドでadorner追加しました:ZoomControlのXAMLを使用して

protected override void OnRender(DrawingContext drawingContext) 
{ 
    drawingContext.DrawEllipse(
     new SolidColorBrush(Colors.CornflowerBlue), 
     null, 
     new Point(1292, 100), 
     100, 100); 
} 

を:

adornerを適用
<Controls:ZoomControl x:Name="zoomControl1" Background="AliceBlue"> 
     <Canvas Width="{Binding Path=SModel.Width}" Height="{Binding Path=SModel.Height}"> 
      <Image HorizontalAlignment="Center" 
        Name="image1" Stretch="Fill" 
        VerticalAlignment="Center" Source="/Z;component/Images/00000006.jpg" 
        Margin="0,0,0,0" Canvas.Left="1" 
        Width="{Binding Path=SModel.Width}" Height="{Binding Path=SModel.Height}"> 
        <Image.LayoutTransform> 
         <RotateTransform Angle="{Binding Path=SModel.Angle}" /> 
        </Image.LayoutTransform> 
      </Image> 
     </Canvas> 
</Controls:ZoomControl> 

public Window1() 
{ 
    InitializeComponent(); 
    image1.Loaded += loaded; 
} 

private void loaded(object sender, RoutedEventArgs e) 
{ 
    var adorner = new SplitAdorner(image1); 
    AdornerLayer.GetAdornerLayer(image1).Add(adorner); 
} 

私はImageコントロールをドラッグすると、私のadornerがあります動いていない。

私はArrangeOverrideとMeasureOverrideをオーバーライドしようとしました:

protected override Size MeasureOverride(Size constraint) 
{ 
    Debug.WriteLine("measureoverride"); 
    InvalidateVisual(); 
    return base.MeasureOverride(constraint); 
} 

protected override Size ArrangeOverride(Size finalSize) 
{ 
    Debug.WriteLine("arrangeoverride"); 
    InvalidateVisual(); 
    return base.ArrangeOverride(finalSize); 
} 

しかし、効果なし。アウトプットウィンドウに何も表示されず、アドラーが動いていません。

私がズームしているときは、すべて問題ありません。 Adornerはそれに応じて画像コントロールの変更を変更します。

問題は私のコードまたはZoomControlですか?

例のアプリはhereです。

SOLUTION:

私はAdornerDecoratorに私のキャンバスを入れていた:

<Controls:ZoomControl x:Name="zoomControl1" Background="AliceBlue"> 
     <AdornerDecorator> 
      <Canvas Width="{Binding Path=SModel.Width}" Height="{Binding Path=SModel.Height}"> 
       <Image HorizontalAlignment="Center" 
        Name="image1" Stretch="Fill" 
        VerticalAlignment="Center" Source="/Z;component/Images/00000006.jpg" 
        Margin="0,0,0,0" Canvas.Left="1" 
        Width="{Binding Path=SModel.Width}" Height="{Binding Path=SModel.Height}"> 
        <Image.LayoutTransform> 
         <RotateTransform Angle="{Binding Path=SModel.Angle}" /> 
        </Image.LayoutTransform> 
       </Image> 
      </Canvas> 
     </AdornerDecorator> 
    </Controls:ZoomControl> 

説明hereです。

答えて

1

あなたのサンプルアプリを調べて、スヌープでチェックしました。だから、変換は何らかの形でアドコーナーにも適用されますが、ビジュアルは正しく更新されていないようです。パンニングは実際にはうまくいきます、あなたのアドナーが適切に無効にされていないことだけです。 簡単なアイデアは、あなたのadorner依存関係プロパティにズーム、変換x、y変換、プロパティフラグ "AffectsRender"を設定し、それらをズームコントロールからキャンバスにバインドすることです。ズームコントロールがこれらのプロパティのうちの1つを変更するたびに、adornersのプロパティはバインディングを介して更新され、 "AffectsRender"フラグによって直接無効化されます。

[最初の答えではなく、有効な]

あなたadornerにズーム制御の変換を適用していますか?アドナーはコントロールに配置されていないため、実際にはアドオンはそのアドオン・デコレータに登録されています。私の推測では、見つかった唯一のデコレータ(またはレイヤー)は、ウィンドウのデフォルトのものです。コントロールの変形をあなたのアドナーに適用すれば効果があります。または、あなたのZoomcontrolの中にAdornerDecoratorを置くことができますが、正直なところ、これに希望の効果があるかわかりません。

+0

ズームについてはどうですか?画像をズームすると、アダプターが自動的に変更されます。変換は何らかの形で適用されます。 – ieaglle

+0

それは私をうんざりさせます。表示された内容を何らかの形で変更している場合を除いて、どのような方法でもズームもパンもしないでください。コードをチェックします。その間、あなたは私のアドバイスを試みましたか? – dowhilefor

+0

進行中...:) – ieaglle

関連する問題