2013-11-17 3 views
4

Я уже некоторое время использую AvalonDock (2.0), являясь ключом к управлению документами в среде IDE. В последний месяц или около того, я заметил, что Alt ключевых украшений больше не отображаются для элементов управления в AvalonDock, хотя команды клавиш Alt выполняются, как ожидалось. Смотрите рисунок ниже, где Alt ключевых украшения показываются в меню, но не для кнопок внутри AvalonDock:AvalonDock теперь теряет Alt Key Adornments

No Alt Keys

Что особенно интересно об этой проблеме, что, как представляется, вызвано окружающей среды или состояния.

Как показано в этом video (в 2:07), украшения для ключей Alt работают для управления в AvalonDock. Но, если я сейчас использую тот же самый исполняемый файл, который я использовал в этом видео, то украшение alt key не работает.

В настоящее время я использую сборку 2.0.1746, но я также попытался создать 2.0.2000 (с пространством имен Xceed) и нашел ту же проблему. Я также попробовал версию, упакованную с Xceed Extended WPF Toolkit, и обнаружил, что проблема не устранена.

Я также построил очень простое тестовое приложение, которое загружает несколько документов типа Item, где Item является простой класс с Name свойством:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication1" 
     xmlns:avalonDock="clr-namespace:Xceed.Wpf.AvalonDock;assembly=Xceed.Wpf.AvalonDock" 
     xmlns:avalonDockLayout="clr-namespace:Xceed.Wpf.AvalonDock.Layout;assembly=Xceed.Wpf.AvalonDock" 
     xmlns:avalonDockControls="clr-namespace:Xceed.Wpf.AvalonDock.Controls;assembly=Xceed.Wpf.AvalonDock" 
     Title="MainWindow" Height="500" Width="500"> 
    <Window.Resources> 
     <ResourceDictionary> 
      <DataTemplate DataType="{x:Type local:Item}"> 
       <StackPanel Orientation="Vertical"> 
        <Label Content="Item:" /> 
        <TextBox Text="{Binding Name}"/> 
        <Button Content="_ClickMe" /> 
       </StackPanel> 
      </DataTemplate> 
     </ResourceDictionary> 
    </Window.Resources> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*"></RowDefinition> 
      <RowDefinition Height="Auto"></RowDefinition> 
     </Grid.RowDefinitions> 
     <avalonDock:DockingManager Grid.Row="0" DocumentsSource="{Binding}"> 
      <avalonDockLayout:LayoutRoot> 
       <avalonDockLayout:LayoutPanel Orientation="Horizontal"> 
        <avalonDockLayout:LayoutDocumentPane/> 
       </avalonDockLayout:LayoutPanel> 
      </avalonDockLayout:LayoutRoot> 
     </avalonDock:DockingManager> 
     <Button Grid.Row="1" Content="_Test" /> 
    </Grid> 
</Window> 

Даже с помощью этого простого применения, Alt ключевые украшения отображаются для кнопки Test за пределами AvalonDock, но не для кнопок ClickMe для органов управления в AvalonDock.

Я также разместил вопрос here на сайте Codealx AvalonDock, но, похоже, очень мало активности отклика. Я также разместил вопрос here на сайте Extended Toolkit codeplex.

Любые идеи о том, как исправить или обмануть эту проблему?

+1

Если у вас есть подписка на Xceed, возможно, стоит обратиться к их людям поддержки. Вы также можете попробовать собственный форум: http://xceed.com/CS/forums/86/ShowForum.aspx –

+0

Спасибо, Ричард, я тоже опубликую на этом форуме и, возможно, получить подписку. –

ответ

2

Звучит так, как будто это будет исправлено с помощью следующей версии AvalonDock.

В то же время, следующее поведение смесь обходной путь:

public class FixKeyboardCuesBehavior : Behavior<UIElement> 
{ 
    private static readonly DependencyProperty ShowKeyboardCuesProperty; 

    static FixKeyboardCuesBehavior() 
    { 
     Type keyboardNavigation = typeof(KeyboardNavigation); 
     var field = keyboardNavigation.GetField("ShowKeyboardCuesProperty", BindingFlags.NonPublic | BindingFlags.Static); 

     Debug.Assert(field != null, "field != null"); 

     ShowKeyboardCuesProperty = (DependencyProperty)field.GetValue(null); 
    } 

    protected override void OnAttached() 
    { 
     base.OnAttached(); 

     Window rootWindow = Window.GetWindow(this.AssociatedObject); 
     if (rootWindow == null) 
     { 
      return; 
     } 

     BindingOperations.SetBinding(
      this.AssociatedObject, 
      ShowKeyboardCuesProperty, 
      new Binding("(KeyboardNavigation.ShowKeyboardCues)") { Source = rootWindow }); 
    } 
} 

Используйте это из XAML, добавив следующую строку в корневой элемент вашего DataTemplate для AvalonDock LayoutItemTemplate:

<i:Interaction.Behaviors 
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"> 
    <my:FixKeyboardCuesBehavior /> 
</i:Interaction.Behaviors> 

В этом обходном пути используются внутренние детали реализации WPF для повторного введения поведения нижележащего логического дерева AvalonDock. Итак, я буду с нетерпением ждать, когда вы сможете его отключить из моего кода, когда сам AD будет исправлен!

+0

Спасибо Олли, я собираюсь вместе с вашим обходным решением. Должен быть исправлен в Xceed Wpf Toolkit 2.3. –

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