Domanda

Ho usato Avalondock (2.0) per qualche tempo, essendo la chiave per la gestione dei documenti in un IDE. Nell'ultimo mese circa, ho notato che alt gli ornamenti chiave non vengono più visualizzati per i comandi all'interno di Avalondock, sebbene i comandi dei tasti ALT siano eseguiti come previsto. Vedere l'immagine qui sotto dove gli ornamenti del tasto ALT vengono visualizzati nel menu, ma non per i pulsanti all'interno AVALONDOCK:

No Alt Keys

Cosa è particolarmente interessante su questo problema, che sembra essere attivato da un'impostazione ambientale o condizione.

Come dimostrato in questo video (alle 2:07), il Gli ornamenti del tasto ALT stanno lavorando per un controllo all'interno di Avalondock. Ma, se ora uso lo stesso eseguibile che ho usato in quel video, gli ornamenti del tasto ALT non funzionano.

Attualmente sto usando Build 2.0.1746, ma ho anche provato Build 2.0.2000 (con lo spazio dei nomi Xceors) e ho trovato lo stesso problema. Ho anche provato la versione confezionata con il xceset Extended WPF Toolkit e ha scoperto che il problema persiste.

Ho anche costruito un'applicazione di test molto semplice che carica un paio di documenti di tipo Item, in cui Item è una classe semplice con una proprietà 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>
.

Anche con questa semplice applicazione, i Alt vengono visualizzati gli ornamenti del tasto per il pulsante Test al di fuori di Avalondock, ma non per i pulsanti ClickMe per i controlli all'interno di Avalondock.

Ho anche pubblicato il problema qui sul sito di Avalondock Codeplex, ma sembra esserci Pochissima attività di risposta. Ho anche pubblicato il problema qui sul sito esteso Toolkit Codeplex.

Qualche idea su come correggere o lavorare alternativa a questo problema?

È stato utile?

Soluzione

Sembra che questo sia risolto con la prossima versione di Avalondock.

Nel frattempo, il seguente comportamento misto è una soluzione 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 });
    }
}
.

Utilizzare questo da XAML aggiungendo quanto segue all'elemento di root del DataTemplate per il LayoutItemTemplate di Avalondock:

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

Questa soluzione alternativa utilizza i dettagli dell'implementazione interna del WPF per ri-introdurre il comportamento ALT sotto l'albero logico Avalondock rotto.Quindi, non vedo l'ora di poterlo zappare dal mio codice quando l'annuncio stesso è fisso!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top