Pergunta

Estou tendo dificuldades para tentar obter um trabalho cenário muito simples com PRISM 2.0 para WPF. Eu quero o principal workarea da minha candidatura para ser um TabControl. Cada vez que eu adicionar um ponto de vista, eu quero que ele apareça como um TabItem na TabControl.

Parece fácil né?

A minha região, que está nos meus olhares Shell.XAML assim:

<Controls:TabControl 
    Name="MainRegion" 
    cal:RegionManager.RegionName="{x:Static Infrastructure:RegionNames.TabRegion}"
    ItemContainerStyle="{StaticResource ShellTabItemStyle}" />

O estilo: ShellTabItemStyle esta aparência:

<Style x:Key="ShellTabItemStyle" TargetType="{x:Type TabItem}">
    <Setter Property="Header" Value="{Binding Content.DataContext.HeaderInfo, RelativeSource={RelativeSource Self}}" />
</Style>

Isto deve definir o Header do TabItem à propriedade HeaderInfo na DataContext da vista. (Eu tenho essa idéia de este artigo ) O DataContext da minha vista é um Presenter muito simples que tem uma propriedade HeaderInfo nele:

public string HeaderInfo = "The Header Text";

Meu ponto de vista é um simples usercontrol WPF e se parece com isto:

  <StackPanel>
    <TextBox Text="Hello World" Name="MyTextBox"></TextBox>
    <Image Source="..SomeImage.PNG" Name="MyImage"></Image>
  </StackPanel>

Até agora, tão bom. Se eu adicionar a vista para a região I obter um controle guia e eu recebo um guia com o conjunto de texto para "O texto do cabeçalho". Meu problema é que não há absolutamente nenhum conteúdo exibido na guia. Minha vista contém uma Image simples e um TextBox, mas nenhum deles aparecem na TabItem. Se eu sair Snoop e olhar ao redor, não há uma imagem à vista.

O que estou ausente aqui? - existe uma maneira mais fácil

Foi útil?

Solução

eu era incapaz de obter qualquer uma das respostas sugeridas ao trabalho. Extensa googling não quer ajudar. Eu dei o problema algum pensamento no fim de semana e mais eu pensava nisso, mais ela ocorreu-me que há um pouco de Código cheiro sobre esta abordagem. Você injetar uma vista em seu Tab Região ... alguma coisa mágica acontece e uma guia é adicionado ... você tem que adicionar alguma ligação a alguns XAML Styling armazenados em um algum lugar dinâmica arquivo imcomprehensible e isso pode ou não pode definir o seu texto do cabeçalho . Se qualquer um único elemento de este é apenas um pouco errado pouco você não vai obter um erro, mas ele simplesmente não vai funcionar.

Na minha opinião, este é tanto frágil (ou seja, muito fácil de quebrar) e bonita inpenetrable menos que você tenha um prisma compreensão profunda, o modelo, e de XAML. Felizmente, existe uma muito mais agradável e mais simples maneira de fazer isso:

Basta criar uma visualização chamada TabRegionView que contém apenas um TabControl em branco. Você provavelmente vai querer adicionar este à sua Shell.xaml. Criar um evento chamado InjectTabView , que tem uma carga de tipo UserControl e subscrever este evento em sua TabRegionView controle. Quando o evento em TabRegionView , você cria o TabItem manualmente e adicionar a vista para o TabItem assim:

public void TabAdded(UserControl view)
{
    var item = new TabItem();
    item.Content = view;
    item.IsSelected = true;
    item.Header = "Header Text";
    mainTab.Items.Add(item);
}

Quando você quiser mostrar uma exibição como uma nova guia, o código é algo como isto:

    var view = new View(params);
    _eventAggregator.GetEvent<InjectTabViewEvent>()
        .Publish(view);

Este vai ser pego pela TabRegionView e a vista vai ser adicionado como uma nova guia. Você poderia facilmente envolver o Ver no chicote de fios de algum tipo que contém o texto de cabeçalho, uma imagem e bool para indicar ou não o guia deve ser autoselected.

IMHO esta técnica tem a dupla vantagem de dar-lhe o controle direto do que está acontecendo e é muito mais fácil de seguir.

Eu estaria muito interessado em ter uma opinião sobre este de qualquer officianados prisma.

Outras dicas

Se você estiver usando RegionManager, você precisa ativar o seu ponto de vista. Não é provável que algum pedaço de código onde você está adicionando a visão para a região, que acabou também precisa dizer que a região para ativá-lo.

public void AddViewToRegion(IRegion region, object view)
{
     region.Add(view);
     region.Activate(view);
}

Parece bobagem, mas você obter o comportamento que você está vendo, se você não fizer isso. Achei isso um bocado frustrante, mas foi fácil o suficiente para correção. O comportamento é ainda mais estranho quando você adicionar várias abas se você não, pelo menos Ative a primeira vista você adicionar.

O meu entendimento é que se você não fizer isso, a visão nunca se torna parte da árvore visual (este é um efeito colateral do fato de que as desativa TabControl (remove da árvore visual) quando um isn guia' t "em frente". isso é bom para certas operações, mas faz coisas como esta ser um pouco instável.

Alguns pensamentos aleatórios:

  • tentar remover o estilo de TabControl
  • verificar árvore visual com a ajuda de Snoop ferramenta . Você deverá ver seu TabItem com UserControl de vista sob o TabControl. Em seguida, você pode verificar o que há de errado com isso UserControl e seus filhos (conteúdo do seu ponto de vista). Eles provavelmente estão escondidos por algum motivo.
  • outra coisa para pensar sobre - RegionAdapter. RegionAdapters são responsáveis ??pela adaptação vistas das regiões para UIControl host.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top