2017-08-09 13 views
0

WPFでイメージのスケールを動的に更新する際に問題が発生しています。私が望む正確な振る舞いは、ボタンをクリックすると、私はUserControl内の画像を拡大(または縮小)したいと思います。WPFのImageで実行時にスケールを更新するにはどうすればよいですか?

私のXAML:

<UserControl x:Class="Company.Scaling.ScaleControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 
<Grid> 
    <Image x:Name="imageContainer" Stretch="None" Focusable="False" HorizontalAlignment="Left" VerticalAlignment="Top"> 
     <Image.LayoutTransform> 
      <ScaleTransform x:Name="scaleTransform"> 
      </ScaleTransform> 
     </Image.LayoutTransform> 
    </Image> 
</Grid> 

私は現在、このような特性scaleXプロパティとscaleYを更新しています:

this.scaleTransform.ScaleX = this.ZoomScale; 
this.scaleTransform.ScaleY = this.ZoomScale; 

それは私がのコンストラクタでこれらを更新していたときに動作します私のXAMLはこうです:

public ScaleControl() 
{ 
    this.InitializeComponent(); 

    this.ZoomScale = 1.5f; 
} 

しかし、これらのプロパティをランタイムで更新しているとき(ボタンをクリックした後)、それは機能しません。

何か不足していますか?

ありがとうございました!

編集:

クレメンスが言ったことの後、私はいくつかを追加しました。 XAMLで

バインディング:

<Image.LayoutTransform> 
      <ScaleTransform 
       ScaleX="{Binding ZoomScale, RelativeSource={RelativeSource AncestorType=UserControl}}" 
       ScaleY="{Binding ZoomScale, RelativeSource={RelativeSource AncestorType=UserControl}}" /> 
     </Image.LayoutTransform> 

依存関係プロパティ:

public static readonly DependencyProperty ZoomScaleProperty = DependencyProperty.Register("ZoomScale", typeof(double), typeof(ScaleControl)); 

とプロパティ:

public double ZoomScale 
{ 
    get { return (double)this.GetValue(ZoomScaleProperty); } 
    set { this.SetValue(ZoomScaleProperty, value); } 
} 

私はWPFにかなり新しいですので、多分私が行方不明です私は何かを理解することはできません。

+0

あなたは 'ZoomScale'を変えていますか? –

+0

はい、私はしています:this.ZoomScale = 1.6と何も起こらない – Seb

+0

私は、ZoomScaleのDependencyPropertyを作成してそれを設定するClemensの答えを使用することをお勧めします。コンストラクタ中にZoomScaleを一度設定すると、ランタイムを通じて値が更新されません。 –

答えて

2

ZoomScaleプロパティを設定しても、ScaleTransformのScaleXプロパティとScaleYプロパティが魔法のように更新されることはありません。

バインド ScaleTransformプロパティをZoomScaleにバインドする必要があります。このように:

<Image ...> 
    <Image.LayoutTransform> 
     <ScaleTransform 
      ScaleX="{Binding ZoomScale, 
        RelativeSource={RelativeSource AncestorType=UserControl}}" 
      ScaleY="{Binding ZoomScale, 
        RelativeSource={RelativeSource AncestorType=UserControl}}" /> 
    </Image.LayoutTransform> 
</Image> 

詳細については、Data Binding Overviewを参照してください。

さらに、ZoomScaleプロパティは値の変更について通知する必要があります。 DependencyObjectから派生したクラスでは、通常このように、依存関係プロパティとして宣言します:

public static readonly DependencyProperty ZoomScaleProperty = DependencyProperty.Register(
    "ZoomScale", typeof(double), typeof(ScaleControl)); 

public double ZoomScale 
{ 
    get { return (double)GetValue(ZoomScaleProperty); } 
    set { SetValue(ZoomScaleProperty, value); } 
} 
0

だから、私は右のものを追加したと思う:

public static readonly DependencyProperty ScalingProperty = DependencyProperty.Register("ZoomScale", typeof(float), typeof(UserControl)); 

依存プロパティの場合は
public float ZoomScale { get { return (float)GetValue(ScalingProperty); } set { SetValue(ScalingProperty, value); } } 

です。また、私は追加しました:ボタンがクリックされたときに

私のXAMLで
ScaleX="{Binding ZoomScale, RelativeSource={RelativeSource AncestorType=UserControl}}" 

何もスケールするようです。..

+0

回答を書かないでください。代わりに質問を編集してください。そして、私の答えで不動産宣言を注意深く読んでください。プロパティの型は 'double'でなければならず、Register *の3番目の引数は' typeof(ScaleControl) '(または派生したUserControlクラスが実際に何であっても)でなければなりません。 – Clemens

+0

はい、申し訳ありませんが、私はかなりStackOverflowに慣れているので、最初の質問を編集していくつか追加しました。 – Seb

関連する問題