2016-01-31 3 views
3

Я новичок в разработке приложений для Windows 10. Я пытаюсь встроить свой пользовательский UserControl на страницу в моем приложении. По какой-то причине содержимое полностью заменяется тем, что я помещаю внутри него на странице XAML. Чтобы дать лучшее объяснение, вот код:Как предотвратить переопределение содержимого UserControl?

AppView.xaml (контроль)

<UserControl 
    x:Class="Sirloin.AppView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:Sirloin" 
    xmlns:h="using:Sirloin.Helpers"> 

    <SplitView x:Name="splitView" DisplayMode="CompactOverlay"> 
     <SplitView.Pane> 
      <Grid> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="Auto"/> 
        <RowDefinition Height="Auto"/> 
        <RowDefinition Height="*"/> 
        <RowDefinition Height="Auto"/> 
       </Grid.RowDefinitions> 

       <!--The hamburger--> 
       <Button Click="OnHamburgerClicked" Grid.Row="0" Style="{StaticResource MenuButtonStyle}"> 
        <Button.DataContext> 
         <local:MenuItem Symbol="&#xE700;"/> 
        </Button.DataContext> 
       </Button> 

       <!--Buttons just below the hamburger--> 
       <ListView x:Name="topView" 
          Grid.Row="1" 
          ItemTemplate="{StaticResource ListViewItemTemplate}"/> 

       <!--Buttons toward the bottom of the menu--> 
       <ListView x:Name="bottomView" 
          Grid.Row="3" 
          ItemTemplate="{StaticResource ListViewItemTemplate}"/> 
      </Grid> 
     </SplitView.Pane> 

     <SplitView.Content> 
      <!--Where I'd like the content specified in MainPage to appear--> 
      <Frame x:Name="frame" Background="White"/> 
     </SplitView.Content> 
    </SplitView> 
</UserControl> 

MainPage.xaml

<Page 
    x:Class="Sirloin.Example.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:s="using:Sirloin" 
    xmlns:local="using:Sirloin.Example"> 

    <s:AppView> 
     <Grid Background="White"> 
      <TextBlock HorizontalAlignment="Center" 
         VerticalAlignment="Center" 
         Text="Hello, world!"/> 
     </Grid> 
    </s:AppView> 
</Page> 

Когда MainPage делает в конструкторе VS , это похоже на то, что содержимое моего пользовательского элемента управления полностью выпотрошено и заменено тем, что указано на главной странице. Чтобы дать вам идею, вот скриншот дизайнера:

enter image description here

Как вы можете видеть, нет меню или SplitView или что-то я положил в моем пользовательском элементе управления; единственное, что есть, это TextBlock, который я указал в XAML для MainPage.

В любом случае, почему это происходит и что я могу сделать, чтобы исправить это?


EDIT: Найдено решение, которое я искал here, но ответ Питера Duniho была принята, поскольку она обеспечивает лучшее объяснение того, что происходит.

ответ

3

UserControl является подклассом Control (что аналогично WPF ContentControl). Он может иметь только одного ребенка. Таким образом, вы явно переопределяете содержимое самостоятельно. Указав дочерний элемент для вашего AppView в XAML Page, вы устанавливаете содержимое элемента управления. Это имеет приоритет над любым контентом, указанным в собственном XAML UserControl.

К сожалению, не совсем понятно, что вы ожидали от этого. Возможно, вы хотите предоставить свойство для дополнительного контента, который класс AppView может использовать для добавления в свой контент. Или, может быть, вы должны позволить клиентскому коду предоставить DataTemplate и какой-то объект элемента данных (например, класс модели), который используется в ContentPresenter или аналогичен в XAML AppView.

Но все, что вы пытаетесь сделать, вы должны будете сделать это без использования, и отменяя текущее значение, неявное Content свойство UserControl в Page XAML.

+0

'UserControl' является подклассом' Control', а не 'ContentControl'. Однако у него есть 'Content' dp. –

+0

@JustinXL: да, спасибо. Я забыл, что Winrt API разделяет элементы управления содержимым, а элементы «Panel» отличаются от WPF. Тем не менее, применяется одна и та же основная проблема. –

+0

@Peter Duniho: Я думаю, что Джеймс означает, что пользовательский контроль - это MainPage. Я думаю, он рассчитывает увидеть, что элемент управления Splitview окружает MainPage, когда он открывает дизайнера для MainPage.xaml. – Abdousamad

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