2

次のGridようなセグメントを保持する があります。

--
  ---
      -----------
                 ---
                    -------------------

各セグメントの視覚的な長さは全長に依存し、その位置は前のセグメントの終わりに依存します。

MultiBindingこれを達成するには、 Width of 3 を計算しますColumnDefinition

最初は、各アイテムが正しく配置されるように全体を計算しようと考えColumnDefinitionsましたが、実際には、コンパイラは Grid.ColumnDefinitions をバインドすることを許可しません。つまり、これを行うことはできません。

<Grid.ColumnDefinitions>
     <MultiBinding Converter="{StaticResource yourConverter}">
            <Binding Path=firstValueForCalculus />
            <Binding Path=secondValueForCalculus />
            ...   
     </MultiBinding>
</Grid.ColumnDefinitions>

だから今、私の唯一の選択肢は 3 を作りIMultiValueConverters、3つをそれぞれのコンバーターにバインドColumnDefinition.Widthし、すべてを計算することだと思っています...しかし、それは非常に厄介に聞こえます。 -ダウン」アラームが鳴りました。

これをエレガントに行うアイデアはありますか?

ありがとう!

編集: Yurek のコードを少し修正しました: (それはあなたが意図したものですか? または私はそれを破壊しましたか? :p)

public class GridHelper
    {
        public static readonly DependencyProperty ColumnDefinitionsProperty =
            DependencyProperty.RegisterAttached("ColumnDefinitions", typeof(ColumnDefinitionCollection), typeof(GridHelper),
            new FrameworkPropertyMetadata(null, new PropertyChangedCallback(
            (sender, e) => 
            {
                var element = sender as Grid;
                if (element != null)
                {
                    element.ColumnDefinitions.Clear();
                    foreach (ColumnDefinition col in (IEnumerable<ColumnDefinition>)e.NewValue)
                    {
                        element.ColumnDefinitions.Add(col);
                    }
                    //element.ColumnDefinitions.AddRange((IEnumerable<ColumnDefinition>)e.NewValue);
                }
            })));


        public static IEnumerable<ColumnDefinition> GetColumnDefinitions(Grid element)
        {
            return (IEnumerable<ColumnDefinition>)element.GetValue(ColumnDefinitionsProperty);
        }

        public static void SetColumnDefinitions(Grid element, IEnumerable<ColumnDefinition> columnDefinitions)
        {
            element.SetValue(ColumnDefinitionsProperty, columnDefinitions);
        }
    }
4

2 に答える 2

4

読み取り専用であるため、バインディングを使用して ColumnDefinitions を設定することはできません。しかし、洗練された解決策があります-添付された依存関係プロパティを使用することです。

public class GridHelper
    {
        public static readonly DependencyProperty ColumnDefinitionsProperty =
            DependencyProperty.RegisterAttached("ColumnDefinitions", typeof(ColumnDefinitionCollection), typeof(GridHelper),
            new FrameworkPropertyMetadata(null,
            (sender, e) =>
            {
                var element = sender as Grid;
                if(element != null)
                {
                     element.ColumnDefinitions.Clear();
                     element.ColumnDefinitions.AddRange((IEnumerable<ColumnDefinition>)e.NewValue);
                }
            }));

        public static IEnumerable<ColumnDefinition> GetColumnDefinitions(Grid element)
        {
            return (IEnumerable<ColumnDefinition>)element.GetValue(ColumnDefinitionsProperty);
        }

        public static void SetColumnDefinitions(Grid element, IEnumerable<ColumnDefinition> columnDefinitions)
        {
            element.SetValue(ColumnDefinitionsProperty, columnDefinitions);
        }
    }

列定義の作成にバインディングを使用できるようになりました。

<Grid>
     <local:GridHelper.ColumnDefinitions>
        <MultiBinding Converter="{StaticResource yourConverter}">
            <Binding Path=firstValueForCalculus />
            <Binding Path=secondValueForCalculus />
            ...   
        </MultiBinding>
     </local:GridHelper.ColumnDefinitions>
</Grid>
于 2011-08-08T15:05:03.920 に答える
0

私の理解が正しければ、音声ファイルはいくつかの部分に分割できるため、配列.

それぞれがオーディオ部分の幅関数を持つ ColumnDefinition のコレクションを作成します。次に、コレクションを Grid の ColumnDefinitions プロパティに割り当てることができます。

編集: Grid プロパティが読み取り専用であることを忘れていました。そのため、アイテムのランタイムを追加/削除できます。

于 2011-08-08T15:05:53.367 に答える