ScatterViewItem自定义大小

时间:2010-09-26 21:21:38

标签: pixelsense scatterview

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

但它不起作用。

1 个答案:

答案 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;

希望这会让你开始。如果您需要进一步解释,请发表评论。