私のページのほぼすべての要素が自動サイズ調整されているため、上記のソリューションに対する次の変更が役立ちました。スタックパネルのグリッドを含むページ:
public MainPage()
{
InitializeComponent();
}
private void FillGridWithItems()
{
//Row and ColumnDefinitions
for (int row = 0; row < 5; row++)
{
for (int col = 0; col < 7; col++)
{
var item = new MyStackPanel(children)
Grid.SetColumn(item, col);
Grid.SetRow(item, row);
grid.Children.Add(item);
}
}
Loaded+=PageLoaded;
}
/// When page is loaded, ActualHeight of elements are calculated for sure.
private void PageLoaded(object sender, RoutedEventArgs e)
{
foreach (var child in grid.Children)
{
var item = child as MyStackPanel;
if (item != null)
{
item.FillInData();
}
}
}
/// Used instead of constructor, cause a parameter is sent to this page.
protected override void OnNavigatedTo(NavigationEventArgs e)
{
FillGridWithItems()
}
MyStackPanel:
private readonly List<string> _items;
public MyStackPanel(List<string> items)
{
_items = items;
var behavior = new MyBehavior();
behavior.SetBinding(MyBehavior.ShowDetailsCommandProperty, new Binding
{
Path = new PropertyPath("ShowDetailsCommand")
});
Interaction.GetBehaviors(this).Add(behavior);
}
public void FillInData()
{
foreach (string item in _items)
{
var block = new Button();
block.Click += ItemClick;
this.Children.Add(block);
}
}
MyBehaviour (変更された部分のみ)
...
private void OnLayoutUpdated(object sender, object o)
{
var container = (Grid) AssociatedObject.Parent;
if (container == null) return;
var height = container.RowDefinitions[Grid.GetRow(AssociatedObject)].ActualHeight;
// ... The same as above
}
....
私はまだ ShowDetailsCommand を実装していないので、RelayCommand が意図したとおりに機能するかどうかはわかりませんが、なぜ機能しないのでしょうか ;) また、WinRtBehaviors ライブラリを使用するなど、Windows ストアに対していくつかの変更を行う必要があります。すべてグーグルで解決します。