0

私は WPFExtensions の ZoomControl を使用してます。ソースコードはこちら.

OnRender メソッドでアドナーを追加しました。

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

ZoomControl xaml を使用:

<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);
}

イメージ コントロールをドラッグすると、装飾が動きません。

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 にありますか?

サンプルアプリはこちら.

解決:

キャンバスを 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>

説明はこちらです。

4

1 に答える 1

1

わかりました、私はあなたのサンプルアプリを調べて、スヌープでチェックしました. そのため、変換は何らかの方法で装飾者にも適用されているようですが、ビジュアルは正しく更新されていません。パニングは実際には機能しますが、装飾者が適切に無効化されていないだけです。簡単なアイデアの 1 つは、ズーム、平行移動 x、平行移動 y の adorner 依存関係プロパティを指定し、プロパティ フラグ "AffectsRender" を設定して、それらをズーム コントロールからキャンバスにバインドすることです。ズーム コントロールがこれらのプロパティの 1 つを変更するたびに、バインディングによって装飾プロパティが更新され、「AffectsRender」フラグによって直接無効化されます。

[最初の回答ですが、有効ではありません]

ズーム コントロールの変換を装飾に適用していますか? 装飾はコントロールに配置されないため、実際には、提供されたコントロールから上方向にある次の AdornerDecorator に登録されます。私の推測では、見つかった唯一のデコレーター (またはレイヤー) は、ウィンドウのデフォルトのものです。コントロールの変換を装飾に適用すると、機能するはずです。または、AdornerDecorator を Zoomcontrol 内に配置することもできますが、正直なところ、これが望ましい効果をもたらすかどうかはわかりません。

于 2012-01-03T15:29:02.243 に答える