¿Quieres Adorners con clipping?

Pues sí, chavalote, cuando coges la capa de Adorners, seguramente estás cogiendo la capa POR DEFECTO, que suele ser única en una ventana y está por encima del resto de los elementos.

image

AdornerLayer, ahí lo ves.

Pues el temita es que si poner un adorner ahí, y lo más seguro es que así sea, se pondrá, como es de esperar, por encima de todos los elementos. ¡Claro, tío! si la capa de adorno está por encima, lo que le metas también! Pura lógica, hermoso.

image

¿Ves que la selección se superpone no solamente por la cuadrícula, sino por el resto de la ventana? ¡Pues esto es un poco heavy! Debería recortarse. ¿Estamos? Lengua fuera

Por muy lógico que sea que esto pase, la cosa no es evidente en un primer instante.

Ahora, sabiendo esto, ¿qué pasa si yo lo que quiero es que los adornitos esos tan guays que he creado (Adorners) se superpongan a una zona y no a todo?

Pues, ¿cómo te quedas si te digo que se pueden crear más AdornerLayers? Pues sí, baby, ¡para eso está el AdornerDecorator.

El AdornerDecorator estará en el nivel del árbol visual que le corresponda según lo hayamos declarado y tiene la particularidad de que aparte de albergar un contenido, nos generará una AdornerLayer para nuestro uso y disfrute.

O sea, tal que así:

<AdornerDecorator>
        <DockPanel>

            <Grid>
                <Rectangle Width="800" Height="600" VerticalAlignment="Top" HorizontalAlignment="Left"
                           Visibility="Visible" />
                <designerCanvas:Designer Background="Transparent">                   
                    <i:Interaction.Behaviors>
                        <rubberBand:RubberBandSelectionBehavior></rubberBand:RubberBandSelectionBehavior>
                    </i:Interaction.Behaviors>                    
                </designerCanvas:Designer>
                <Grid x:Name="GridOverlay" IsHitTestVisible="False" />
            </Grid>

        </DockPanel>
    </AdornerDecorator>

La cosa interesante de esto es que la capa generada estará limitada a la zona donde se declara. Es decir, que si ponemos un adorno en esa capa y un elemento de la misma se sale de los bordes de la capa, ¡tendrá clipping! O sea, que se recortará y desaparecerá en vez de dibujarse por encima de la ventana Sonrisa

image

Ahora el adorner se queda por detrás. Way cool, boy!

Esto es la mar de interesante para, por ejemplo, hacer rectángulos de selección o agarres (handlers) para redimensionar objetos.

Vamos, que es una chulada.

TreeView con alineación

Vamos con una de controlejos en WPF.

La chufa que es tener que hacer un TreeView cuyos elementos tenga cierta complejidad es digno de estudio, pero para mitigar la desesperación, aquí hay un ejemplo de esos que pueden salvarte el ojal en más de ocasión. Al loro con con el ItemContainerStyle, ¡que lo flipas!

http://stackoverflow.com/questions/4969418/wpf-treeview-with-right-alignment-values

image

Ese TextBox que crece indefinidamente

Te encuentras con la situación en que escribiendo en un TextBox tal que así:

image

Te pasas de la raya y escribes un poco más. De repente ocurre esto:

image

Una barrita de desplazamiento, o también llamada “ScrollBar” te la meterá doblada y arruinará tu layout a la primera oportunidad.

Para que esto no ocurra y la cosa crezca verticalmente (el TextBox), dando como resultado esta captura tan interesante…

image

… deberías poner un ScrollViewer.HorizontalScrollBarVisibility=”Disabled” en el contenedor apropiado, ejemplo:

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled" HorizontalContentAlignment="Stretch">
	<Grid>
		<Grid.ColumnDefinitions>
			<ColumnDefinition Width="Auto" />
			<ColumnDefinition Width="*" />
		</Grid.ColumnDefinitions>
		<TextBox Text="Hola tío"/>
		<TextBox Grid.Column="1" TextWrapping="Wrap" Text="TextBlock" />
	</Grid>
</ListBox>

¡Y así, la fiereza es dada!