AvalonDock теперь теряет украшения Alt Key
Я использую AvalonDock (2.0) уже некоторое время, будучи ключевым для управления документами в IDE. В последний месяц или около того я заметил, что украшения клавиш Alt больше не отображаются для элементов управления в AvalonDock, хотя команды клавиш Alt выполняются, как и ожидалось. Посмотрите на изображение ниже, где в клавиатуре отображаются надписи Alt, но не для кнопок внутри AvalonDock:
Что особенно интересно в этой проблеме, так это то, что она вызвана условиями или условиями окружающей среды.
Как показано в этом видео (в 2:07), украшения Alt Key работают для элемента управления в AvalonDock. Но, если я сейчас использую тот же самый исполняемый файл, который использовал в этом видео, украшения с альт-ключами не работают.
В настоящее время я использую сборку 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.
Я также разместил эту проблему здесь, на сайте кодового комплекса AvalonDock, но, похоже, активность отклика очень мала. Я также разместил эту проблему здесь на сайте Codeplex Extended Toolkit.
Любые идеи о том, как исправить или обойти эту проблему?
1 ответ
Звучит так, как будто это будет исправлено в следующей версии AvalonDock.
В то же время, следующее поведение Blend - это обходной путь:
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, чтобы повторно представить поведение Alt ниже сломанного логического дерева AvalonDock. Итак, я буду с нетерпением ждать возможности убрать его из моего кода, когда сама AD будет исправлена!