2008-08-26 7 views
1

Silverlight 2 Beta 2でレンダリングトランスフォームのScaleXとScaleYをデータバインドすることは可能ですか?バインディングの変換はWPFでも可能ですが、XAMLを通じてSilverlightでバインディングを設定するとエラーが発生します。おそらくそれはコードを介して行うことは可能ですか?Databind RenderTransform Scaling in Silverlight 2 Beta 2

<Image Height="60" HorizontalAlignment="Right" 
     Margin="0,122,11,0" VerticalAlignment="Top" Width="60" 
     Source="Images/Fish128x128.png" Stretch="Fill" 
     RenderTransformOrigin="0.5,0.5" x:Name="fishImage"> 
    <Image.RenderTransform> 
     <TransformGroup> 
      <ScaleTransform ScaleX="1" ScaleY="1"/> 
      <SkewTransform/> 
      <RotateTransform/> 
      <TranslateTransform/> 
     </TransformGroup> 
    </Image.RenderTransform> 
</Image> 

ScaleTransform要素のScaleXとScaleYをバインドします。このような

Message="AG_E_PARSER_BAD_PROPERTY_VALUE [Line: 1570 Position: 108]" 

マイ結合ルックス::私は、トリプルことを確認した

<ScaleTransform ScaleX="{Binding Path=SelectedDive.Visibility}" 
       ScaleY="{Binding Path=SelectedDive.Visibility}"/> 

私は私のデータコンテキストをダブルプロパティに対してバインドしようとすると、

私はランタイムエラーを取得していますバインディングのパスは正しいです - 私は同じ値に対してスライドバーをバインドしていますが、それは正常に動作します...

可視性はdouble型で、0.0から30.0の間の数値です。その数値を0.5と1にスケールアップするバリューコンバータがあります。水の透明度に応じて魚のサイズをスケールしたいと思っています。だから私はそれが拘束力のあるタイプの問題だとは思わない。

答えて

1

ScaleTransformにはデータコンテキストがないため、バインディングはSelectedDive.Visibilityを探していますが、それは自己であり、見つからない可能性があります。

とにかくこれを解決するには、コード**でバインディングを設定するか、手動でデータオブジェクトのPropertyChangedイベントをリッスンして設定する必要があります。コード内のスケール。

スケール変更のアニメーション/ストーリーボードを実行する場合は、後者を選択します。

**チェックする必要がありますが、バインドできないことがあります。 RenderTransformがアニメーションの一部ではない場合は、行列変換に変換され、すべてのベットはオフになっていることを思い出してください。

1

Jonasは実行時エラーかコンパイル時ですか?あなたはfooとbarが適切なタイプである

<ScaleTransform ScaleX="{Binding Foo}" ScaleY="{Binding Bar}" /> 

を...書くことができる必要がありますので、documentationを見てみると、scaleXプロパティとscaleYは、依存関係プロパティです。

編集:もちろん、これはWPFのドキュメントです。 ScaleXとScaleYをSilverlightの依存プロパティではなく標準プロパティに変更した可能性があります。あなたが見ているエラーについてもっと知りたいです。

0

ああ私はあなたの問題を見ると思います。 Visibility(SelectedDive.Visibility)型のプロパティをDouble(ScaleTransform.ScaleX)型のプロパティにバインドしようとしています。 WPF/Silverlightは、これらの2つのタイプ間で変換することはできません。

あなたは何を達成しようとしていますか?たぶん、私はXAMLであなたを助けることができます。 "SelectedDive"とは何ですか?可視性が変更されたときに何をしたいですか?

0

申し訳ありませんが、回答数が増えていますので、詳しい情報で質問を編集したとは思いませんでした。

いいえ、VisibilityはDouble型なので、バインディングはその点で機能するはずです。

回避策として、ScaleXとScaleYの値をSelectedDive.Visibilityがバインドされているスライダコントロールに直接バインドしてみることができますか?次のようなもの:

<ScaleTransform ScaleX="{Binding ElementName=slider1,Path=Value}" ... /> 

それがうまくいくなら、少なくともあなたは行くでしょう。

編集:ああ、私は一度SilverlightがバインディングのElementName構文をサポートしていないと読んでいたので、うまくいかないかもしれません。

0

おそらく、埋め込みレンダリングトランスフォームは、DataContextを適用対象のオブジェクトから継承していない可能性があります。あなたはそれらにDataContextを強制することができますか?スケーラは間違いなく画像とのDataContextのを共有するように...

myScaler.DataContext = fishImage.DataContext; 

<ScaleTransform x:Name="myScaler" ... /> 

...そして、あなたのコードビハインドで:たとえば、変換に名前を付けます。

+0

変換タグ名を付けることはできません – Neo42

0

いいえ、Image自体がDataContextを正しくピックアップしていますか?

<Image Tooltip="{Binding SelectedDive.Visibility}" ... /> 

それがコンパイルされ、実行された場合、画像上にカーソルを移動し、それが正しい値を表示するかどうかを確認:これを追加

してみてください。

0

私はこれをXAMLで解決することを望んでいましたが、ブライアンの提案が道のりでした。スケール変換に名前を付けるためにMattの提案を使用したので、コードからアクセスできます。次に、スライダの値変更イベントをフックし、ScaleXプロパティとScaleYプロパティを手動で更新します。私は視界範囲(0〜30m)からスケール(0.5〜1)に変換するためにバリューコンバータを使用しました。コードは次のようになります。

private ScaleConverter converter; 

    public DiveLog() 
    {   
     InitializeComponent(); 

     converter = new ScaleConverter(); 
     visibilitySlider.ValueChanged += new 
      RoutedPropertyChangedEventHandler<double>(visibilitySlider_ValueChanged); 
    }   

    private void visibilitySlider_ValueChanged(object sender, 
             RoutedPropertyChangedEventArgs<double> e) 
    { 
     fishScale.ScaleX = (double)converter.Convert(e.NewValue, 
            typeof(double), null, CultureInfo.CurrentCulture); 
     fishScale.ScaleY = fishScale.ScaleX; 
    }