2016-07-05 3 views
0

Я работаю над окном WPF с ComboBox и столкнулся с проблемой ужасного доступа. Через мой google-fu я обнаружил, что могу отключить его с помощью следующего кода;Невозможно отключить свойство RecognizesAccessKey для выпадающего списка ComboBox

<Grid.Resources> 
    <Style TargetType="{x:Type ContentPresenter}"> 
     <Setter Property="RecognizesAccessKey" Value="False"/> 
    </Style> 
</Grid.Resources> 

Это работает достаточно хорошо, когда выбран элемент, он теперь показывает подчеркивание и мне не нужно беспокоиться о каких-либо .Replace(...) вызовов в коде позади. Проблема в том, что он работает только для выбранного элемента, а все остальные элементы скрыты.

На картинке ниже, я выбрал AU-15003\SQLEXPRESS_2014 (первоначально подчеркивание было скрыто), подчеркивание было показано, когда выпадающий список закрыт. Затем я снова открыл раскрывающийся список, и символ подчеркивания остался для этого элемента. Остальные позиции по-прежнему не имеют подчеркивания (SQLEXPRESS2008 следует тому же шаблону).

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

enter image description here

ответ

1

Я не уверен, что вы пытаетесь достичь здесь, но я могу с уверенностью сказать вам, почему неявные стили, ориентированные ContentPresenter, как правило, не работает, как ожидалось.

Правило состоит в том, что шаблоны (ControlTemplates, а также DataTemplates) являются границами для применения неявных стилей, то есть неявный стиль, определенный вне шаблона, не будет применяться к элементам внутри одного. Есть одно исключение из этого правила - если целевой тип происходит от Control, стиль будет применяться даже внутри шаблонов. И вы можете легко проверить, что ContentPresenter не происходит от Control. Кроме того, вопрос ContentPresenter (тот, который отображает элемент в раскрывающемся списке ComboBox), находится в шаблоне ComboBoxItem.

Теперь я не могу сделать что-нибудь достаточно конкретное, чтобы воспроизвести проблему в коде, вы в курсе, но я могу посоветовать вам о том, как настроить ContentPresenter в ComboBox раскрывающемся меню - Ваш лучший выбор, чтобы поставить заказ ComboBox.ItemTemplate :

<ComboBox (...)> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <ContentPresenter Content="{Binding}" RecognizesAccessKey="False" /> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

Если вы хотите получить более общее решение (тот, который напоминает вашу попытку), вы можете создать неявный стиль ориентации ComboBox и установка ComboBox.ItemTemplate свойства аналогичным образом:

<Grid.Resources> 
    <Style TargetType="{x:Type ComboBox}"> 
     <Setter Property="ItemTemplate"> 
      <Setter.Value> 
       <DataTemplate> 
        <ContentPresenter Content="{Binding}" RecognizesAccessKey="False" /> 
       </DataTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Grid.Resources> 
+0

Ах, опасения google-fu. Это научит меня заглядывать в то, почему, а не просто исправить это. Ваше первое решение сработало для меня. У меня есть некоторый пользовательский стиль с помощью материального дизайна, и второе общее решение раздели стиль. – Trent

Смежные вопросы