Pergunta

Um UserControl normal se parece com isso em xaml:

<UserControl x:Class="mynamespace.foo" ...namespaces...>
<!-- content -->
</UserControl>

Eu gostaria de poder definir meu próprio objeto de nível superior, na linha de:

<MyControl x:Class="mynamespace.mycontrol" ...namespaces...>
<!-- content -->
</UserControl>

Onde o MyControl deriva do próprio UserControl.

É claro que o compilador reclama de "mycontrol" não ser encontrado. Existe uma maneira de contornar isso?

Foi útil?

Solução

A etiqueta raiz é a classe base. É por isso que a raiz da janela padrão1 é a janela. Usando a opção de menu Adicionar> UserContol ... na verdade, está criando uma subclasse para o UserContol.

Se você tiver alguns elementos comuns e deseja uma classe base de controle, pode usar a classe base como a tag root. Você não pode derivar sua classe de qualquer classe que tenha uma árvore visual definida pelo XAML, mas sua classe base pode derivar do UserConrtol.

Primeiro defina sua classe base:

public class MyControlBase : UserControl
{
    // ...
}

Em seguida, crie sua aula infantil específica:

(Você pode começar com o UserControl1 criado automaticamente e alterá -lo a partir daí)

public partial class MyControl1 : MyControlBase
{
    public MyControl1()
    {
        InitializeComponent();
    }
}

Em seguida, altere o lado XAML para ficar assim:

<MyNamespace:MyControlBase
    x:Class="MyNamespace.MyControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:MyNamespace="clr-namespace:MyNamespace">

Essa é uma ótima maneira de fazer controles personalizados derivados de outros que o UserControl. Normalmente, é recomendável usar apenas o UserConrtols básico, se puder, e faça um controle personalizado somente se for necessário.

boa sorte,

Outras dicas

Defina seu espaço para nome no XAML e use seu nome de controle como a tag:

<Window ...
    xmlns:my="..." />

    <my:mycontrol ... />

</Window>

Não. O XAML está declarando o que é um MyControl visualmente, assim como o código-behind está definindo o que é um MyControl comportamentalmente. Definir o visual de um MyControl em termos de um MyControl não faria sentido: é o equivalente a, no código-behind, derivar mycontrol do MyControl, que você obviamente não faria.

Além disso, o WPF não permite derivar uma aula de UserControl de outro, por exemplo, se o Bobscontrol for um UserControl, então você não pode escrever <local:BobsControl x:Class="MyNamespace.MyControl... /> qualquer. Acredito que isso ocorre porque o UserControls tem uma aparência visual (conteúdo) assada em seu XAML e o conteúdo da classe derivada teria que substituir o conteúdo da classe base, para que a herança visual geralmente não seja útil.

No entanto, você posso Faça isso se o elemento de nível superior que você derivar for um personalizadas ao controle. Os controles personalizados são sem aparência (não definidos no XAML). Então você posso Crie seu próprio elemento de nível superior como um controle personalizado e, em seguida, derivam os controles do "usuário" disso. (Se você seguir essa rota, provavelmente desejará derivar seu controle personalizado do ContentControl ou aplicar conteúdoPropertyAttribute, para que seu elemento de nível superior possa conter facilmente outro XAML.)

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