2017-01-31 11 views
1

Я новичок в wpf и mvvm, поэтому я попросил некоторую помощь. И извините, но английский не мой родной язык. У меня есть основное приложение для отображения некоторых документов. Каждый документ представляет собой внешний dll + xml-файл с данными.Wrappanel внутри ScrollViewer в двух разных библиотеках

В главном приложении у меня есть код XAML:

<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Background="DarkGray"> 
    <Border Margin="20" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="White" Padding="20"> 
    <ContentControl x:Name="ccCurrentView" cal:View.Model="{Binding Path=CurrentView}"/>     
    </Border> 
</ScrollViewer> 

В ContentControl я отобразить представление моего документа, как UserControl из библиотеки DLL. И мы используем MVVM, так XAML документа является что-то подобное:

<UserControl> 
    <StackPanel> 
    <UserControl_Type1 /> 
    <UserControl_Type2 />... 
    </StackPanel> 
    <UserControl_Type3 /> 
</UserControl> 

Любой из этих UserControl_TypeXXX может быть внутри его собственной DLL.

Теперь пользователи просят меня заменить StackPanel WrapPanel для некоторого типа UserControl. И, когда пользователь изменяет размер основного приложения, некоторые элементы управления сначала обертывают свои элементы и только затем показывают полосы прокрутки для всего документа. Но в соответствии с информацией, которую я читал, WrapPanel не обертывается внутри ScrollViewer.

Как я могу достичь этого поведения, если у меня нет ширины и высоты от основного приложения и не могу предсказать, какой UserControl внутри моего документа должен обернуть их элементы?

ответ

0

Я нашел это article about xaml anti-patterns, и это мне очень помогает.
В моем случае я переключаюсь между двумя шаблонами контента. Один с ScrollViewer для старых документов, другой - без.
В Ресурсы:

 <DataTemplate x:Key="ResizableContent" > 
      <Border HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="DarkGray"> 
       <Border Margin="20" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="White" Padding="20"> 
        <ContentControl x:Name="ccCurrentView" cal:View.Model="{Binding Path=CurrentView}"/> 
       </Border> 
      </Border> 
     </DataTemplate> 
     <DataTemplate x:Key="NotResizableContent" > 
      <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Background="DarkGray"> 
       <Border Margin="20" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="White" Padding="20"> 
        <ContentControl x:Name="ccCurrentView" cal:View.Model="{Binding Path=CurrentView}"/> 
       </Border> 
      </ScrollViewer> 
     </DataTemplate> 

В MainPanel:

<ContentControl Content="{Binding}"> 
     <ContentControl.Style> 
      <Style TargetType="{x:Type ContentControl}"> 
       <Setter Property="ContentTemplate" Value="{StaticResource NotResizableContent}" /> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Path=IsResizable}" Value="True"> 
         <Setter Property="ContentTemplate" Value="{StaticResource ResizableContent}" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ContentControl.Style> 
    </ContentControl>