Pergunta

Já uso o AvalonDock (2.0) há algum tempo, sendo fundamental para gerenciar documentos em um IDE.No último mês ou assim, notei que Alt. adornos de teclas não aparecem mais nos controles do AvalonDock, embora o Alt. os comandos principais estão sendo executados conforme o esperado.Veja a imagem abaixo onde o Alt. os principais adornos estão aparecendo no menu, mas não nos botões dentro do AvalonDock:

No Alt Keys

O que é particularmente interessante nesta questão é que ela parece ser desencadeada por um ambiente ou condição ambiental.

Como demonstrado neste vídeo (às 2:07), os adornos da tecla alt estão funcionando para um controle dentro do AvalonDock.Mas, se eu usar agora o mesmo executável que usei naquele vídeo, os adornos da tecla Alt não funcionarão.

Atualmente estou usando o build 2.0.1746, mas também tentei o build 2.0.2000 (com o namespace Xceed) e encontrei o mesmo problema.Eu também tentei a versão empacotada com o Kit de ferramentas WPF estendido Xceed, e descobri que o problema persiste.

Também construí um aplicativo de teste muito simples que carrega alguns documentos do tipo Item, onde Item é uma classe simples com um Name propriedade:

<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>

Mesmo com esta aplicação simples, o Alt. principais adornos aparecem para o Test botão fora do AvalonDock, mas não para o ClickMe botões para os controles do AvalonDock.

Eu também postei o problema aqui no site codeplex AvalonDock, mas parece haver muito pouca atividade de resposta.Eu também postei o problema aqui no site do codeplex do Extended Toolkit.

Alguma idéia de como corrigir ou solucionar esse problema?

Foi útil?

Solução

Parece que isso será corrigido na próxima versão do AvalonDock.

Enquanto isso, o seguinte comportamento do Blend é uma solução alternativa:

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 });
    }
}

Use isso do XAML adicionando o seguinte ao elemento raiz do seu DataTemplate para o AvalonDock LayoutItemTemplate:

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

Esta solução alternativa usa detalhes de implementação interna do WPF para reintroduzir o Alt. comportamento abaixo da árvore lógica quebrada do AvalonDock.Portanto, estarei ansioso para poder eliminá-lo do meu código quando o próprio AD for corrigido!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top