Entwickler-Ecke

WPF / Silverlight - Adorner disabled RoutedCommands


boombuler - Do 08.05.08 10:11
Titel: Adorner disabled RoutedCommands
Hi,

mir ist folgendes Problem über den Weg gelaufen:
Wenn ich in folgendem Xaml-Code einen Adorner auf das Stackpanel lege und dem Adorner ein Element hinzufüge wie z.B. einen Button und dann auf den Button klicke, wird der "Close"-Button disabled. Wenn ich statt eines RoutedCommands einfach das Click Event registriere funktionierts.


XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
<DockPanel>
    <DockPanel.CommandBindings>
        <CommandBinding Command="ApplicationCommands.Close"
                        CanExecute="CommandBinding_CanExecute"
                        Executed="CommandBinding_Executed" />
    </DockPanel.CommandBindings>
    <ToolBar DockPanel.Dock="Top">
        <Button Command="ApplicationCommands.Close" DockPanel.Dock="Top">Close</Button>
    </ToolBar>
    <StackPanel Name="spAdornMe" />
</DockPanel>



Hat jemand eine Idee dazu?

MfG
Florian


Edit:

Das Problem lässt sich lösen, wenn man von der ToolBar "FocusManager.IsFocusScope" auf "false" setzt.

Grund:
Beim Commandrouting wird die Route für das CanExecuteEvent aufgrund dieser Eigenschaft wie folgt geändert:

Button -> Toolbar -> [Suche nach dem Eltern-Scope: DockPanel -> Window -> AdornerDecorator des Windows] -> AdornerDecorator des Windows -> [Suche nach dem selektierten Element: AdornerLayer -> Adorner -> Element auf dem Adorner] Element auf dem Adorner

Wie man dabei sehen kann hat keins der angesprochenden Ziele ein CommandBinding für das RoutedCommand wodurch CanExecute auf False und Handled auf False gesetzt wird. Dies führt wiederum dazu, dass die OriginalRoute die normalerweise weitergeführt werden würde abgebrochen wird!!!