Controlz compartido para WPF
Soporte de .NET Framework (4.5.2, 4.6.2 y mayor), .NET Core (3.1) y .NET 5 (en Windows)

El TextBoxInputMaskBehavior se puede usar para mostrar una máscara dentro de un TextBox .
Nota: es solo una máscara y no valida su texto.
< TextBlock Grid.Row= " 0 "
Grid.Column= " 0 "
Margin = " 4 "
Text = " Datetime " />
< TextBox Grid.Row= " 0 "
Grid.Column= " 1 "
Margin = " 4 " >
< behaviors : Interaction .Behaviors>
< controlzEx : TextBoxInputMaskBehavior InputMask = " 00/00/0000 " />
</ behaviors : Interaction .Behaviors>
</ TextBox >
< TextBlock Grid.Row= " 1 "
Grid.Column= " 0 "
Margin = " 4 "
Text = " Phone Number " />
< TextBox Grid.Row= " 1 "
Grid.Column= " 1 "
Margin = " 4 " >
< behaviors : Interaction .Behaviors>
< controlzEx : TextBoxInputMaskBehavior InputMask = " ( 999 ) 000 000 - 00 "
PromptChar = " _ " />
</ behaviors : Interaction .Behaviors>
</ TextBox >El cuadro de texto original de MaskBehavior fue tomado del blog de BlindMeis.

KeyboardNavigationEx es una clase de ayuda para un problema de enfoque común. El enfoque de un elemento UI en sí no es el problema. Pero si usamos los métodos de enfoque comunes, el control obtiene el enfoque, pero no obtiene el estilo visual de enfoque.
La clase KeyboardNavigation original maneja el estilo visual solo si el control obtiene el enfoque de un dispositivo de teclado o si el SystemParameters.KeyboardCues es cierto.
Con KeyboardNavigationEx puede solucionar esto de dos maneras simples.
En código detrás:
public partial class MainWindow : Window
{
public MainWindow ( )
{
InitializeComponent ( ) ;
this . Loaded += ( s , e ) => { KeyboardNavigationEx . Focus ( this . TheElementWhichShouldGetTheFocus ) ; } ;
}
}o en xaml:
< Button controlzex:KeyboardNavigationEx.AlwaysShowFocusVisual= " True " >Hey, I get the focus visual style on mouse click!</ Button >Una información sobre herramientas automáticamente en movimiento. Más información.
< Button Margin = " 5 "
Padding = " 5 "
Content = " Test Button 2 "
ToolTipService.ShowDuration= " 20000 " >
< Button .ToolTip>
< ToolTip local:ToolTipAssist.AutoMove= " True " >
< ToolTip .Template>
< ControlTemplate >
< Grid >
< Border Background = " Gray "
BorderBrush = " Black "
BorderThickness = " 1 "
Opacity = " 0.9 "
SnapsToDevicePixels = " True " />
< TextBlock Margin = " 5 "
Foreground = " WhiteSmoke "
FontSize = " 22 "
Text = " ToolTipHelper AutoMove sample "
TextOptions.TextFormattingMode= " Display "
TextOptions.TextRenderingMode= " ClearType " />
</ Grid >
</ ControlTemplate >
</ ToolTip .Template>
</ ToolTip >
</ Button .ToolTip>
</ Button > El GlowWindowBehavior agrega un brillo alrededor de su ventana.
Comenzando con Windows 11, el comportamiento se puede usar para controlar el color del borde de la ventana nativa y lo hace automáticamente cuando se detecta Windows 11.
Esto se puede apagar estableciendo PreferDWMBorder en false .
ControlZex proporciona un Chrome personalizado para WPF Windows y algunas otras soluciones más profundas para él.
Lo que sí proporciona:
WindowStyle ( None , SingleBorderWindow , ThreeDBorderWindow y ToolWindow )IsNCActiveCornerPreference )NonClientControlProperties.HitTestResult y NonClientControlProperties.ClickStrategy )La mayoría de las soluciones y mejoras son de Mahapps.Metro y Fluent.Ribbon.
Implementación concreta de técnicas descritas aquí:
Entrada en el blog desde Microsoft en Windows Chrome personalizado
Es una bifurcación de la biblioteca original de integración de shell Microsoft WPF. Se puede encontrar la implementación actual de Microsoft:
Popup personalizada que se puede usar en plantillas de error de validación o algo más como en MaterialDesigninxamLToolkit o Mahapps.metro.
PopupEx proporciona algunas características agradables adicionales:
TabControl personalizado que mantiene el contenido TabItem en VisualTree mientras no se selecciona, por lo que no se realiza una pesadilla recreativa, después de seleccionar el TabItem nuevamente. El comportamiento de visibilidad se puede establecer mediante la propiedad de dependencia de Visibilidad ChildContentVisibility .
Uso:
< controlz : TabControlEx >
< TabItem Header = " Lorem " >
< TextBlock Text = " Lorem ipsum dolor sit amet, consetetur sadipscing "
HorizontalAlignment = " Center "
FontSize = " 30 " />
</ TabItem >
< TabItem Header = " ipsum " >
< TextBox Text = " Lorem ipsum dolor sit amet, consetetur sadipscing "
HorizontalAlignment = " Center "
Margin = " 5 " />
</ TabItem >
</ controlz : TabControlEx >Una clase base para ayudar a impulsar un método común para crear paquetes de iconos en WPF.
Para crear un nuevo paquete de iconos, siga estos pasos:
Definir una clave (típicamente un enum ):
public enum PackIconKind
{
Happy ,
Sad
} Subclase PackIconBase , agregando
public class PackIcon : PackIconBase < PackIconKind >
{
static PackIcon ( )
{
DefaultStyleKeyProperty . OverrideMetadata ( typeof ( PackIcon ) , new FrameworkPropertyMetadata ( typeof ( PackIcon ) ) ) ;
}
public PackIcon ( ) : base ( CreateIconData )
{ }
private static IDictionary < PackIconKind , string > CreateIconData ( )
{
return new Dictionary < PackIconKind , string >
{
{ PackIconKind . Happy , "M20,12A8,8 0 0,0 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20A8,8 0 0,0 20,12M22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2A10,10 0 0,1 22,12M10,9.5C10,10.3 9.3,11 8.5,11C7.7,11 7,10.3 7,9.5C7,8.7 7.7,8 8.5,8C9.3,8 10,8.7 10,9.5M17,9.5C17,10.3 16.3,11 15.5,11C14.7,11 14,10.3 14,9.5C14,8.7 14.7,8 15.5,8C16.3,8 17,8.7 17,9.5M12,17.23C10.25,17.23 8.71,16.5 7.81,15.42L9.23,14C9.68,14.72 10.75,15.23 12,15.23C13.25,15.23 14.32,14.72 14.77,14L16.19,15.42C15.29,16.5 13.75,17.23 12,17.23Z" } ,
{ PackIconKind . Sad , "M20,12A8,8 0 0,0 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20A8,8 0 0,0 20,12M22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2A10,10 0 0,1 22,12M15.5,8C16.3,8 17,8.7 17,9.5C17,10.3 16.3,11 15.5,11C14.7,11 14,10.3 14,9.5C14,8.7 14.7,8 15.5,8M10,9.5C10,10.3 9.3,11 8.5,11C7.7,11 7,10.3 7,9.5C7,8.7 7.7,8 8.5,8C9.3,8 10,8.7 10,9.5M12,14C13.75,14 15.29,14.72 16.19,15.81L14.77,17.23C14.32,16.5 13.25,16 12,16C10.75,16 9.68,16.5 9.23,17.23L7.81,15.81C8.71,14.72 10.25,14 12,14Z" }
} ;
}
}Proporcione un estilo predeterminado (generalmente en su genic.xaml, por ejemplo:
< Style TargetType = " {x:Type local:PackIcon} " >
< Setter Property = " Height " Value = " 16 " />
< Setter Property = " Width " Value = " 16 " />
< Setter Property = " HorizontalAlignment " Value = " Left " />
< Setter Property = " VerticalAlignment " Value = " Top " />
< Setter Property = " IsTabStop " Value = " False " />
< Setter Property = " Template " >
< Setter .Value>
< ControlTemplate TargetType = " {x:Type local:PackIcon} " >
< Viewbox >
< Canvas Width = " 24 " Height = " 24 " >
< Path Data = " {Binding Data, RelativeSource={RelativeSource TemplatedParent}} "
Fill = " {TemplateBinding Foreground} " />
</ Canvas >
</ Viewbox >
</ ControlTemplate >
</ Setter .Value>
</ Setter >
</ Style >Sus usuarios ahora deben tener una manera simple de usar su paquete de iconos en sus aplicaciones:
< ns : PackIcon Kind = " HappyIcon " /> ControlZex proporciona un ThemeManager que lo ayuda a proporcionar temas a su aplicación.
Para obtener más información, consulte esta sección.
La licencia del MIT (MIT)
Copyright (c) Desde 2015 Jan Karger, Bastian Schmidt, James Willock
El permiso se otorga, de forma gratuita, a cualquier persona que obtenga una copia de este software y archivos de documentación asociados (el "software"), para tratar en el software sin restricción, incluidos los derechos de los derechos de usar, copiar, modificar, fusionar, publicar, distribuir, sublicense y/o vender copias del software, y para permitir que las personas a quienes se les proporciona el software para hacer, sujeto a las siguientes condiciones: las siguientes condiciones: las siguientes condiciones: las siguientes condiciones:
El aviso de derechos de autor anterior y este aviso de permiso se incluirán en todas las copias o porciones sustanciales del software.
El software se proporciona "tal cual", sin garantía de ningún tipo, expresa o implícita, incluidas, entre otros, las garantías de comerciabilidad, idoneidad para un propósito particular y no infracción. En ningún caso los autores o titulares de derechos de autor serán responsables de cualquier reclamo, daños u otra responsabilidad, ya sea en una acción de contrato, agravio o de otra manera, que surge, de o en relación con el software o el uso u otros tratos en el software.