1

Silverlight 2 Beta 2 でレンダー トランスフォームの ScaleX と ScaleY をデータバインドできるかどうか知っている人はいますか? WPF ではバインディング変換が可能ですが、XAML を使用して Silverlight でバインディングを設定するとエラーが発生します。おそらく、コードを介してそれを行うことは可能ですか?

<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 をバインドします。

データ コンテキストの double プロパティに対してバインドしようとすると、ランタイム エラーが発生します。

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

私のバインディングは次のようになります。

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

バインディング パスが正しいことを 3 回確認しました - 同じ値に対してスライドバーをバインドしていますが、問題なく動作します...

可視性は double 型で、0.0 から 30.0 までの数値です。その数値を 0.5 と 1 にスケーリングする値コンバーターがあります。水の透明度に応じて魚のサイズをスケーリングしたいと考えています。だから、私がバインドしているタイプの問題ではないと思います...

4

7 に答える 7

1

ScaleTransform にはデータ コンテキストがないため、バインディングがそれ自体から SelectedDive.Visibility を探している可能性が高く、見つからない可能性があります。Silverlight の xaml とデータ バインディングには、WPF とは異なる点がたくさんあります...

とにかくこれを解決するには、コード**でバインディングを設定するか、データ オブジェクトの PropertyChanged イベントを手動でリッスンし、コード ビハインドで Scale を設定します。

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

** チェックする必要がありますが、バインドできない可能性があります。RenderTransform がアニメーションの一部ではない場合、マトリックス変換に変換され、すべての賭けが無効になることを思い出してください。

于 2008-08-26T06:15:17.267 に答える
1

実行時エラーですか、それともコンパイル時ですか、ジョナス? ドキュメントを見ると、ScaleX と ScaleY は依存関係のプロパティなので、次のように記述できるはずです。

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

... Foo と Bar は適切な型です。

編集:もちろん、それはWPFのドキュメントです。ScaleX と ScaleY を、Silverlight の依存関係プロパティではなく標準プロパティに変更した可能性があると思います。表示されているエラーについて詳しくお聞かせください。

于 2008-08-26T02:43:45.543 に答える
0

私はこれを XAML で解決したいと思っていましたが、Brian の提案がその方法であることがわかりました。コードからアクセスできるように、マットの提案を使用してスケール変換に名前を付けました。次に、スライダーの値変更イベントをフックし、ScaleX および ScaleY プロパティを手動で更新します。可視範囲 (0 ~ 30 m) からスケール (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;
    }
于 2008-08-26T06:32:58.270 に答える
0

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

何を達成しようとしていますか?XAML についてお役に立てるかもしれません。「SelectedDive」とは何ですか?また、その可視性が変化したときにどうしたいですか?

于 2008-08-26T03:18:30.623 に答える
0

申し訳ありませんが、回答数を増やしたいと思っていたので、質問を編集して情報を追加したことに気づきませんでした。

わかりました。Visibility は Double 型なので、バインディングはその点で機能するはずです。

回避策として、ScaleX と ScaleY の値を、SelectedDive.Visibility がバインドされているスライダー コントロールに直接バインドしてみてください。何かのようなもの:

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

それがうまくいけば、少なくともうまくいくでしょう。

編集: ああ、Silverlight はバインドで ElementName 構文をサポートしていないため、機能しない可能性があることを一度読んだことを思い出しました。

于 2008-08-26T04:12:58.013 に答える
0

ええ、おそらく、埋め込まれたレンダリング変換は、適用先のオブジェクトから DataContext を継承していません。それらに DataContext を強制できますか? たとえば、変換に名前を付けます。

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

...そして、コードビハインドで:

myScaler.DataContext = fishImage.DataContext;

...スケーラーがその DataContext を Image と確実に共有するようにします。

于 2008-08-26T04:28:06.387 に答える
0

OK、イメージ自体が DataContext を適切に取得していますか?

これを追加してみてください:

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

コンパイルして実行する場合は、画像にカーソルを合わせて、正しい値が表示されるかどうかを確認してください。

于 2008-08-26T04:51:09.200 に答える