0

我使用 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>

但它不起作用。

4

1 回答 1

2

更新:我已在此处将此答案转换为代码项目文章:http: //www.codeproject.com/KB/WPF/ScatterViewSizing.aspx - 查看更多详细信息和完整示例代码


这是非常棘手的。不久前我遇到了这个问题并尝试了许多不同的方法 - 我什至实现了自己的 ScatterViewItem 来处理自动调整大小 - 但从未找到 100% 有效的解决方案。

我确实解决的解决方案,解决了我获得正确初始大小的主要问题是创建一个自定义控件,该控件使用附加属性在创建时设置其父 ScatterViewItem 的大小。完整的代码在这里放得很大,但我会尝试解释它的核心以帮助您入门。

因此,每当我将东西添加到我的 scatterview 中(通过数据绑定)时,我的 itemtemplate 会将 ScatterViewItem 的内容设置为我的名为“PopupWindow”的控件(它从 UserControl 派生)。InitialSizeRequestPopupWindow 定义了一个名为(类型为Size )的附加属性,它将在其子元素中查找。在其Loaded事件处理程序中,它将向上搜索可视化树以定位 ScatterViewItem,然后相应地设置其大小。

生成的可视化树如下所示:

ScatterView
  '- ScatterViewItem
      '- PopupWindow
          '- ActualContent (datatemplate)

在实际内容上,他们会像这样声明它们的大小:

<UserControl x:Class="...."
 ...
  localview:PopupWindow.InitialSizeRequest="450,400" />

为了从 PopupWindow 中获取实际内容,我使用了下面的代码(省略了错误检查)。这是在LoadedPopupWindow 事件中执行的:

// 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;

希望这可以帮助您入门。如果您需要进一步的解释,请发表评论。

于 2010-12-07T12:01:02.380 回答