2016-07-05 64 views
0

我正在使用ComboBox在WPF窗口上工作,遇到了可怕的訪問密鑰問題。通過我的google-fu,我發現我可以用下面的代碼關閉它;無法爲ComboBox下拉菜單禁用RecognizesAccessKey屬性

<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的模板中。

現在,我不能做出來不夠具體,從您發佈的代碼重現您的問題什麼,但我可以如何在ComboBox下拉捏捏ContentPresenter勸你 - 你最好的選擇是提供定製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