ブログ

割とコンピュータよりの情報をお届けします。

2018年9月22日

WPFでTextBoxへの入力に範囲制限を設ける例

WPFでTextBoxに数値をバインドしている場合に入力範囲に制限を設ける例を探していた。

概要としてはEnterキーを押すと入力のチェックが始まり範囲内なら入力が新しい変数値として適用されて,出力側もPropertyChangedイベンドをきっかけに変更される。

MainWindows.xaml

<Window x:Class="WpfApp1.MainWindow"
        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:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="100" Width="300">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <TextBlock Grid.Column="0" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center">入力</TextBlock>
        <TextBlock Grid.Column="0" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center">出力</TextBlock>
        <TextBox Grid.Column="1" Grid.Row="0" Width="70"  VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Right" KeyUp="OnKeyUp">
            <TextBox.Text>
                <Binding Path="Value" Mode="TwoWay" UpdateSourceTrigger="LostFocus">
                    <Binding.ValidationRules>
                        <local:DoubleRangeRule MinValue="0" MaxValue="100" />
                    </Binding.ValidationRules>
                </Binding>
            </TextBox.Text>
        </TextBox>
        <TextBox Text="{Binding Value, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="1" Grid.Row="1" Width="70" Foreground="SkyBlue" Background="AliceBlue" IsReadOnly="True" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Right"/>
    </Grid>
</Window>

MainWindows.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp1
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        private MainWindowViewModel mainWindowViewModel;

        public MainWindow()
        {
            InitializeComponent();

            mainWindowViewModel = new MainWindowViewModel();
            this.DataContext = mainWindowViewModel;
        }

        private void OnKeyUp(object sender, KeyEventArgs e)
        {
            TextBox textBox = (TextBox)sender;
            if (e.Key == Key.Return)
            {
                //System.Windows.Input.Keyboard.ClearFocus();
                textBox.RaiseEvent(new RoutedEventArgs(LostFocusEvent, textBox));
            }
        }
    }
}

 

DoubleRangeRule.cs

(参考ページのintを全部doubleに変更するだけ。)
ちなみに以下は必要
using System.Windows.Controls;
using System.Globalization;

≫ 続きを読む

2018/09/22 コンピュータ   TakeMe

Pythonで複数の画像をまとめる例

Pillowで複数の画像をまとめて一つにする例を作成していた。

今回は一つの画像imから2つの画像を作成したが,im1, im2は別の画像とする。

Image.newで出力の画像を作成しておいて,Image.paste()で貼り付けるImageと貼り付け先を指定してやるだけで画像が一つにまとまる。

from PIL import Image, ImageDraw, ImageFilter

im = Image.open('DSC_0001.JPG')
im1 = im.resize((200, 150))
im2 = im1.filter(ImageFilter.EDGE_ENHANCE)


dst = Image.new('RGB', (im1.width + im2.width, im1.height))
dst.paste(im1, (0, 0))
dst.paste(im2, (im1.width, 0))

dst.show()
dst.save('im.png')
#dst.save('im.jpg', 'JPEG', quality=30, optimize=True)

ある処理で,たくさんの画像をまとめたサムネイル化を図っていた。
調べてみたら,ImageDrawのimportはいらない。また,ImageFilterも画像がすでに用意されている場合にはいらない(今回の例だけ)。

≫ 続きを読む

2018/09/22 コンピュータ   TakeMe
タグ:Python