Generalnie sam nie wiem jak Wam to logicznie wytłumaczyć.
Może zacznę od kontekstu. Mam sobie programik, swego rodzaju edytor xml`a. Jak można się domyślać, poszczególne edytowane dokumenty otwierane są w zakładkach TabControl. Jako menu aplikacji używam Ribbona (wersji od Microsoftu). Na ribbonie mam przycisk, który wykonuje akcję na dokumencie z aktualnej zakładki.
Na czym polega problem.
Mam otwarty PlikA. Otwieram teraz PlikB, pojawia się nowa aktywna zakładka. Klikam w nagłówek zakładki A, staje się ona aktywna. Wciskam przycisk na ribbonie i akcja się nie wywołuje, w zamian za to aktywna zostaje zakładka B :)
Zielonego pojęcia nie mam czemu się tak dzieje i liczyłbym na jakiś pomysł z Waszej strony.
Przejrzałem kod pod kątem ręcznego ustawiania aktywnej zakładki - to chyba nie to.
Jako ciekawostki dorzucę jeszcze dwa fakty
* handler podpięty pod żądaną akcję się nie wykonuje
* każda zakładka ma edytor kodu, będący winformsową kontrolką hostowaną w WindowsFormsHost. Jeżeli otworze plikB, przejde do zakładki A i zanim wykonam akcję z ribbona, kliknę w edytorze kodu wszytko jest w jak najlepszym porządku.
Jeżeli macie jakieś sugestie gdzie leży błąd, lub gdzie go szukać chętnie poczytam :) Mnie kończą się pomysły.
Z góry dziękuje!
Edit:
Przepraszam za zwłokę.
Problem jest na tyle dla mnie nietypowy, że ciężko mi zaproponować fragment kodu
W xaml zdefiniowana kontrolka jest w dość oczywisty sposób:
<TabControl Grid.Column="2" Grid.Row="0" Name="tabDocuments" Margin="10" MinHeight="100" MinWidth="100" IsSynchronizedWithCurrentItem="True" IsTabStop="False"
SelectionChanged="TabDocuments_SelectionChanged" PreviewMouseDown="TabDocumenta_PreviewMouseDown" >
<TabControl.Effect>
<DropShadowEffect/>
</TabControl.Effect>
</TabControl>
Od razu zaznaczam, że ten sam efekt ma miejsce jeżeli odepnę widoczne handlery.
Akcja pod przyciskiem:
<r:RibbonCommand x:Key="cmdExecuteTransform"
Executed="CmdExecuteTransform"
CanExecute="CmdExecute_CanExecute"
LabelTitle="{x:Static loc:UIStrings.btnExecuteTransform_Label}"
LabelDescription="{x:Static loc:UIStrings.btnExecuteTransform_Description}"
LargeImageSource="Images/Transform.png"
SmallImageSource="Images/Small/Transform.png"
/>
Metoda podpięta pod Executed nie dochodzi do skutku. Natomiast CanExecute wygląda następująco:
private void CmdExecute_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
if (_currentTabData == null)
{
e.CanExecute = false;
return;
}
if (_currentTabData.Type != Consts.TabType.Designer)
{
_currentTabData.Type = GetTabType(_currentTabData.OpenedFilePath, GetCodeBoxFromActiveTab());
}
e.CanExecute = (_currentTabData.Type == Consts.TabType.XmlDocument) || (_currentTabData.Type == Consts.TabType.XsdDocument) ? false : true;
}
private CodeBox GetCodeBoxFromActiveTab()
{
return GetCodeBoxFromTab((TabItem)tabDocuments.SelectedItem);
}
private CodeBox GetCodeBoxFromTab(TabItem tabItem)
{
if (tabItem != null)
{
CodeBox codeEditor = tabItem.Content as CodeBox;
if (codeEditor != null)
{
return codeEditor;
}
else
{
Designer designer = tabItem.Content as Designer;
if (designer != null)
{
return designer.CodeBox;
}
}
}
return null;
}
Wydaje mi się, że akcja Execute się nie wykonuje, ponieważ w momencie jej wywołania, aktywna jest już spowrotem zakładka z PlikiemB, na której transformacja nie jest zasadna i przycisk powinien być wyłączony.
Tylko, czemu ta zakładka sama się zmienia?