2010-09-26 2 views
0

Я разрабатываю поверхностное приложение с использованием шаблона MVVM. У меня разные представления, и я хочу поместить их в один ScatterView. Я хочу, чтобы мой размер ScatterViewItem соответствовал размеру моих просмотров?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> 

Но это не работает.

ответ

2

Обновление: Я превратил этот ответ в коде проект статьи здесь: http://www.codeproject.com/KB/WPF/ScatterViewSizing.aspx - проверить, что для большего количества деталей и полного образец кода


Это очень сложно получить права. Некоторое время назад у меня была эта проблема и я попробовал много разных подходов - я даже реализовал собственный ScatterViewItem для обработки автоматической калибровки - но так и не нашел 100% рабочего решения.

Решение, на которое я действительно согласился, решил, что моя основная проблема получения начального размера была правильной, заключалась в создании настраиваемого элемента управления, который использовал прикрепленные свойства, чтобы установить размер его родительского ScatterViewItem при его создании. Полный код для этого - путь к большому, чтобы разместить здесь, но я попытаюсь объяснить суть этого, чтобы вы начали.

Итак, всякий раз, когда я добавлял материал в свой ракурс (через привязку данных), мой элемент itemtemplate установил содержимое ScatterViewItem моему элементу под названием «PopupWindow» (который был получен из UserControl). PopupWindow определил прикрепленное свойство InitialSizeRequest (типа Size), которое оно будет искать в своем дочернем элементе. В своем обработчике событий Loaded он будет искать визуальное дерево вверх, чтобы найти ScatterViewItem, а затем установить его размер соответствующим образом.

Сформированный визуальное дерево будет выглядеть следующим образом:

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

На фактическое содержание, они заявляют, их размер примерно так:

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

Чтобы разжиться фактическое содержание от PopupWindow , Я использовал код ниже (ошибка проверки опущена). Это выполняется в Loaded случае PopupWindow:

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

Надеюсь, это должно вам начать работу. Прошу прокомментировать, если вам нужны дополнительные объяснения.

Смежные вопросы