Controlz partagé pour WPF
Prise en charge .NET Framework (4.5.2, 4.6.2 et plus), .NET Core (3.1) et .NET 5 (sur Windows)

Le TextBoxInputMaskBehavior peut être utilisé pour afficher un masque dans une TextBox .
Remarque: ce n'est qu'un masque et ne valide pas votre texte.
< 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 >Le TextBoxInputMaskBehavior d'origine a été tiré du blog de Blindmeis.

Le KeyboardNavigationEx est une classe d'assistance pour un problème de focalisation commun. L'objectif d'un élément d'interface utilisateur lui-même n'est pas le problème. Mais si nous utilisons les méthodes de mise au point communes, le contrôle obtient le foyer, mais il n'obtient pas le style visuel de mise au point.
La classe KeyboardNavigation d'origine ne gère le style visuel que si le contrôle obtient l'attention d'un périphérique de clavier ou si SystemParameters.KeyBoardCes est vrai.
Avec KeyboardNavigationEx vous pouvez résoudre ce problème de deux manières simples.
En code derrière:
public partial class MainWindow : Window
{
public MainWindow ( )
{
InitializeComponent ( ) ;
this . Loaded += ( s , e ) => { KeyboardNavigationEx . Focus ( this . TheElementWhichShouldGetTheFocus ) ; } ;
}
}ou en xaml:
< Button controlzex:KeyboardNavigationEx.AlwaysShowFocusVisual= " True " >Hey, I get the focus visual style on mouse click!</ Button >Une info-bulle mobile automatique. Plus d'informations.
< 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 > Le GlowWindowBehavior ajoute une lueur autour de votre fenêtre.
À partir de Windows 11, le comportement peut être utilisé pour contrôler la couleur de la bordure de la fenêtre native et le fait automatiquement lorsque Windows 11 est détecté.
Cela peut être désactivé en définissant PreferDWMBorder à false .
ControlZex fournit un chrome personnalisé pour les fenêtres WPF et quelques autres correctifs plus profonds pour cela.
Ce qu'il fournit:
WindowStyle ( None , SingleBorderWindow , ThreeDBorderWindow et ToolWindow )IsNCActiveCornerPreference )NonClientControlProperties.HitTestResult et NonClientControlProperties.ClickStrategy )La plupart des correctifs et des améliorations proviennent de Mahapps.Metro et Fluent.Ribbon.
Mise en œuvre concrète des techniques décrites ici:
Entrée de blog de Microsoft sur la fenêtre personnalisée Chrome
C'est une fourche de la bibliothèque d'intégration de shell Microsoft WPF d'origine. L'implémentation actuelle de Microsoft peut être trouvée:
Popup personnalisée qui peut être utilisée dans les modèles d'erreur de validation ou quelque chose d'autre comme dans MaterialDesiginxamltoolkit ou MAHApps.Metro.
PopupEx offre de belles fonctionnalités supplémentaires:
TabControl personnalisé qui maintient le contenu TabItem dans le VisualTree tout en les non-sélectionnant, donc aucun cauchemar recréé n'est terminé, après avoir sélectionné le TabItem . Le comportement de visibilité peut être défini par la propriété de dépendance à ChildContentVisibility .
Usage:
< 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 >Une classe de base pour aider à conduire une méthode commune pour créer des packs d'icônes dans WPF.
Pour créer un nouveau pack d'icônes, suivez ces étapes:
Définissez une clé (généralement une enum ):
public enum PackIconKind
{
Happy ,
Sad
} Sous-classe PackIconBase , ajoutant
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" }
} ;
}
}Fournissez un style par défaut (généralement dans votre générique.xaml, par exemple:
< 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 >Vos utilisateurs devraient désormais avoir un moyen simple d'utiliser votre pack d'icônes dans leurs applications:
< ns : PackIcon Kind = " HappyIcon " /> ControlZEX fournit un ThemeManager qui vous aide à fournir un thème à votre application.
Pour plus d'informations, consultez cette section.
La licence du MIT (MIT)
Copyright (c) Depuis 2015 Jan Karger, Bastian Schmidt, James Willock
L'autorisation est accordée gratuitement à toute personne qui obtient une copie de ce logiciel et des fichiers de documentation associés (le "logiciel"), pour traiter le logiciel sans restriction, y compris sans limiter les droits d'utilisation, de copie, de modification, de fusion, de publication, de distribution, de sublince et / ou de vendre des copies des conditions suivantes.
L'avis de droit d'auteur ci-dessus et le présent avis d'autorisation sont inclus dans toutes les copies ou des parties substantielles du logiciel.
Le logiciel est fourni "tel quel", sans garantie d'aucune sorte, express ou implicite, y compris, mais sans s'y limiter, les garanties de qualité marchande, d'adéquation à un usage particulier et de non-contrefaçon. En aucun cas, les auteurs ou les détenteurs de droits d'auteur ne seront pas responsables de toute réclamation, dommage ou autre responsabilité, que ce soit dans une action de contrat, de délit ou autre, découlant de, hors du logiciel ou de l'utilisation ou d'autres relations dans le logiciel.