我使用MVVM模式开发表面应用程序。 我有不同的视图,我想将它们放入一个ScatterView。 我希望我的ScatterViewItem大小对应于我的视图的大小?
代码示例:
<DataTemplate DataType="{x:Type vm:PointListViewModel}">
<Grid>
<v:PointListView>
</v:PointListView>
</Grid>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:BluetoothDevicesViewModel}">
<Grid>
<v:BluetoothDevicesView></v:BluetoothDevicesView>
</Grid>
</DataTemplate>
...
<s:ScatterView Grid.RowSpan="3"
DataContext="{Binding Path=Workspaces}"
ItemsSource="{Binding}"
ItemTemplate="{Binding}"
ClipToBounds="True" AllowDrop="True">
</s:ScatterView>
... 此代码工作正常但我的所有视图都具有相同的大小。 我尝试使用以下样式配置ScatterViewItem:
<Style BasedOn="{StaticResource {x:Type s:ScatterViewItem}}"
TargetType="{x:Type s:ScatterViewItem}">
<Setter Property="Height" Value="Auto" />
<Setter Property="Width" Value="Auto" />
</Style>
但它不起作用。
答案 0 :(得分:2)
更新:我已将此答案转换为代码项目文章:http://www.codeproject.com/KB/WPF/ScatterViewSizing.aspx - 请查看更多详情和完整示例代码
这是非常棘手的。我不久前遇到过这个问题并尝试了许多不同的方法 - 我甚至实现了自己的ScatterViewItem来处理自动调整大小 - 但从未找到100%可行的解决方案。
我解决的解决方案,解决了我的初始大小正确的主要问题是创建一个自定义控件,该控件使用附加属性在创建时设置其父ScatterViewItem的大小。完整的代码是放在这里的大方法,但我会尝试解释它的核心,以帮助你开始。
所以每当我在scatterview中添加东西时(通过数据绑定),我的itemtemplate会将ScatterViewItem的内容设置为我的控件“PopupWindow”(派生自UserControl)。 PopupWindow定义了一个名为InitialSizeRequest
(类型为Size)的附加属性,它将在其子元素中查找。在其Loaded
事件处理程序中,它将向上搜索可视树以找到ScatterViewItem,然后相应地设置其大小。
生成的可视化树看起来像这样:
ScatterView
'- ScatterViewItem
'- PopupWindow
'- ActualContent (datatemplate)
在实际内容上,他们会声明他们的大小:
<UserControl x:Class="...."
...
localview:PopupWindow.InitialSizeRequest="450,400" />
为了掌握PopupWindow中的实际内容,我使用了下面的代码(省略了错误检查)。这是在PopupWindow的Loaded
事件中执行的:
// GuiHelpers is a helper class I built to find elements in the visual tree
// c_contentHolder is a ContentControl which will hold the actual content
var presenter = GuiHelpers.GetChildObject<ContentPresenter>(c_contentHolder);
// It seems it's safe to assume the ContentPresenter will always only have one
// child and that child is the visual representation of the actual content.
var child = VisualTreeHelper.GetChild(presenter, 0);
Size requestedSize = PopupWindow.GetInitialSizeRequest(child);
// Now use requestedSize to set the size of the parent ScatterViewItem
var svi = GuiHelpers.GetParentObject<ScatterViewItem>(this, false);
svi.Width = requestedSize.Width;
svi.Height = requestedSize.Height;
希望这会让你开始。如果您需要进一步解释,请发表评论。