Question

J'utilise AvalonDock (2.0) depuis un certain temps maintenant, car il est essentiel pour gérer les documents dans un IDE.Au cours du dernier mois, j'ai remarqué que Alt les ornements clés n'apparaissent plus pour les contrôles dans AvalonDock, bien que le Alt les raccourcis clavier s'exécutent comme prévu.Voir l'image ci-dessous où le Alt les ornements clés apparaissent dans le menu, mais pas pour les boutons à l'intérieur d'AvalonDock :

No Alt Keys

Ce qui est particulièrement intéressant à propos de ce problème, c'est qu'il semble être déclenché par un contexte ou une condition environnementale.

Comme démontré dans ce vidéo (à 2:07), les ornements de la touche alt fonctionnent pour un contrôle au sein d'AvalonDock.Mais si j'utilise maintenant le même exécutable que celui utilisé dans cette vidéo, les ornements de la touche Alt ne fonctionnent pas.

J'utilise actuellement la build 2.0.1746, mais j'ai également essayé la build 2.0.2000 (avec l'espace de noms Xceed) et j'ai trouvé le même problème.J'ai également essayé la version fournie avec le Boîte à outils WPF étendue Xceed, et j'ai constaté que le problème persistait.

J'ai également construit une application de test très simple qui charge quelques documents de type Item, où Item est une classe simple avec un Name propriété:

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

Même avec cette application simple, le Alt des ornements clés apparaissent pour le Test bouton en dehors d'AvalonDock, mais pas pour le ClickMe boutons pour les commandes dans AvalonDock.

J'ai également posté le problème ici sur le site codeplex d'AvalonDock, mais il semble y avoir très peu d'activité de réponse.J'ai également posté le problème ici sur le site codeplex Extended Toolkit.

Avez-vous des idées sur la façon de corriger ou de contourner ce problème ?

Était-ce utile?

La solution

Il semble que cela sera corrigé avec la prochaine version d'AvalonDock.

En attendant, le comportement Blend suivant constitue une solution de contournement :

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

Utilisez-le à partir de XAML en ajoutant ce qui suit à l'élément racine de votre DataTemplate pour l'AvalonDock LayoutItemTemplate:

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

Cette solution de contournement utilise les détails d'implémentation internes de WPF pour réintroduire le Alt comportement sous l’arborescence logique AvalonDock cassée.J'aurai donc hâte de pouvoir le supprimer de mon code lorsque AD lui-même sera corrigé !

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top