Grid设置了PreviewMouseMove时,WPF按钮事件未触发

时间:2018-11-22 05:43:14

标签: c# wpf

我在网格上没有检测到PreviewMouseLeftDown单击事件的按钮。 经过测试,我发现问题出在<Grid PreviewMouseMove="onMouseMove" >

如果我删除PreviewMouseMove =“ onMouseMove”部分,则会检测到MouseDown事件,但是我需要该行代码,因为我还必须仅检测该网格内的鼠标位置。

XAML:

<Grid PreviewMouseMove="onMouseMove" Background="Transparent">
    <ItemsControl Name="btnTableImageList">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Button Content="{Binding Content}"
                        Height="{Binding Height}"
                        Width="{Binding Width}"
                        Tag="{Binding Tag}"
                        Margin="{Binding Margin}"
                        Background="{Binding Background}" 
                        HorizontalAlignment="Center"
                        PreviewMouseLeftButtonDown ="tblButton_MouseDown"
                        PreviewMouseLeftButtonUp ="tblButton_MouseUp"
                        Click="ClickHandlerTableBtn"
                        TextBlock.TextAlignment="Center" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

任何想法都值得欢迎。谢谢!

2 个答案:

答案 0 :(得分:0)

我完全同意他们的观点,但也了解您……WPF和MVVM并不那么“容易”适应,我花了大约一年或更短的时间来学习,仍然有很多东西要学习。 在这种情况下,我只能建议您阅读一些有关WPF,DataBinding和ObservableCollection和ViewModel的教程(这些是您需要知道的关键字)。 1)创建一个ViewModel,您可以在其中定义一个ObservableCollection,ObservableCollection是一种列表,但是使用它可以自动更新View(几乎)。因此,当您启动应用程序时,您将阅读需要显示的按钮列表,然后将它们添加到ObservableCollection

对于您的测试将是这样的:

Button button1=new Button();
Button button2=new Button();

//define all dimensions/parameters of your button

MyObservableCollection.Add(button1);
MyObservableCollection.Add(button2);

然后在XAML中,您只需要指定ItemsControls(MyObservableCollection)的ItemsSource。这样,您就不再需要内部所有按钮的描述。

然后,当您单击添加按钮(针对您的情况)时,只需在类似

之类的代码后面进行编码
Button newButton=new Button(); 
newButton.Height=defaultHeight...//width, background etc...
MyObservableCollection.Add(newButton);

再次提醒您,如果您不是WPF / MVVM的新用户,我建议您从更简单的示例开始,使用内部简单对象或列表框创建一个小的列表视图。

还可以为您建议这些网站: wpf-tutorial.com www.wpftutorial.net

答案 1 :(得分:0)

最后,它实际上可以正常工作。

为了进行测试,我设置了一个标签,并且在MouseMove事件中,我将“鼠标位置”发送到该标签,lblCoord.Content = Mouse.GetPosition(Application.Current.MainWindow);

如果使用MouseClick,我将发送lblCoord.Content="MouseClick";

如果出现MouseDown,我将发送lblCoord.Content="MouseDown";

我可以在lblCoord中看到鼠标坐标,可以看到MouseClick,但是它从未显示MouseDown。

但是,如果我在MouseDown事件中调用MessageBox,则一切正常。因此,我猜想XAML <Grid> PreviewMouseMove="onMouseMove"即使在我不移动鼠标的情况下也能正常工作,因此它一直将坐标发送给Label,并且覆盖lblCoord.Content="MouseDown";的速度比我看到的快。

此问题的答案是:不要与WPF一起使用,并且期望WinForms结果... 感谢大家的时间和精力!