带有MouseDown和MouseEnter的EventToCommand

时间:2015-11-30 15:09:30

标签: c# wpf mvvm eventtocommand

我想用新图像,pixelpainter / mapeditor样式替换初始化画布上的单个图像。目前我设法替换MouseEnter上的图像,但这不是我的目标。我只想在用户将鼠标按钮(可能是MouseEnter)放在图像上方时更改图像。

<DataTemplate>
                            <Image Source="{Binding MapTileImage}" Stretch="Fill" Width="{Binding Width}" Height="{Binding Height}">
                               <i:Interaction.Triggers>
                                    <i:EventTrigger EventName="MouseEnter">
                                        <command:EventToCommand Command="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=DataContext.ChangeTilesCommand}" CommandParameter="{Binding .}" />
                                    </i:EventTrigger>
                                </i:Interaction.Triggers>
                            </Image>
</DataTemplate>

此代码仅适用于事件“MouseEnter”。 MouseDown甚至PreviewMouseDown以及其他事件在这里都不起作用。哪种方式最干净呢?我想保留我的EventToCommand和RelayCommand。

在我的MainViewModel中,我所做的只是:

private RelayCommand<BitmapModel> _changeTileCommand;
        public RelayCommand<BitmapModel> ChangeTilesCommand {
            get { return _changeTileCommand ?? (_changeTileCommand = new RelayCommand<BitmapModel>(UpdateTile)); }
        }

public void UpdateTile(BitmapModel tile) {
           // BitmapModel tile = drag.TileParam;
            if (tile == null) return;
            if (SelectedMapTile == null) return;

            tile.MapTileImage = SelectedMapTile.MapTileImage;
        }

2 个答案:

答案 0 :(得分:0)

你可以用按钮做一个非常简单的解决方法。只需将图像插入按钮,然后使用CommandCommandParameter属性即可。但这只会在LeftMouseButtonUp事件中触发!

<Button Margin="100" BorderThickness="0" 
        Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}"
        Command="..." 
        CommandParameter="...">
    <Image Source="..." Stretch="Fill" 
           Width="{Binding Width}" 
           Height="{Binding Height}" />
</Button>

然后你只需稍微调整按钮的视觉效果,因为按钮应该看起来像“什么都没有”。我已经通过删除边框并通过Style属性将其设置为平面样式。也许this Question有助于将按钮设置得更好一些。

答案 1 :(得分:0)

对于所有那些在5年内磕磕绊绊的灵魂,我就是这样解决的:

    private RelayCommand<BitmapModel> _changeTileCommand;
        public RelayCommand<BitmapModel> ChangeTilesCommand {
            get { return _changeTileCommand ?? (_changeTileCommand = new RelayCommand<BitmapModel>(UpdateTile, CanDraw)); }
        }

private RelayCommand<MouseEventArgs> _drawingCommand;
public RelayCommand<MouseEventArgs> DrawingCommand {
            get { return _drawingCommand ?? (_drawingCommand = new RelayCommand<MouseEventArgs>(MouseDown)); }
}


void MouseDown(MouseEventArgs mouse) {
            if (mouse.LeftButton == MouseButtonState.Pressed) _mouseDown = true;
            else if (mouse.LeftButton == MouseButtonState.Released) _mouseDown = false;
}

bool CanDraw(BitmapModel tile) {
            return _mouseDown;
}

结合使用
<Image.InputBinding>
应该避免将

div与事件结合起来,因为它可能会像我一样打破事情。