Pregunta

Así que estoy creando una aplicación que tendrá muchas ventanas, todas con el mismo diseño básico:

  1. Una ventana principal
  2. Un logotipo en la esquina superior
  3. Un bloque de título
  4. Un indicador de estado en la parte inferior
  5. Un área para controles específicos de ventanas.

En este momento tengo que recrear esta estructura en cada ventana. Idealmente, quiero que este diseño se codifique en un solo lugar, tal vez en una subclase de Windows personalizada para facilitar su uso. ¿Alguien tiene alguna pista sobre cómo comenzar, o experiencia previa con problemas similares?

¿Fue útil?

Solución

Puedes crear una nueva plantilla de Control que esté orientada a una ventana para lograr esto como se muestra a continuación.

<ControlTemplate x:Key="WindowControlTemplate1" TargetType="{x:Type Window}">
    <Border 
        Background="{TemplateBinding Background}" 
        BorderBrush="{TemplateBinding BorderBrush}" 
        BorderThickness="{TemplateBinding BorderThickness}"
        >
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="0.93*"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>

            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="0.21*"/>
                <ColumnDefinition Width="0.79*"/>
            </Grid.ColumnDefinitions>

            <ContentPresenter 
                Grid.ColumnSpan="2" 
                Grid.Row="1" 
                Content="{TemplateBinding Content}" 
                ContentTemplate="{TemplateBinding ContentTemplate}"
                />
            <ResizeGrip 
                HorizontalAlignment="Right" 
                x:Name="WindowResizeGrip" 
                VerticalAlignment="Bottom" 
                IsTabStop="False" 
                Visibility="Collapsed" 
                Grid.Column="1" 
                Grid.Row="2"
                />
            <TextBlock Text="My Logo" />
            <TextBlock Grid.Column="1" Text="My Title"/>
            <StatusBar Height="20" Grid.ColumnSpan="2" Grid.Row="2"/>
        </Grid>
    </Border>

    <ControlTemplate.Triggers>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="ResizeMode" Value="CanResizeWithGrip"/>
                <Condition Property="WindowState" Value="Normal"/>
            </MultiTrigger.Conditions>
            <Setter Property="Visibility" TargetName="WindowResizeGrip" Value="Visible"/>
        </MultiTrigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

Otros consejos

Si eres lo suficientemente valiente como para tomar un gran cambio arquitectónico, puedes considerar CompositeWPF (anteriormente con nombre de código Prisma ) de los patrones y amp; Practican chicos en Microsoft.

De interés para usted sería la posibilidad de definir " regiones " en un shell (es decir, ventana) y luego usando vistas para rellenar las regiones. Utiliza el patrón Model-View-Presenter para permitir el desarrollo independiente de " views " a partir del modelo, que puede reubicarse fácilmente a lo largo del tiempo, ya que el shell solo define regiones y no está acoplado directamente a lo que se coloca en él. Principalmente, esto ayuda a desacoplar el shell de las vistas y las vistas entre sí y facilita la prueba de unidad ... bla, bla bla.

Es un gran salto y es algo que te ralentizará para empezar, aunque tu situación es uno de los tipos de aplicaciones que CompositeWPF debe abordar.

Como parte de CompositeWPF, deberás tener en cuenta varios patrones que pueden confundir a los recién llegados, por ejemplo. El UnityContainer, la inversión de control, MVP (o Modelo / vista / modelo de vista) y la inyección de dependencia.

Puedo recordar cuando comencé con las aplicaciones de muestra desconcertadas porque no es obvio cómo en la tierra se crearon algunas de las vistas. El contenedor de la unidad creará una instancia de los objetos y llamará mágicamente a los constructores parametrizados.

CompositeWPF es una solución elegante para su pregunta, pero no simple ni directa. Habiendo usado CompositeWPF en mi último proyecto, pretendo usarlo de nuevo para la próxima aplicación apropiada.

El enfoque más simple es crear WPF en una " Página " para los controles específicos de la ventana y coloque un " Marco " En la ventana principal. Incluso puedes crear una buena navegación de esta manera.

¿por qué exactamente estás usando " muchas ventanas? " ¿Por qué no solo una ventana con un control de pestañas? ¿O una sola ventana con controles de usuario?

En cualquier caso, para responder a su pregunta, los controles de usuario son una forma en la que desea obtener la funcionalidad que describe como deficiente.

Cree una nueva clase de Windows y haga que tenga un " Childrens " propiedad que permite que un objeto se incruste en el panel de acoplamiento donde desea que " controles específicos de la ventana " para ir.

A medida que inicias nuevas ventanas, crea una instancia del tipo de ventana y un control de usuario con los controles específicos, agrega el control de usuario a la propiedad Children de tu ventana y luego muestra la ventana. Incluso puede atar los controladores de eventos, DataContexts y lo que no en este momento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top