Prism + Tabs = Dor
-
06-07-2019 - |
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
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.