C#,WPF,メモ,開発環境

よく使う初期環境 のMaterialDesignThemes 3.1.3 対応版

  • ControlzEx 4.3.2
  • LivetCask 3.2.3.1
  • LivetCask.Behaviors 3.2.3.1
  • LivetCask.Collections 3.2.3.1
  • LivetCask.Converters 3.2.3.1
  • LivetCask.Core 3.2.3.1
  • LivetCask.EventListeners 3.2.3.1
  • LivetCask.Messaging 3.2.3.1
  • LivetCask.Mvvm 3.2.3.1
  • MahApps.Metro 2.2.0
  • MaterialDesignColors 1.2.6
  • MaterialDesignThemes 3.1.3
  • MaterialDesignThemes.MahApps 0.1.4
  • Microsoft.Xaml.Behaviors.Wpf 1.1.19

WPF,デザイン,開発環境

Fluent Designとは

Microsoftが2017年に提唱したデザインシステム。

Windows10の電卓など、一部アプリケーションはすでにFluent Designになっている。
また、Office・カレンダー・メール等、Microsoft製アプリケーションのアイコンデザインがFluent Designベースに変更された。

C#,WPF

今回お借りしたフォント
源真ゴシック (げんしんゴシック) | 自家製フォント工房

プロジェクト

Fontフォルダを作成し、フォントファイルを格納
ビルドアクションはResource
(例としてFontフォルダにしている 他のフォルダ名でもOK)

C#,WPF

UpdateSourceTrigger=PropertyChanged を付けることで、入力後即時反映される。

<TextBox Text="{Binding Url, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="TextChanged">
            <l:LivetCallMethodAction MethodTarget="{Binding}" MethodName="OnURLChanged" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</TextBox>

C#,WPF

MainView.xaml

<Controls:MetroWindow 
        x:Class="WpfApp12.View.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp12.View"
        mc:Ignorable="d"
        
        xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
        xmlns:ei="http://schemas.microsoft.com/xaml/behaviors"
        xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
        xmlns:l="http://schemas.livet-mvvm.net/2011/wpf"
        xmlns:vm="clr-namespace:WpfApp12.ViewModel"
        
        xmlns:Dialog="clr-namespace:MahApps.Metro.Controls.Dialogs;assembly=MahApps.Metro"
        Dialog:DialogParticipation.Register="{Binding}"
        
        TextElement.Foreground="{DynamicResource MaterialDesignBody}"
        TextElement.FontWeight="Regular"
        TextElement.FontSize="13"
        TextOptions.TextFormattingMode="Ideal" 
        TextOptions.TextRenderingMode="Auto"        
        Background="{DynamicResource MaterialDesignPaper}"
        FontFamily="{DynamicResource MaterialDesignFont}"
        ResizeMode="CanResizeWithGrip"
        WindowStartupLocation="CenterScreen"
        GlowBrush="{DynamicResource AccentColorBrush}"
        WindowTransitionsEnabled="False"
        TitleCharacterCasing="Normal"
        ShowIconOnTitleBar="True"
        
        Title="MainView" Height="450" Width="800">

    <Window.DataContext>
        <vm:MainViewModel>
            <vm:MainViewModel.MahAppsDialogCoordinator>
                <Dialog:DialogCoordinator/>
            </vm:MainViewModel.MahAppsDialogCoordinator>
        </vm:MainViewModel>
    </Window.DataContext>

    <Grid>

        <Button Content="MessageBox" Margin="10,10,657,359" Height="Auto">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                    <l:LivetCallMethodAction MethodTarget="{Binding}" MethodName="ShowMessageBox" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Button>
        
        <Button Content="Progress" Margin="155,10,512,359" Height="Auto">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                    <l:LivetCallMethodAction MethodTarget="{Binding}" MethodName="ShowProgress" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Button>

    </Grid>
</Controls:MetroWindow>

C#,WPF,ソフトウェア開発

VisualStudio2019から、BlendSDKが提供されなくなった為、
Microsoft.Xaml.Behaviors.Wpfへ移行する必要がある。

BlendSDK

xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

Microsoft.Xaml.Behaviors.Wpf

xmlns:ei="http://schemas.microsoft.com/xaml/behaviors"
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"

詳細
Open Sourcing XAML Behaviors for WPF | .NET Blog

C#,WPF

Livetを用いてViewModelからViewを操作する為に
WindowInteractionMessageActionを用いる際、
デフォルトのままだとWindowが非アクティブの状態では
正しくメッセージが送信されない(実行されない)。

例として、
OnContentRendered→最小化(非アクティブ化)→3秒待つ→最大化 を行う場合は、
下記のように InvokeActionOnlyWhenWindowIsActive="False" を指定する。

C#,WPF

下記ソースの場合、ボタンを押下すると、行ごとのクラス内のイベントが発生してしまう。

C#,WPF

DataGridのオプションを行選択(SelectionUnit="FullRow")にしている場合でも、
選択したセルに枠が表示されてしまう。

<DataGrid Margin="10" ItemsSource="{Binding Path=ArrayData}" AutoGenerateColumns="False" SelectionMode="Single" SelectionUnit="FullRow">

BorderThicknessを0にすることで、この枠を消去することができる。

        <DataGrid Margin="10" ItemsSource="{Binding Path=ArrayData}" AutoGenerateColumns="False" SelectionMode="Single" SelectionUnit="FullRow">
            <DataGrid.CellStyle>
                <Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}">
                    <Setter Property="BorderThickness" Value="0" />
                </Style>
            </DataGrid.CellStyle>