WPFオープンソースコントロール拡張ライブラリControlzEx

WPFオープンソースコントロール拡張ライブラリControlzEx

オープンソース共有

最終更新 2021/06/19 13:45
沙漠尽头的狼
読了目安 6 分
カテゴリ
WPF
テーマ
WPFオープンソースプロジェクト C#オープンソースプロジェクト
タグ
.NET C# WPF WPFオープンソースプロジェクト オープンソース

WPF用共有Controlz

.NET Framework (4.5.2, 4.6.2以降)、.NET Core (3.1)、および.NET 5(Windows上)をサポート

はじめよう

TextBoxInputMaskBehavior

TextBoxInputMaskBehaviorは、テキストボックス内にマスクを表示するために使用できます。

注意: これは単なるマスクであり、テキストを検証するものではありません。

<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>

元の TextBoxInputMaskBehavior は Blindmeis のブログから取得されました。

KeyboardNavigationEx

KeyboardNavigationEx は、一般的なフォーカス問題に対処するためのヘルパークラスです。UI要素自体のフォーカスは問題になりません。ただし、一般的なフォーカス設定方法を使用すると、コントロールはフォーカスを取得しますが、フォーカス視覚スタイルは取得されません。

元の KeyboardNavigation クラスは、コントロールがキーボードデバイスからフォーカスを取得した場合、または SystemParameters.KeyboardCues が true の場合にのみ、視覚スタイルを処理します。

KeyboardNavigationEx を使用すると、この問題を2つの簡単な方法で解決できます。

コードビハインド:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.Loaded += (s, e) => { KeyboardNavigationEx.Focus(this.TheElementWhichShouldGetTheFocus); };
    }
}

またはXAMLで:

<button controlzex:KeyboardNavigationEx.AlwaysShowFocusVisual="True">
  Hey, I get the focus visual style on mouse click!
</button>

自動移動ツールチップ

マウスに追従する自動移動ツールチップ。詳細はこちら

<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>

GlowWindowBehavior

GlowWindowBehavior はウィンドウの周囲にグロー効果を追加します。

WindowChromeBehavior

ControlzEx はWPFウィンドウにカスタムクロームを提供し、さらにいくつかの深い修正も行います。

ほとんどの修正と改善は、MahApps.Metro および Fluent.Ribbon から来ています。

技術的な実装の詳細はこちら:

http://blogs.msdn.com/b/wpfsdk/archive/2008/09/08/custom-window-chrome-in-wpf.aspx

これは元のMicrosoft WPF Shell Integration Libraryのフォークです。現在のMicrosoftの実装はこちら:

PopupEx

カスタムの Popup ウィンドウで、検証エラーテンプレートや、MaterialDesignInXamlToolkitMahApps.Metro などの他の用途に使用できます。

PopupEx はいくつかの追加機能を提供します:

  • ホストウィンドウのサイズまたは位置が変更されたときに再配置
  • ホストウィンドウが最大化されたときに再配置、またはその逆
  • ホストウィンドウがアクティブになったときのみ最前面に表示

TabControlEx

カスタム TabControl で、選択解除時に TabItem のコンテンツを VisualTree に保持するため、再度 TabItem を選択した後に再作成されません。表示動作は ChildContentVisibility 依存関係プロパティで設定できます。

使用法:

<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>

PackIconBase

WPFでアイコンパックを作成するためのヘルパークラス。

新しいアイコンパックを作成するには、次の手順に従ってください:

キーを定義します(通常は列挙型):

public enum PackIconKind
{
    Happy,
    Sad
}

PackIconBase をサブクラス化し、以下を追加します:

  • デフォルトスタイルキー
  • 各キーにPathデータを提供するファクトリ
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"}
        };
    }
}

デフォルトスタイルを指定します(通常はGeneric.xaml内で、例:):

<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>

これで、ユーザーはアプリケーションでアイコンパックを簡単に使用できるようになります:

<ns:PackIcon Kind="HappyIcon" />

テーマ

ControlzExは ThemeManager を提供し、アプリケーションにテーマ管理サポートを追加するのに役立ちます。詳細はこちらのセクションを参照してください。

ライセンス

MIT

さらに探索

関連読書

その他の記事
同じカテゴリ / 同じタグ 2025/01/26

WPF カスタムXMLファイルによる国際化

この記事では、WPFプログラムでカスタムXMLファイルを使用して国際化を実現する方法について詳しく説明します。必要なNuGetパッケージのインストール、言語リストの動的取得、言語の動的切り替え、コードおよびXAMLインターフェースでの翻訳文字列の使用などを含み、ソースコードのリンクも提供し、開発者がWPFアプリケーションの国際化を簡単に実装できるように支援します。

続きを読む
同じカテゴリ / 同じタグ 2024/01/25

C# WPFにおけるFluentValidationの応用

この記事では、C# WPFプロジェクトでFluentValidationを使用してプロパティ検証を行う方法と、MVVMパターンを通じてこの機能を実装する方法について詳しく説明します。

続きを読む