Pregunta

Tengo dificultades para tratar de obtener un escenario muy simple que funcione con PRISM 2.0 para WPF. Quiero que el área de trabajo principal de mi aplicación sea un TabControl . Cada vez que agrego una vista, quiero que aparezca como un TabItem en el TabControl .

Suena fácil ¿verdad?

Mi región, que está en mi Shell.XAML tiene este aspecto:

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

El estilo: ShellTabItemStyle tiene este aspecto:

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

Esto debería establecer el Header del TabItem en la propiedad HeaderInfo en el DataContext de la vista. (Tengo esta idea de este artículo ) El DataContext de mi vista es un Presenter muy simple que tiene una propiedad de HeaderInfo :

public string HeaderInfo = "The Header Text";

Mi vista es un simple control de usuario de WPF y se ve así:

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

Hasta ahora, todo bien. Si agrego la vista a la región, obtengo un control de pestañas y obtengo una pestaña con el texto establecido en " El texto del encabezado " Mi problema es que no hay absolutamente ningún contenido que aparezca en la pestaña. Mi vista contiene un simple Imagen y un TextBox , pero ninguno de ellos aparece en el TabItem . Si saco Snoop y miro alrededor, no hay una imagen a la vista.

¿Qué me estoy perdiendo aquí? ¿Hay alguna forma más fácil?

¿Fue útil?

Solución

No pude obtener ninguna de las respuestas sugeridas para funcionar. El googlear extenso tampoco ayudó. Pensé en el problema durante el fin de semana y más lo pensé, cuanto más se me ocurrió que hay un poco de olor a código sobre este enfoque. Inyecta una vista en su Región de pestaña ... suceden algunas cosas mágicas y se agrega una pestaña ... tiene que agregar un enlace dinámico incomprensible a algún estilo XAML almacenado en un archivo en algún lugar y esto puede o no establecer su texto de encabezado . Si un solo elemento de esto es un poco incorrecto, no obtendrá un error, pero simplemente no funcionará.

En mi opinión, esto es a la vez frágil (es decir, muy fácil de romper) y bastante intratable a menos que tenga una comprensión profunda de PRISM, el modelo y de XAML. Afortunadamente, hay una manera mucho más fácil y sencilla de hacer esto:

Simplemente cree una vista llamada TabRegionView que contiene solo un TabControl en blanco. Probablemente quieras agregar esto a tu Shell.xaml. Cree un evento llamado InjectTabView que tenga una Carga útil del tipo UserControl y suscríbase a este evento en su control de TabRegionView . Cuando el evento se activa en TabRegionView , crea el elemento de tabla de forma manual y agrega la vista al elemento de tabla de esta forma:

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

Cuando desea mostrar una vista como una nueva pestaña, su código tiene un aspecto similar al siguiente:

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

TabRegionView lo recogerá y la vista se agregará como una nueva pestaña. Podrías envolver fácilmente la vista en un arnés de algún tipo que contenga texto de encabezado, una imagen y un bool para indicar si la pestaña debe ser seleccionada automáticamente o no.

En mi humilde opinión, esta técnica tiene la doble ventaja de darle control directo de lo que está pasando Y es mucho más fácil de seguir.

Estaría muy interesado en obtener una opinión sobre esto de cualquier oficial de PRISM.

Otros consejos

Si está utilizando RegionManager, necesita activar su vista. Es probable que haya un fragmento de código en el que está agregando la vista a la región, pero además necesita decirle a esa región que la active.

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

Parece una tontería, pero obtienes el comportamiento que estás viendo si no lo haces. Encontré esto un poco frustrante, pero fue bastante fácil de arreglar. El comportamiento es aún más extraño cuando agrega varias pestañas si al menos no activa la primera vista que agrega.

Tengo entendido que si no haces esto, la vista nunca se convierte en parte del árbol visual (esto es un efecto secundario del hecho de que el Control de pestañas se desactiva (se elimina del árbol visual) cuando no hay una pestaña). t " en frente " ;. Esto es bueno para ciertas operaciones, pero hace que este tipo de cosas sean un poco torpes.

Algunos pensamientos aleatorios:

  • intenta eliminar el estilo de TabControl
  • compruebe el árbol visual con la ayuda de la herramienta Snoop . Debería ver su TabItem con el UserControl de la vista bajo el TabControl. A continuación, puede comprobar qué es lo que está mal con UserControl y sus hijos (el contenido de su vista). Probablemente están ocultos por alguna razón.
  • otra cosa en que pensar - RegionAdapter. Los adaptadores de región son responsables de adaptar las vistas de las regiones al host UIControl.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top