FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ドラッグで要素を移動させる

 WPFで要素(ボタンとか)をドラッグで移動させるだけなら、動かしたい要素にBlend SDKのMouseDragElementBehaviorを指定するだけでOKです。
 親パネルがCanvasである必要すらありません。
<Window x:Class="MouseDragElementBehabiorDemo.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
        xmlns:l="http://schemas.livet-mvvm.net/2011/wpf"
        xmlns:v="clr-namespace:MouseDragElementBehabiorDemo.Views"
        xmlns:vm="clr-namespace:MouseDragElementBehabiorDemo.ViewModels"
        Title="MainWindow" Height="350" Width="525">
    
    <Window.DataContext>
        <vm:MainWindowViewModel/>
    </Window.DataContext>
        
    <Grid ShowGridLines="True">
        <Grid.RowDefinitions>
            <RowDefinition Height="100"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        
        <StackPanel Grid.Row="0" Grid.Column="1">
            <TextBlock Text="{Binding XPosition, StringFormat=X:{0}}"/>
            <TextBlock Text="{Binding YPosition, StringFormat=Y:{0}}"/>
        </StackPanel>
        
        <StackPanel Grid.Row="1" Grid.Column="1">
            <Rectangle Width="20" Height="20" Fill="Red">
                <i:Interaction.Behaviors>
                    <ei:MouseDragElementBehavior ConstrainToParentBounds="True"
                                                 X="{Binding XPosition, Mode=TwoWay}"
                                                 Y="{Binding YPosition, Mode=TwoWay}"/>
                </i:Interaction.Behaviors>
            </Rectangle>
        </StackPanel>      
    </Grid>
</Window>
 赤い四角をドラッグで移動させることができます。
 MouseDragElementBehaviorのXプロパティとYプロパティを利用することで、要素の位置を取得することもできます。
 ConstrainToParentBoundsをTrueにすると、親パネルの範囲内でのみ移動可能になります。(デフォルトではFalseになっています。)
 この場合はGrid.Row=1, Grid.Column=1にあるStackPanel内でのみ移動できます。それ以外の範囲には移動できません。

 要素をただ移動させるだけならこのビヘイビアを使えば良いのですが、座標を使って何か処理を行う場合は少し問題があります。
 赤い四角をStackPanelの左上角に押し付けた場合、以下の様になります。
MouseDragElementBehaviorDemo1.png
 座標を確認してほしいのですが、X=100, Y=100となっています。
 このように親パネル上の位置ではなく、常にルートパネルの位置で座標が返されます。
 親パネルの座標が欲しい場合は、残念ながら自分でビヘイビアを作るしかありません。
 そんなわけで、次回は親パネル上の位置を取得できるMouseDragElementBehaviorを自作してみます。    
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

カレンダー
09 | 2018/10 | 11
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
全記事表示リンク

全ての記事を表示する

カテゴリ
タグリスト

月別アーカイブ
11  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09 
最新記事
リンク
最新コメント
検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。