Pergunta

Eu não sei quando devo usar ContentPresenter vez de ContentControl (e vice-versa). No momento, estou usando ContentControl praticamente o tempo todo nas minhas DataTemplates. Em que ContentPresenter ser uma escolha melhor? e por quê?

Foi útil?

Solução

ContentControl é uma classe de base para os controlos que contêm outros elementos e têm um Content-propriedade (por exemplo, Button).

ContentPresenter é usado dentro de modelos de controle para exibir o conteúdo.

ContentControl, quando usado diretamente (que é suposto ser usado como uma classe base), tem um modelo de controle que utiliza ContentPresenter para exibir seu conteúdo.

As minhas regras de ouro (não aplicável em todos os casos, usar o seu julgamento):

  1. Dentro uso ControlTemplate ContentPresenter
  2. Fora de ControlTemplate (incluindo DataTemplate e modelos externos) tente não usar qualquer um deles, se você precisar, você deve preferir ContentPresenter
  3. subclasse ContentControl se você estiver criando um controle personalizado "lookless" que o host de conteúdo e você não pode obter o mesmo resultado pela mudança de modelo de um controle existente (que deve ser extremamente raro).

Outras dicas

ContentPresenter é normalmente usado em um ControlTemplate, como um espaço reservado para dizer "colocar o conteúdo real aqui".

A ContentControl pode ser usado em qualquer lugar, não necessariamente em um modelo. Ele vai pegar qualquer DataTemplate definido para o tipo de conteúdo que lhe é atribuído

Eu escrevi recentemente um post no meu blog em relação a estes dois controles:

ContentPresenter vs ContentControl (EDIT:. ligação quebrada substituído por versão arquivada)

O ContentPresenter.ContentSource é o que realmente faz a maior diferença entre as duas classes. ContentSource propriedade só faz sentido dentro de um ControlTemplate; ele determina que a propriedade TemplatedParent o conteúdo deve ser mapeada com. Por exemplo, se um controle contém uma MyProperty1 propriedade de dependência, então podemos encontrar o seguinte dentro de sua ControlTemplate:

<ControlTemplate TargetType="MyControl" >
    [...]
       <ContentPresenter ContentSource="MyProperty1" />
    [...]
</ControlTemplate>

O conteúdo do ContentPresenter receberá o valor de MyProperty1.

Por favor, note que, se o nome da propriedade é Content, não há necessidade de especificar ContentSource como é o valor padrão.

Para aqueles que sabem AngularJS:. Isso é semelhante ao mecanism transclude

Às vezes, um exemplo é mais fácil do que o jargão teórico. Em um web site MS (Vá até o final: http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter (v = vs.110) .aspx ), ele usa um botão como um exemplo . Um botão tem um ContentControl, que permite que você coloque um controle ou um controle personalizado que pode ser uma imagem, texto, CheckBox, StackPanel, Grelha, qualquer que seja.

Após a personalização de Button, agora no XAML, você pode escrever

<my:Button>
   <my:Button.Content>
      <my:AnotherControl>
   </my:Button.Content>
</my:Button>

No código de exemplo acima, o "meu: Button.Content" é o ContentControl. O AnotherControl será lugar para o que você tinha especificado onde o ContentPresenter é.

Da mesma forma, quando se compara TextBox e TextBlock, TextBox tem um ContentPresenter para você coisas coisas nele apenas como o exemplo botão acima enquanto um TextBlock não. Um TextBlock só lhe permite inserir texto.

Seu uma questão antiga, mas eu estava terminando o desenvolvimento de uma telha de animação Control, modelo baseado em um aplicativo universal, olhar para este código a partir do WP7 telefone velho / 8 SDK:

<ContentControl x:Name="contentControl" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch" VerticalContentAlignment="Stretch">
    <ContentPresenter x:Name="contentPresenter" CacheMode="BitmapCache"/>
</ContentControl>

Aqui você pode ver o ContentControl é o Container eo Presenter para a exibição de conteúdo. Na maioria dos casos, o ControlTemplate será o recipiente, mas se você quer em sua ControlTemplate outro recipiente você pode colocar um recipiente extra: ContentControl nele e para apresentar o conteúdo de um ContentPresenter separado. Se você não precisa de um recipiente separado, em seguida, é só usar ControlTemplate e ControlPresenters para a exibição de blocos de conteúdo, pelo menos, isso é o que os caras da Microsoft fizeram quando desenvolveu o WP7 / 8 SDK. O ContentControl também pode ser utilizado para exibir o conteúdo mas, em seguida, que serve tanto como recipiente e apresentador. Assim, no código de exemplo acima seu propósito é dividida em Container e Presenter. Em amostras dinâmicas você poderia mostrar o recipiente (que pode ter um fundo ou algo vazias isso não existe ainda) e, em seguida, dinamicamente preenchê-lo com o conteúdo apresentador. Um recipiente tem dimensões (largura, altura, etc.), é colocar essas propriedades no controlo recipiente e conteúdo presente sobre a mesma. Na amostra do ContentControl determina o que tem que ser feito com o conteúdo apresentador.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top