0

MVVMパターンを使用してSurfaceアプリを開発しています。さまざまなビューがあり、それらを1つの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のサイズを設定するカスタムコントロールを作成することでした。このための完全なコードは、ここに配置するのに非常に大きなものですが、開始するためにそのコアについて説明しようと思います。

したがって、(データバインディングを介して)スキャッタービューにコンテンツを追加するたびに、itemtemplateはScatterViewItemのコンテンツを「PopupWindow」(UserControlから派生)と呼ばれるコントロールに設定します。PopupWindowは、子要素で検索する( SizeInitialSizeRequest型の)添付プロパティを定義しました。イベントハンドラーでは、ビジュアルツリーを上向きに検索してScatterViewItemを見つけ、それに応じてサイズを設定します。Loaded

生成されたビジュアルツリーは次のようになります。

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;

うまくいけば、これで始められるはずです。さらに説明が必要な場合はコメントしてください。

于 2010-12-07T12:01:02.380 に答える