WPF - не удается получить свойства MouseButtonEventArgs.OriginalSource - PullRequest
1 голос
/ 11 апреля 2020

Так что извините, это может быть немного расплывчатым, я на самом деле не программист Windows. Я написал это приложение год go, и оно работало нормально. Пошел обновить и исправить ошибку сегодня, и теперь эта часть не работает. Я предполагаю, что это связано с новой версией VS или чем-то другим, потому что я изменил некоторые несвязанные типы переменных с float на double, чтобы работать с Math.Round (). С тех пор я изменил их обратно и даже перезагрузил старую версию из git, и она все еще не работает.

Что должно произойти: Щелкните правой кнопкой мыши по элементу меню, установите _recentFilesIndex на индекс выбранного Появится всплывающее меню, нажмите «Удалить», и элемент будет удален по индексу из этого списка.

Проблема заключается в следующем: mi должен быть текстом этого пункта меню, который является путем к файл. Теперь он возвращается как null. e.OriginalSource допустимо, при отладке я вижу, что свойства DataContext и Text на самом деле являются путями к файлам. Он не преобразует его в TextBlock, как это было раньше.

Я попытался установить его на e.OriginalSource.DataContext, но теперь я не могу получить доступ к этому свойству. (Честно говоря, не знаю, смог ли я раньше, это был год, и я работал над другими вещами). Установка mi в e.OriginalSource проходит проверку null, но я все еще не могу получить доступ ни к одному из этих свойств. Я получаю только ToString, GetType, GetHashCode и Equals в качестве свойств.

Итак, вопрос в том, как мне получить информацию об элементах меню? Это может быть текст элемента меню, DataContext или индекс элемента меню.

XAML


    <MenuItem Name="mnuRecentLoads" Header="Recent Loads" ItemsSource="{Binding RecentFiles}" Click="mnuRecentLoads_OnClick" MouseRightButtonUp="mnuRecentLoads_OnRMBUp" >
        <MenuItem.ContextMenu>
            <ContextMenu >
                <MenuItem Header="Remove" Click="mnuRemove_OnClick" CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=Parent}" DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"/>
            </ContextMenu >
        </MenuItem.ContextMenu>
    </MenuItem >

CS


    private void mnuRecentLoads_OnRMBUp(object sender, MouseButtonEventArgs e)
    {
        _recentFilesIndex = -1;
        var mi = e.OriginalSource as TextBlock;
        if (mi == null)
            return;

        string path = (string) mi.DataContext;
        _recentFilesIndex = mnuRecentLoads.Items.IndexOf(path);
    }
    private void mnuRemove_OnClick(object sender, RoutedEventArgs e)
    {
        if (_recentFilesIndex < 0)
        {
            _recentFilesIndex = 0;
            return;
        }
        _recentFiles.RemoveAt(_recentFilesIndex);
        mnuRecentLoads.Items.Refresh();
    }

Спасибо за любую помощь, которую вы можете оказать.

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