Вопрос

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

No Alt Keys

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

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

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

Я также создал очень простое тестовое приложение, которое загружает пару документов типа 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>

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

Я также опубликовал эту проблему здесь на сайте AvalonDock codeplex, но, по-видимому, активность реагирования очень мала.Я также опубликовал эту проблему здесь на сайте расширенного инструментария codeplex.

Есть какие-нибудь идеи о том, как исправить или обойти эту проблему?

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

Решение

Похоже, что это будет исправлено в следующей версии 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 для АвалонДока LayoutItemTemplate:

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

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

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