2011-02-03 19 views
2

私は、ある時点でそのフィールドの1つだけが見えるアニメーションのフィルムストリップを用意しようとしています。カメラのフィルムストリップのように、現在1つのフィルムフィールドだけがレンズの下に置かれ、照明される準備ができています。私は別のグリッドを持つグリッドとしてそれを達成しようとします。下のコードでは、 "film strip"はpageContainerと呼ばれています。コードの背後で、私はpageContainerグリッドのMarginプロパティを変更しているアニメーションを行います。私が望むように、pageContainerは完全に動作します。左または右に滑っています。例:ページ番号を表示する。 2マージンは(0,0,0,0)の代わりに(-270,0,0,0)に設定されます。これにより、pageContainerが左に移動し、最初のフィールドの代わりに2番目のフィールドだけが表示されます。Marginプロパティをバインドできませんか?

しかし、UI全体のサイズ変更を開始すると、このメカニズムは機能しなくなり、ユーザーは現在のページだけでなく、2つのページ(フィールド)の境界線を確認することができます。ブレークポイントを私のpageWidthConverterに置くと、UI全体のサイズを変更するときに常にヒットします。私が別のブレークポイントをpageMarginConverterに置くと、サイズ変更中にヒットすることはありません。どうして? MarginプロパティをBackgroundRectangle ActualWidthに依存させたいのと同じように、Widthプロパティでそれを作っています。しかし、それは動作しません。ウィンドウのサイズを変更するときにWidthが動的に設定されるのはなぜですか?Marginは???

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

関連する問題