Событие кнопки WPF не запускается, когда для Grid установлено значение PreviewMouseMove - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть кнопка в сетке, которая не обнаруживает событие нажатия 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 голосов
/ 23 ноября 2018

В конце это на самом деле работает должным образом.

Для теста я настроил метку, и в случае MouseMove я посылаю позицию мыши на эту метку, lblCoord.Content = Mouse.GetPosition(Application.Current.MainWindow);

InВ случае MouseClick я отправляю lblCoord.Content="MouseClick";

А в случае MouseDown я отправляю lblCoord.Content="MouseDown";.

Я вижу координаты мыши в lblCoord, я вижу MouseClick, но он никогда не отображал MouseDown.

Однако, если я вызываю MessageBox внутри события MouseDown, все работает.Поэтому я предполагаю, что XAML <Grid> PreviewMouseMove="onMouseMove" работает, даже когда я не двигаю мышь, поэтому он все время отправляет координаты на метку и перезаписывает lblCoord.Content="MouseDown"; быстрее, чем я могу его увидеть.

Ответ наэтот вопрос: не работайте с WPF и ожидайте результатов WinForms ... Спасибо всем за потраченное время и усилия!

0 голосов
/ 22 ноября 2018

Я полностью согласен с ними, но также понимаю, что к 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 вам просто нужно указать ItemsSource of ItemsControls (MyObservableCollection).для этого вам больше не нужно все описание кнопок внутри.

Затем, когда вы нажимаете кнопку, чтобы добавить кнопку (в вашем случае), вам просто нужно добавить в код что-то вроде

Button newButton=new Button(); 
newButton.Height=defaultHeight...//width, background etc...
MyObservableCollection.Add(newButton);

еще раз, просто для совета, если WPF / MVVM является новым для вас, я бы посоветовал начать с более простых примеров, сделать небольшой просмотр списка с простыми объектами внутри или со списком.

Могу также посоветовать вамэти сайты: wpf-tutorial.com www.wpftutorial.net

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...