2011-02-03 75 views
2

我想要一種動畫電影帶,其中只有一個字段在給定時刻可見。就像照相機中的電影膠片一樣 - 目前只有一個電影場放置在鏡頭下方,並準備進行照明。我試圖通過另一個網格來實現它。在下面的代碼中,「Film Strip」被稱爲pageContainer。在後面的代碼中,我做了一個改變pageContainer網格的Margin屬性的動畫。按照我的意願,pageContainer可以很好地滑動到左側或右側。例如:顯示頁面號碼。 2保證金設置爲(-270,0,0,0)而不是(0,0,0,0)。這將pageContainer移動到左側,只有第二個字段可見,而不是第一個。無法綁定保證金屬性?

但是當我開始調整整個UI,這種機制將停止工作,用戶可以看到兩頁(場),而不是僅在當前一個之間的邊界。如果我把斷點放到我的pageWidthConverter中,它總是在調整整個UI的時候點擊。如果我把另一個斷點放到pageMarginConverter中,它在調整大小的過程中不會被擊中。爲什麼?我想使Margin屬性依賴於BackgroundRectangle ActualWidth,就像我用Width屬性所做的那樣。但那不行。爲什麼寬度在調整窗口大小時動態設置,但邊距不是?

PS:不要使用保證金的人們可以使用TranslateTransform。我試過但沒有成功。

如果有人能幫助它會如此高度讚賞。

乾杯 漢斯

 ... <Grid Grid.Row="3" Grid.Column="1" Margin="0,-4,0,0" ClipToBounds="True"> 
       <Grid x:Name="pageContainer" 
         Width="{Binding Converter={StaticResource pageWidthConvertor}, ElementName=BackgroundRectangle, Path=ActualWidth}" 
         Margin="{Binding Converter={StaticResource pageMarginConvertor}, ElementName=BackgroundRectangle, Path=ActualWidth}" > 

        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="{Binding ElementName=BackgroundRectangle, Path=ActualWidth}"/> 
         <ColumnDefinition Width="40"/> 
         <ColumnDefinition Width="{Binding ElementName=BackgroundRectangle, Path=ActualWidth}"/> 
         <ColumnDefinition Width="40"/> 
         <ColumnDefinition Width="{Binding ElementName=BackgroundRectangle, Path=ActualWidth}"/> 
         <ColumnDefinition Width="40"/> 
         <ColumnDefinition Width="{Binding ElementName=BackgroundRectangle, Path=ActualWidth}"/> 
         <ColumnDefinition Width="40"/> 
        </Grid.ColumnDefinitions> ... 

回答

2

這聽起來像你需要你的保證金依賴於兩件事情(1)你的願望和偏移量(2)你的UI您ActualWidth的一定比例,以規模很好。你有沒有嘗試過使用MultiBinding?看看下面的文章:

http://www.codeproject.com/KB/WPF/WpfWinFormsBulletGraphs.aspx#layout

它使用了多結合擴展基於控件的大小一定的價值。這裏是多綁定:

class ScalingMultiConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, 
      object parameter, CultureInfo culture) 
    { 
     if (!ValuesPopulated(values)) 
      return 0.0; 

     double containerWidth = (double)values[2]; 
     double valueToScale = (double)values[1]; 
     double maximum = (double)values[0] ; 

     return valueToScale * containerWidth/maximum; 
    } 

    private bool ValuesPopulated(object[] values) 
    { 
     foreach (object value in values) 
     { 
      if (value==null || value.Equals(DependencyProperty.UnsetValue)) 
       return false; 
     } 
     return true; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, 
       object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

及其用法的例子:

<Rectangle.Width> 
    <MultiBinding Converter="{StaticResource ScalingMultiConverter}"> 
     <Binding Path="(c:BulletGraphWithLegend.GraphRange)"/> 
     <Binding Path="(c:BulletGraphWithLegend.FeaturedMeasure)"/> 
     <Binding Path="ActualWidth"/> 
    </MultiBinding> 
</Rectangle.Width> 

你應該能夠創建一個多綁定需要你想要的偏移和ActualWidth的,並將其轉換成一個保證金。

在另一方面,爲什麼不換你的網格中通過Canvas.Left屬性帆布和位置嗎?這樣您就不必在轉換器中構建厚度。

+0

嗨科林,作品像一個魅力;)非常感謝!你是對的,Canvas.Left是一個更好的方法。我切換到它,我創建了一個名爲CurrentFieldNumber的新自定義屬性,並使用了MultiBinding。解釋更多關於我的原始問題:我的動畫覆蓋了綁定! [解釋這裏](http://stackoverflow.com/questions/598139/oneway-binding-stops-working-after-the-target-manually-updated)所以現在我讓動畫運行在我的新的CurrentFieldNumber和一切都很好:)再次感謝你的整潔的例子!漢斯 – Hans 2011-02-05 23:11:13