私はWPFが初めてです。WPFでマルチイメージの自動調整バックグラウンドを実装するにはどうすればよいですか?AndroidのNine Patchに似ていますか?
私は2つの「ペイン」、マスターペイン、詳細ペインに分割されたアプリを持っています。マスターペインは背が高く、幅が狭く、左揃えです。詳細ペインは幅が広く、アプリ領域の大部分を占め、右揃えになっています。
ここでの目標は、各ペインに対してサイズ変更可能なイメージの背景を実装することです。このコンセプトは、AndroidのNine Patch(see Nine Patch documentation)メカニズムに似ています。実際、このWPFアプリは、同じアプリのAndroid版で使用されているのとまったく同じソースPNGを使用します。ご覧のとおり、これはクロスプラットフォームのアプリです。両方のプラットフォーム間でビジネスオブジェクトとロジックを共有しますが、UI実装はアプリが異なるところです。
Nine Patchドキュメントを読むとき、はを無視します。ドキュメントではボタンでこの概念のみを説明しています。どのような種類のビューでも実装できます。私はすでに、アプリの背景など、iOSで動作するコンセプトを持っています。今はWPFとSilverlightにこの概念を移植するだけです。
各ペインのルートコンテナは、System.Windows.Controlsです。 グリッド。私が知ることから、これを処理する最良の方法は、グリッドを3×3の構造に分割し、WPFプロパティバインディングを使用してそれぞれの適切なグリッドセクションにNine Patchイメージの各部分を適用することです。 ImageBrush。しかし、私はWPFでグリッドを構築すること、またはそのためのバインディング機能に完全に慣れていません。そして、ウィンドウのサイズ変更はどのように処理されますか?
これに関するアドバイスをいただければ幸いです。ありがとう。
編集:この場合、私はXAMLの利便性がないと言及する必要があります。これはすべてプログラマチックに行う必要があります。
EDIT: loxxyのアドバイスの成果を披露し、次のステップの詳細についてお尋ねします。ここに私の実装の結果は(私は以下の多くの質問を持っている、ように読んでください)今のところです:
NinePatchImage npi = new NinePatchImage([some params]);
Grid backgroundGrid = new Grid();
backgroundGrid.ColumnDefinitions.Clear();
backgroundGrid.RowDefinitions.Clear();
backgroundGrid.ColumnDefinitions.Add(
// first column
new ColumnDefinition()
{
Width = new GridLength(1, GridUnitType.Auto),
});
backgroundGrid.ColumnDefinitions.Add(
// second column
new ColumnDefinition()
{
Width = new GridLength(1, GridUnitType.Star)
});
backgroundGrid.ColumnDefinitions.Add(
// third column
new ColumnDefinition()
{
Width = new GridLength(1, GridUnitType.Auto)
});
backgroundGrid.RowDefinitions.Add(
// first row
new RowDefinition()
{
Height = new GridLength(1, GridUnitType.Auto),
});
backgroundGrid.RowDefinitions.Add(
// second row
new RowDefinition()
{
Height = new GridLength(1, GridUnitType.Star)
});
backgroundGrid.RowDefinitions.Add(
// third row
new RowDefinition()
{
Height = new GridLength(1, GridUnitType.Auto)
});
var imageTopLeft = new Image() { Source = (npi.TopLeft != null) ? npi.TopLeft : null, Stretch = Stretch.None };
var imageTopCenter = new Image() { Source = (npi.TopCenter != null) ? npi.TopCenter : null, Stretch = Stretch.None };
var imageTopRight = new Image() { Source = (npi.TopRight != null) ? npi.TopRight : null, Stretch = Stretch.None };
var imageMiddleLeft = new Image() { Source = (npi.MiddleLeft != null) ? npi.MiddleLeft : null, Stretch = Stretch.None };
var imageMiddleCenter = new Image() { Source = (npi.MiddleCenter != null) ? npi.MiddleCenter : null, Stretch = Stretch.None };
var imageMiddleRight = new Image() { Source = (npi.MiddleRight != null) ? npi.MiddleRight : null, Stretch = Stretch.None };
var imageBottomLeft = new Image() { Source = (npi.BottomLeft != null) ? npi.BottomLeft : null, Stretch = Stretch.None };
var imageBottomCenter = new Image() { Source = (npi.BottomCenter != null) ? npi.BottomCenter : null, Stretch = Stretch.None };
var imageBottomRight = new Image() { Source = (npi.BottomRight != null) ? npi.BottomRight : null, Stretch = Stretch.None };
backgroundGrid.Children.Add(imageTopLeft); Grid.SetColumn(imageTopLeft, 0); Grid.SetRow(imageTopLeft, 0);
backgroundGrid.Children.Add(imageTopCenter); Grid.SetColumn(imageTopCenter, 1); Grid.SetRow(imageTopCenter, 0);
backgroundGrid.Children.Add(imageTopRight); Grid.SetColumn(imageTopRight, 2); Grid.SetRow(imageTopRight, 0);
backgroundGrid.Children.Add(imageMiddleLeft); Grid.SetColumn(imageMiddleLeft, 0); Grid.SetRow(imageMiddleLeft, 1);
backgroundGrid.Children.Add(imageMiddleCenter); Grid.SetColumn(imageMiddleCenter, 1); Grid.SetRow(imageMiddleCenter, 1);
backgroundGrid.Children.Add(imageMiddleRight); Grid.SetColumn(imageMiddleRight, 2); Grid.SetRow(imageMiddleRight, 1);
backgroundGrid.Children.Add(imageBottomLeft); Grid.SetColumn(imageBottomLeft, 0); Grid.SetRow(imageBottomLeft, 2);
backgroundGrid.Children.Add(imageBottomCenter); Grid.SetColumn(imageBottomCenter, 1); Grid.SetRow(imageBottomCenter, 2);
backgroundGrid.Children.Add(imageBottomRight); Grid.SetColumn(imageBottomRight, 2); Grid.SetRow(imageBottomRight, 2);
Grid contentArea = new Grid() { ColumnDefinitions = { new ColumnDefinition() } };
// setup contentArea here blah blah blah
// a containing grid
Grid container = new Grid();
// add the background grid to the containing grid
container.Children.Add(backgroundGrid);
// add the content grid to the background grid's UIElement collection
backgroundGrid.Children.Add(contentArea);
// set the backgroundGrid's column position
Grid.SetColumn(backgroundGrid, 0);
// set the backgroundGrid's row position
Grid.SetRow(backgroundGrid, 0);
// set the content area's column position
Grid.SetColumn(contentArea, 1);
// set the content area's row position
Grid.SetRow(contentArea, 1);
NOW、私は正しい方向に伸ばすか、タイル、トップとサイドの画像を取得する必要があります、xまたはy。 Image WPF要素にはいくつかのオプションがありますが、ストレッチはx方向とy方向の両方で発生しますが、これらの2つの次元のうちの1つだけにストレッチが必要です。また、必要に応じて(上の画像の場合のように)、私はxまたはyのいずれかでTILEすることができる必要があります。 image要素はこれをサポートしていませんが、ImageBrushクラスはこれらの種類のものに非常に役立つことがあります。 ImageBrushをImage要素、またはそのような他のタイプの要素に直接バインドできますか?
としてバインディングでコンバータを実装ところで、そのデータの全ては、ダミーデータである:) – NovaJoe
はちょうど私がこのすべて整理しまったことを言及したかったです。よく働く!!! – NovaJoe