2008-08-26 54 views
1

任何人都知道是否可以綁定Silverlight 2 Beta 2中的渲染轉換的ScaleX和ScaleY?在WPF中綁定轉換是可能的 - 但是在通過XAML設置Silverlight中的綁定時發生錯誤。也許有可能通過代碼來完成它?Databind RenderTransform 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,而不是找到它。有很多與Silverlight xaml和數據綁定不同的WPF ...

無論如何,要解決這個問題,您需要在代碼**中設置綁定,或手動偵聽您的數據對象的PropertyChanged事件並設置代碼後面的比例。

我會選擇後者,如果你想做一個動畫/故事板的規模變化。

**我需要檢查,但您可能無法綁定到它。我記得如果RenderTransform不是動畫的一部分,它會變成一個矩陣變換,所有的投注都關閉。

1

是運行時錯誤還是編譯時間,Jonas?縱觀documentation,將scaleX和scaleY依賴屬性,所以你應該能夠編寫

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

...其中Foo和Bar是合適的類型。

編輯:當然,這是WPF文檔。我想可能他們已經將ScaleX和ScaleY改爲標準屬性,而不是Silverlight中的依賴項屬性。我很想聽到更多關於您所看到的錯誤的信息。

0

啊我想我看到你的問題。您試圖將Visibility(SelectedDive.Visibility)類型的屬性綁定到Double(ScaleTransform.ScaleX)類型的屬性。 WPF/Silverlight無法在這兩種類型之間進行轉換。

你想完成什麼?也許我可以幫助你使用XAML。什麼是「SelectedDive」,當其可見性發生變化時,您希望發生什麼?

0

對不起 - 正在尋找答案,因此我沒有意識到你已經編輯了更多信息的問題。

好吧,所以可見性是Double類型的,所以綁定應該在這方面起作用。

作爲一種解決方法,您是否可以嘗試將ScaleX和ScaleY值直接綁定到SelectedDive.Visibility綁定的滑塊控件?就像:

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

如果這樣的話,那麼它至少會讓你去。

編輯:啊,我只記得我曾經讀過Silverlight不支持綁定中的ElementName語法,所以這可能無法正常工作。

0

是的,也許嵌入的渲染變換沒有從它們應用的對象繼承DataContext。你能強制DataContext進入他們嗎?例如,給變換名稱:

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

...,然後在後臺代碼:

myScaler.DataContext = fishImage.DataContext; 

...使定標器絕對贊同其與圖像的DataContext。

+0

我不認爲你可以給變換標籤名稱 – Neo42 2009-07-17 11:45:55

0

好吧,圖像本身是否正確拾取DataContext?

嘗試添加此:

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

如果編譯和運行,將鼠標懸停在圖片,看看它是否顯示正確的價值。

0

我曾希望通過XAML來解決這個問題,但事實證明,Brian的建議是最好的選擇。我使用馬特的建議來給規模變換一個名字,以便我可以從代碼訪問它。然後,我鉤住滑塊的值更改事件,並手動更新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; 
    }