2016-01-21 8 views
1

Как и в моем последнем вопросе, я собираюсь заново создать расширитель + это кнопка переключения.WPF ContentPresenter переопределяет элементы управления на том же уровне

Expander Шаблон:

<ControlTemplate TargetType="Expander"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="15"/> 
     </Grid.RowDefinitions> 
     <ContentPresenter x:Name="ContentPresenter" Grid.Row="0"/> 
     <ToggleButton Grid.Row="1" > 
      .... 
     </ToggleButton> 
    </Grid> 

Теперь, когда я использую этот пользовательского элемента управления в моем главном представлении и добавить элемент управления (например, Button):

<custom:FullWidthExpander Width="200" HeaderBackground="Gray"> 
    <Button /> 
</custom:FullWidthExpander> 

ToggleButton (который определен в моем Expander Template выше) получает эту кнопку от переопределения.

+0

Вы уверены, что переопределены и не просто скрыты кнопкой? вы можете использовать [Snoop] (https://snoopwpf.codeplex.com/), чтобы посмотреть, как выглядит ваш элемент управления при загрузке и запуске. – KinSlayerUY

+0

yep, когда вы просматриваете мое приложение, все, кроме ContentPresenter, отсутствует:/ – C4p741nZ

+0

Если вы поместили размер своей кнопки, все равно это произойдет? Кнопка принимает все доступные размеры, поэтому Auto будет вам размером Expander, возможно, – nkoniishvt

ответ

1

Вы связывании UserControl.Content к Expander.Content собственности?

<!-- define a custom Template for the UserControl FullWidthExpander --> 
<UserControl.Template> 
    <ControlTemplate TargetType="UserControl"> 
     <!-- be sure to include the Content binding to pass the UC.Content to Expander --> 
     <Expander Content="{TemplateBinding Content}"> 
      <!-- create a custom Template for this Expander --> 
      <Expander.Template> 
       <ControlTemplate TargetType="Expander"> 
        <Grid> 
         <Grid.RowDefinitions> 
          <RowDefinition x:Name="ContentRow" Height="*"/> 
          <RowDefinition Height="20"/> 
         </Grid.RowDefinitions> 
         <ContentPresenter Grid.Row="0" Content="{TemplateBinding Content}"/> 
         <ToggleButton Grid.Row="1" Content="Test Toggle Button" /> 
        </Grid> 
       </ControlTemplate> 
      </Expander.Template> 
     </Expander> 
    </ControlTemplate> 
</UserControl.Template> 

Я сделал быстрый тест, и это прекрасно работает при использовании управления, как это:

<local:FullWidthExpander> 
    <Button Content="Test Content Button"/> 
</local:FullWidthExpander> 

enter image description here

Я также посмотрел на your other question, и если у вас есть ControlTemplate.Triggers здесь вы также захотите установить Expander.IsExpanded на номер True, чтобы просмотреть ваш контент. Ваш триггер скрывает верхнюю строку содержимого, если IsExpanded=False, что является значением по умолчанию для Expander.

+0

Спасибо за ваш ответ :) - Если я правильно понял, это решение «просто грязная работа». Чтобы уточнить, я просто хотел сделать многоразового Expander с «новым внешним видом». Вы можете сказать мне, что было бы лучшим решением? (Я не хочу оскорблять вас, говоря, что это обход, но насколько я понял, пользовательский контроль не лучший для моей цели) – C4p741nZ

+0

@ Chill-X В вашем случае, да, возможно, лучше всего просто используйте специальный шаблон для своего Expander, а не весь новый UserControl, однако основная проблема будет одинаковой. Его хорошо знать причину и решение, чтобы вы не сталкивались с такими проблемами в будущем :) – Rachel

1

Когда вы это делаете, это означает, что все содержимое пользовательского элемента управления заменяется содержимым, которое вы предоставили.

<custom:FullWidthExpander Width="200" HeaderBackground="Gray"> 
    <Button /> 
</custom:FullWidthExpander> 

Чтобы обойти эту проблему нужно размещать содержимое немного по-другому в вашем UserControl

Первый добавить свойство зависимостей для пользовательского элемента управления

public object UserControlContent 
    { 
     get { return (object)GetValue(UserControlContentProperty); } 
     set { SetValue(UserControlContentProperty, value); } 
    } 

    public static readonly DependencyProperty UserControlContentProperty = 
     DependencyProperty.Register("UserControlContent", typeof(object), typeof(FullWidthExpander), 
      new PropertyMetadata(null)); 

Затем связать это с ContentPresenter в xaml usercontrol также определяет имя для вашего пользовательского контроля, например x: Name = «Root».

<Expander Header="My expander header"> 
    <Expander.Template> 
     <ControlTemplate> 
      <Grid> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="Auto"/> 
        <RowDefinition Height="15"/> 
       </Grid.RowDefinitions> 

       <ContentPresenter x:Name="ContentPresenter" Grid.Row="0" Content="{Binding UserControlContent, ElementName=Root}" /> 

       <ToggleButton Grid.Row="1" Content="Togglebutton"> 

       </ToggleButton> 
      </Grid> 
     </ControlTemplate> 
    </Expander.Template> 
</Expander> 

И, наконец, вы определяете содержание контента в maindwindow XAML как таковой

<custom:FullWidthExpander> 
    <custom:FullWidthExpander.UserControlContent> 
     <Button Content="Click me"/> 
    </custom:FullWidthExpander.UserControlContent> 
</custom:FullWidthExpander> 
+0

Спасибо за ваш ответ - но я понимаю, что ContentPresenter является своего рода «заполнителем» для контента, который я предоставляю? – C4p741nZ

+0

Для шаблонов да, элемент управления пользователя нет. –

+0

@JanneMatikainen он никогда ничего не говорил о UserControl – nkoniishvt

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

  • Нет связанных вопросов^_^