0

Windows8メトロアプリで8x8グリッドを表示したい。これをする:

  1. を作成しGrid、8つの行定義と8つの列定義を追加しました。
  2. Rectangle次に、各グリッドセルに黒い境界線 の付いたを追加します。
  3. 次に、MeasureOverrideメソッドで、をチェックしavailableSizeます。グリッドは正方形(アスペクト比= 1.0)である必要があるため、の最小値を計算し、にavailableSize.Width, availableSize.Height等しい新しいサイズを返し(minimum, minimum)ます。

ただし、これは機能しません。結果のグリッドのサイズはに等しく、メソッドavailableSizeから返すサイズではありません。MeasureOverrideを変更して、sをに、sをMeaureOverrideに設定すると、機能します。しかし、私はいくつかのビデオを見ました、そして彼らはあなたが何かのプロパティを明示的に設定するべきではないと言います。HeightRowDefinitionminimumWidthColumnDefinitionminimumHeightWidth

それで、私が望むことを達成するためのより良い方法はありますか?

4

2 に答える 2

0

1 つの解決策は、幅、高さを処理するカスタム グリッド コントロールを作成することです。

    public class SquareGrid : Grid
{
    public SquareGrid()
    {
        this.SizeChanged += OnSizeChanged;
        this.Loaded += OnLoaded;
    }

    private void OnSizeChanged(object sender, SizeChangedEventArgs e)
    {
        var parent = VisualTreeHelper.GetParent(this) as FrameworkElement;
        if (parent == null) return;

        ResizeToSquare(parent);
    }

    private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
    {
        var parent = VisualTreeHelper.GetParent(this) as FrameworkElement;
        if (parent == null) return;

        parent.SizeChanged += ParentOnSizeChanged;
    }

    private void ParentOnSizeChanged(object sender, SizeChangedEventArgs sizeChangedEventArgs)
    {
        FrameworkElement parent = sender as FrameworkElement;
        if (parent == null) return;

        ResizeToSquare(parent);
    }

    private void ResizeToSquare(FrameworkElement parent)
    {
        var min = Math.Min(parent.ActualHeight, parent.ActualWidth);

        this.Width = min;
        this.Height = min;
    }
}

このために、同じことを行う動作を構築することもできます。

于 2012-06-15T21:57:52.577 に答える