Repetición de VisualBrush horizontalmente

<DrawingBrush x:Key="Sawy" TileMode="FlipY" 
			Stretch="Uniform"
			AlignmentY="Top"
			Viewport="0,0,20,3000"
			ViewportUnits="Absolute">
			<DrawingBrush.Drawing>
				<GeometryDrawing Brush="#FFF32A2A">
					<GeometryDrawing.Geometry>
						<PathGeometry Figures="M20.083324,91.847669 L29.749666,82.250336 39.280773,91.867415 39.280773,91.887239 39.280773,75.368358 20.078484,75.250366 z">
							<PathGeometry.Transform>
								<MatrixTransform Matrix="1.02446116733697,0,0,1.05939389937211,-20.5696267283038,-79.7197788893842"/>
							</PathGeometry.Transform>
						</PathGeometry>
					</GeometryDrawing.Geometry>
				</GeometryDrawing>
			</DrawingBrush.Drawing>
		</DrawingBrush>

And this is what you get!

image

Por supuesto, es básico si quieres hacer algo jugoso como el famoso adorno de las líneas temporales de Twitter, como por ejemplo esta:

image

Impresionnnnante.

¡Año nuevo, aventuras nuevas! Selector de FontFamilies con fuentes ordenaditas

 

Te felicito, oh Suppa JMN, ¡qué grande eres!

Bueno, menos pegotes y más código. Aquí tienes un XAML que chilla profesionalidad:

<Style TargetType="{x:Type controls:FontFamilyPicker}">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type controls:FontFamilyPicker}">
        <Grid>
          <Grid.Resources>
            <CollectionViewSource
                x:Key="Cvs"
                Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=FontFamilies}">
              <CollectionViewSource.SortDescriptions>
                <componentModel:SortDescription PropertyName="Source" />
              </CollectionViewSource.SortDescriptions>
            </CollectionViewSource>
          </Grid.Resources>
          <Border Background="{TemplateBinding Background}"
                  BorderBrush="{TemplateBinding BorderBrush}"
                  BorderThickness="{TemplateBinding BorderThickness}">
            <ComboBox
                SelectedItem="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=SelectedFontFamily, Mode=TwoWay}"
                ItemsSource="{Binding Source={StaticResource Cvs}}">
            </ComboBox>
          </Border>
        </Grid>
      </ControlTemplate>
    </Setter.Value>
  </Setter>

¿Has adivinado de qué va la cosa? Pues si no, yo te lo digo. Tienes una lista de familias de fuentes que están más desordenadas que mi cajón de los calzoncillos. Ahora llega el momento en que tus usuarios, que siempre ponen pegas, te dicen: “Ouh evil! necesito que esto esté ordenado!” pero como tú no eres un cutre decides que vas a solucionar la vicisitud con tu maestría y un toque de Loewe. imagePuesto que tú lo que tienes bajo palos es una colección (ICollection<FontFamily>) y eso sería como hablar de un conjunto en Álgebra, donde no procede establecer orden, tú se sacas una CollectionViewSource en la plantilla del control (ControlTemplate) y se la metes a caponete. Código fino, fino. No has tocado nada por debajo y ya tienes la colección ordenada con tus SortDescriptions al gusto.

Ahora ya puedes ducharte con agua fría.

FRESSSH!

A propósito de las DataGrids

Situación: tienes una DataGrid y una de las columnas es una DataGridCheckBoxColumn.

Ahora pretendes que el IsEnabled de cada CheckBox tenga un valor en base a un binding, o no.

Atiende, que viene código finicky!

<my:DataGridCheckBoxColumn.CellStyle>

    <Style>

        <Setter Property="CheckBox.IsEnabled" Value="{Binding c1, Converter={StaticResource cvt}}"/>

   </Style>

</my:DataGridCheckBoxColumn.CellStyle> 

OPPA CELLSTYLE! Gracias, Sergio por tu aporte Smile

Dar estilo a AvalonDock 2 es una divertida tareda!

Si en algún momento te dedicas a tan maravilloso trabajo, te convendrá saber que el jodido título de cada AnchorablePane es un control loco y se llama así! Su fondillo verde se cambia in this way. Has visto qué peligro tiene? Más que un carro de indios. Pues ahí lo llevas. Ahora a ver cómo cojones se personaliza via estilo sin tener que traquetear todo.

DISCO INFERNO!!

UPDATE

Para flipar en colorines, aquí va mi último descubrimiento. Si pones este estilo tan bueno en tu código y le pones ese TargetType que apunta y dispara, puedes hacer que tu barrita de título sea una barrita de muesli

Aquí tenemos el fragmento clave, estilo por defecto de del AnchorablePaneTitle:

<Style TargetType="{x:Type avalondock:AnchorablePaneTitle}">

       <Setter Property="Template">

           <Setter.Value>

               <ControlTemplate>

                   <Border Background="{StaticResource DocPathDefaultGradient}"

                           BorderBrush="{TemplateBinding BorderBrush}"

                           BorderThickness="{TemplateBinding BorderThickness}">

                       <Grid>

                           <Grid.ColumnDefinitions>

                               <ColumnDefinition Width="*" />

                               <ColumnDefinition Width="Auto" />

                               <ColumnDefinition Width="Auto" />

                               <ColumnDefinition Width="Auto" />

                           </Grid.ColumnDefinitions>

                           <avalondock:DropDownControlArea DropDownContextMenu="{Binding Model.Root.Manager.AnchorableContextMenu,  RelativeSource={RelativeSource TemplatedParent}}" DropDownContextMenuDataContext="{Binding Path=LayoutItem, RelativeSource={RelativeSource TemplatedParent}}">

                               <ContentPresenter

                                   Content="{Binding Model, RelativeSource={RelativeSource TemplatedParent}}"

                                   ContentTemplate="{Binding Model.Root.Manager.AnchorableTitleTemplate, RelativeSource={RelativeSource TemplatedParent}}" ContentTemplateSelector="{Binding Model.Root.Manager.AnchorableTitleTemplateSelector,  RelativeSource={RelativeSource TemplatedParent}}" />

                           </avalondock:DropDownControlArea>

                           <avalondock:DropDownButton

                               Style="{StaticResource {x:Static ToolBar.ToggleButtonStyleKey}}"

                               Focusable="False" Grid.Column="1" DropDownContextMenu="{Binding Model.Root.Manager.AnchorableContextMenu, RelativeSource={RelativeSource TemplatedParent}}"

                               DropDownContextMenuDataContext="{Binding Path=LayoutItem, RelativeSource={RelativeSource TemplatedParent}}" ToolTip="{x:Static Properties:Resources.Anchorable_CxMenu_Hint}">

                               <Image Source="/AvalonDock;component/Images/PinMenu.png" />

                           </avalondock:DropDownButton>

                           <Button x:Name="PART_AutoHidePin" Grid.Column="2" Focusable="False" Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}" Visibility="{Binding Path=IsEnabled,  RelativeSource={RelativeSource Self}, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" Command="{Binding Path=LayoutItem.AutoHideCommand, RelativeSource={RelativeSource TemplatedParent}}" ToolTip="{x:Static Properties:Resources.Anchorable_BtnAutoHide_Hint}"> 

                               <Image Source="/AvalonDock;component/Images/PinAutoHide.png" />

                           </Button>

                           <Button x:Name="PART_HidePin" Grid.Column="3" Focusable="False"

                                   Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}"

                                   Visibility="{Binding Path=IsEnabled, RelativeSource={RelativeSource Self}, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" Command="{Binding  Path=LayoutItem.HideCommand, RelativeSource={RelativeSource TemplatedParent}}"

                                   ToolTip="{x:Static Properties:Resources.Anchorable_BtnClose_Hint}">

                               <Image Source="/AvalonDock;component/Images/PinClose.png" />

                           </Button>

                       </Grid>

                   </Border>

                   <ControlTemplate.Triggers>

                       <DataTrigger

                           Binding="{Binding Model.IsAutoHidden, RelativeSource={RelativeSource Mode=Self}}" Value="True">

                           <Setter Property="LayoutTransform" TargetName="PART_AutoHidePin">

                               <Setter.Value>

                                   <RotateTransform Angle="90" />

                               </Setter.Value>

                           </Setter>

                       </DataTrigger>

                   </ControlTemplate.Triggers>

               </ControlTemplate>

           </Setter.Value>

       </Setter>

   </Style>