비헤비아 촉발 동작의 동작

13489 단어 WPF

●맥주


버튼을 눌렀을 때 메시지를 보내는 등 고정된 특정 이벤트에 대한 처리를 기록합니다

● 소스


직접 만들 수 있기 때문에 직접 만든 맥주를 만들어 동작을 확인했다.
다음 소스는 텍스트 상자에 문자를 입력할 때마다 문자 색상을 수정합니다.

Rand_ForeColor 레벨


본작 베하비올이 베하비올반을 물려받았다.
유형 매개 변수에서 용도에 적합한 유형을 지정합니다.이번에는 텍스트 상자에 대한 처리이기 때문에 TextBox를 지정했습니다.
OnAttached 방법, On Detaching 방법을 교차하여 제작하여 처리합니다.
로그인 이벤트
On Detaching: 활동 취소
텍스트 상자에 입력할 때 객체로 사용하기 위해 Associated Object의 PreviewText Input 이벤트를 지정합니다.
PreviewTextInput을 KeyDown 이벤트로 변경하고 Key를 눌렀을 때 텍스트 색상 등을 변경할 수도 있습니다.
Rand_ForeColor.cs
/// <summary>
/// テキストボックスに入力される度に文字色を変更する
/// Behavior<T>を継承したクラス
/// </summary>
class Rand_ForeColor : Behavior<TextBox>
{
    /// <summary>
    /// イベントの登録
    /// </summary>
    protected override void OnAttached()
    {
        base.OnAttached();

        AssociatedObject.PreviewTextInput += OnPreviewTextInput;
    }

    /// <summary>
    /// イベントの解除
    /// </summary>
    protected override void OnDetaching()
    {
        base.OnDetaching();

        AssociatedObject.PreviewTextInput -= OnPreviewTextInput;
    }


    /// <summary>
    /// テキストボックス入力のイベント処理
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void OnPreviewTextInput(object sender, TextCompositionEventArgs e)
    {
        // 文字色の変更ができない場合イベントをキャンセルする
        e.Handled = !ChangeTextColor(sender);
    }

    /// <summary>
    /// テキストボックスの文字色をランダムに変更する
    /// </summary>
    /// <returns>変更成功/失敗</returns>
    private bool ChangeTextColor(object sender)
    {
        if (sender is TextBox textBox)
        {
            var rnd = new Random();
            var red = (byte)rnd.Next(256);
            var blue = (byte)rnd.Next(256);
            var green = (byte)rnd.Next(256);

            textBox.Foreground = new SolidColorBrush(Color.FromRgb(red, blue, green));

            return true;
        }

        return false;
    }
}

MainWindowView.xmal


Interaction.Behaviors가 직접 만든 맥주를 지정합니다.
MainWindowView.xmal
~省略~

<Grid >
    <StackPanel Orientation="Vertical" >
        <Label Content="Interaction.Behaviors" Margin="2"/>
        <TextBox Text="{Binding InputText}" Margin="3">
            <behaviors:Interaction.Behaviors>
                <v:Rand_ForeColor />
            </behaviors:Interaction.Behaviors>
        </TextBox>
    </StackPanel>
</Grid>
 

● 동작 트리거


비히비아에서 특정한 사건(계기가 된 사건)을 지정한 것보다 촉발은 특정한 사건에 의존하지 않고 사건을 일으키며 동작을 통해 처리할 수 있다.

● 소스


텍스트 상자에서 초점을 벗어나는 작업을 트리거(FirstName, LastName)로 하고 입력한 내용을 다른 텍스트 상자(Full Name)로 복사하는 작업을 수행합니다.

●MainWindowViewModel 클래스


지정한 트리거에 의해 실행되는 동작을 설명합니다.
이번에는firstName과lastName을 결합하여 FullName 텍스트 상자에 표시하는 처리를 실행합니다.
MainWindowViewModel.cs
public class MainWindowViewModel : ViewModel
{
    // フルネーム
    private string fullName;
    public string FullName { get => fullName; set => RaisePropertyChangedIfSet(ref fullName, value); }

    // ファーストネーム
    private string firstName;
    public string FirstName { get => firstName; set => RaisePropertyChangedIfSet(ref firstName, value); }

    // ラストネーム
    private string lastName;
    public string LastName { get => lastName; set => RaisePropertyChangedIfSet(ref lastName, value); }


    /// <summary>
    /// firstName/lastNameの結合実行コマンド
    /// </summary>
    private ViewModelCommand combineNameCommand;
    public ViewModelCommand CombineNameCommand => combineNameCommand ??= new ViewModelCommand(CombineName);
    private void CombineName()
    {
        fullName = firstName + lastName;
        // 表示内容の更新
        RaisePropertyChanged(nameof(FullName));
    }

    // Some useful code snippets for ViewModel are defined as l*(llcom, llcomn, lvcomm, lsprop, etc...).
    public void Initialize()
    {
    }
}
MainWindow.xmal
<behaviors:Interaction.Triggers>
    <!--フォーカスが外れるのをトリガーにCombineNameCommandが実行される-->
    <behaviors:EventTrigger EventName="LostFocus">
        <behaviors:InvokeCommandAction Command="{Binding CombineNameCommand}"/>
    </behaviors:EventTrigger>
</behaviors:Interaction.Triggers>

<Grid >
    <StackPanel Orientation="Vertical">
        <Label Content="Interaction.Triggers" Margin="2"/>

        <DockPanel Margin="3">
            <Label Content="FirstName :" Margin="2" DockPanel.Dock="Left"/>
            <TextBox Text="{Binding FirstName}" DockPanel.Dock="Right"/>
        </DockPanel>

        <DockPanel Margin="3">
            <Label Content="LastName :" Margin="2" DockPanel.Dock="Left"/>
            <TextBox Text="{Binding LastName}" DockPanel.Dock="Right"/>
        </DockPanel>

        <DockPanel Margin="3">
            <Label Content="FullName : " Margin="2" DockPanel.Dock="Left"/>
            <TextBox Text="{Binding FullName}" IsEnabled="False" DockPanel.Dock="Right"/>
        </DockPanel>
    </StackPanel>
</Grid>
 

환경


VisualStudio2019
.Net Core3.0
Livet v3.2.1

참조


WPF4.5 입문 58 "Behavior" 일생의Blog@hatena
WPF4.5 입문 59'Behavior의 자제'카주키의Blog@hatena

좋은 웹페이지 즐겨찾기