WPF: Как предотвратить флажок. Провертное событие было выпущено для Combobox в качестве Togglebutton?

StackOverflow https://stackoverflow.com/questions/5849353

Вопрос

У меня есть много элементов управления в окне, включая флажки и комбинированные. Я хочу отслеживать флажок.

<Grid CheckBox.Checked="OnModified" CheckBox.Unchecked="OnModified">

Проблема в том, что то же событие также запускается Combobox сразу после щелчка мыши по элементу. Я думал, что мой обработчик событий должен запечатлеть только флажок, а не Togglebutton's. Я что -нибудь пропустил?

РЕДАКТИРОВАТЬ: Как я указал ниже, я думал, что это сработает, потому что я читал Мэтью Макдональдс книга "Pro WPF в C# 2010". На странице 164, он сначала дал этот пример кода:

<StackPanel Button.Click="DoSomething" Margin="5">   
  <Button Name="cmd1">Command 1</Button> 
  <Button Name="cmd2">Command 2</Button> 
  <Button Name="cmd3">Command 3</Button> 
  ... 
</StackPanel>  

Затем он специально отметил:

Примечание. Событие Click фактически определено в классе Buttonbase и унаследовано классом кнопок. Если вы прикрепите обработчик событий к Buttonbase.click, этот обработчик событий будет использоваться при нажатии какого-либо управления, полученного из путонбазы (включая кнопку, Radiobutton и флажки). Если вы прикрепите обработчик событий к Button.click, он используется только для объектов кнопок.

Теперь я неправильно понял его, или его записка неверна?

Это было полезно?

Решение

На самом деле нет отдельного CheckBox.Checked мероприятие. Если вы посмотрите на эту страницу:

и найти Checked событие вы увидите, что оно унаследовано от ToggleButton так ToggleButton.Checked а также CheckBox.Checked два разных имена для одного и того же события.

Поскольку вы подписываетесь на событие «подстановочного знака», в случае обработчика событий вы можете проверить отправителя или источника, чтобы увидеть вас, это тот, который вас интересует.

Редактировать:

Чтобы ответить на ваш дополнительный вопрос, касающийся цитаты книги, я думаю, что цитата, по крайней мере, вводит в заблуждение. Вот встречный пример, который показывает CheckBox реагируя на Button событие, хотя CheckBox не получен из Button:

<CheckBox Button.Click="CheckBox_Click"/>

Конечно нет Button.Click событие, только ButtonBase.Click Событие, но это суть цитаты. Если бы цитата была буквально правдой, либо этот синтаксис не был бы разрешен, либо это событие не было бы стрельбы, ни одно из которых не было правдой.

Другие советы

Это потому, что вы устанавливаете событие в сетке, поэтому любые дети, содержащие сеть, в которой есть Checkbox.Checked Маршрутированное событие ответит на мероприятие. В вашем случае случается, что ComboboxItem Использует то же маршрутизированное событие (и я уверен, что другие элементы управления, вероятно, также повторно используют его)

Самый простой способ справиться с этим - добавить тест на ваш обработчик, что -то вроде этого:

private void OnModified(object sender, EventArgs args)
{
    if ( sender is CheckBox )
    {
        CheckBox ckBox = sender as CheckBox;
        // do stuff with ckBox
    }
}

Это происходит потому, что оба события пузыривают дерево элементов, и оба достигают вашего обработчика (CheckBox наследует ToggleButton, следовательно CheckBox.Checked а также ToggleButton.Checked на самом деле те же события). Вы не можете предотвратить это. Вместо этого вы можете проверить, подняло ли событие CheckBox. Анкет Это можно сделать так:

private void OnModified(object sender, RoutedEventArgs e)
{
    // Filter the event by its source
    if (e.Source.GetType() != typeof(CheckBox))
        return;

    // Your handling code         
}

Я автор «Pro WPF в C# 2010», и я могу подтвердить, что текст из коробки с заметками подпадает под «Что я курил?» категория. Нет никакого различия между событием Click, основанным на том, как вы относитесь к нему в своей наценке.

Мэтью

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top