これは、 RibbonTab IsSelected not workingの最小化されたエラーの再現です。
デモンストレーション アプリケーションのメイン ウィンドウを次に示します。
アプリケーション メニュー (青い矢印) をクリックすると、メニューがポップアップします。
メインビューをクリックすると、タブ項目がタブパネルに追加されます。
「メインビュー」は、タブのヘッダーとタブ項目の内容の両方であり、奇妙なことではありません。
追加のビューもクリックすると、次のようになります。
タブが表示され、余分なものがリボンに表示されていることがわかります。2 つのタブパネル タブを切り替えると、追加の RibbonTab は「追加ビュー」が選択されている場合にのみ表示されます。
ここで、追加の RibbonTab が表示されるように「追加ビュー」タブを選択し、テキスト ボックスをクリックしてその中に点滅するカーソルを表示し、ctrl+TAB を数回押して要素をタブ オーダーでナビゲートすると、すぐに次のようになります。ヘッダー「extra view」が再度選択されたタブ。追加の RibbonTab は、予想とは異なって見えます。
残っているのは「extra tab」というタブ テキストだけで、テキスト ボックスはもうありません。なぜだめですか?
タブパネル (「メイン ビュー」と「追加ビュー」を表示) のタブをクリックすると、「追加タブ」は「追加ビュー」が選択されている場合にのみ表示されます。これは予期された動作です。ただし、テキスト ボックスとリボンのタブ区切り文字予想外にもうありません。
RibbonTab の可視性は、TabPanel で選択された TabItem のタイプにバインドされ、タブ項目のタイプが ExtraView の場合は Visibility.Visible を返すが、タイプがそれ以外 (MainView など) の場合は返されないコンバーターを使用します。
タブ項目のタイプが ExtraView の場合に true を返すコンバータを使用して、RibbonTab の IsSelected プロパティも選択されたタブ項目にバインドされます。
これは、前述のように、メニュー タブが単なる「追加タブ」以上のものになるプログラムの最小限の例であるため、タブパネル コンテンツのタイプが正しい場合に選択されることが重要です。これは、(可視性に加えて) IsSelected が必要であることを強調するために言います。
どんな助けでも大歓迎です。
MainWindow.xaml:
<RibbonWindow x:Class="TestProblematicRibbons.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:test="clr-namespace:TestProblematicRibbons"
xmlns:Converters="clr-namespace:TestProblematicRibbons.Converters"
Height="300" Width="350">
<RibbonWindow.DataContext>
<test:MainWindowViewModel/>
</RibbonWindow.DataContext>
<RibbonWindow.Resources>
<Converters:ExtraRibbonTabBooleanConverter x:Key="ExtraRibbonTabBoolean" />
<Converters:ExtraRibbonTabVisibilityConverter x:Key="ExtraRibbonTabVisibility" />
</RibbonWindow.Resources>
<DockPanel>
<Ribbon DockPanel.Dock="Top">
<Ribbon.ApplicationMenu>
<RibbonApplicationMenu>
<RibbonApplicationMenuItem Header="main view"
Command="{Binding CreateMainViewCommand}"/>
<RibbonApplicationMenuItem Header="extra view"
Command="{Binding CreateExtraViewCommand}"/>
</RibbonApplicationMenu>
</Ribbon.ApplicationMenu>
<RibbonTab Header="extra tab"
IsSelected="{Binding SelectedTab, Mode=OneWay, Converter={StaticResource ExtraRibbonTabBoolean}}"
Visibility="{Binding SelectedTab, Mode=OneWay, Converter={StaticResource ExtraRibbonTabVisibility}}">
<RibbonGroup>
<RibbonTextBox />
</RibbonGroup>
</RibbonTab>
</Ribbon>
<TabControl
ItemsSource="{Binding Tabs}" SelectedItem="{Binding SelectedTab}" />
</DockPanel>
</RibbonWindow>
MainWindowModel.cs:
using System.Collections.ObjectModel;
using System.Windows.Controls;
using System.Windows.Input;
using ReactiveUI;
namespace TestProblematicRibbons
{
public class MainWindowViewModel: ReactiveObject
{
private ObservableCollection<TabItem> _tabs
= new ObservableCollection<TabItem>();
public ObservableCollection<TabItem> Tabs
{
get { return _tabs; }
}
private TabItem _SelectedTab;
public TabItem SelectedTab
{
get { return _SelectedTab; }
set { this.RaiseAndSetIfChanged(x => x.SelectedTab, value); }
}
public ICommand CreateMainViewCommand
{ get { return new ActionCommand(CreateMainView); } }
public ICommand CreateExtraViewCommand
{ get { return new ActionCommand(CreateExtraView); } }
private void CreateMainView()
{
var view = new MainView();
AddTab(view, "main view");
}
private void CreateExtraView()
{
var view = new ExtraView();
AddTab(view, "extra view");
}
private void AddTab(UserControl view, string header)
{
var tab = new TabItem();
tab.Header = header;
tab.Content = view;
_tabs.Add(tab);
SelectedTab = tab;
}
}
}
ExtraRibbonTabBooleanConverter:
using System;
using System.Globalization;
using System.Windows.Controls;
using System.Windows.Data;
namespace TestProblematicRibbons.Converters
{
public class ExtraRibbonTabBooleanConverter: IValueConverter
{
public object Convert
(object value, Type targetType, object parameter, CultureInfo culture)
{
var item = value as TabItem;
return item != null && item.Content is ExtraView;
}
public object ConvertBack
(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
ExtraRibbonTabVisibilityConverter:
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
namespace TestProblematicRibbons.Converters
{
public class ExtraRibbonTabVisibilityConverter: IValueConverter
{
public object Convert
(object value, Type targetType, object parameter, CultureInfo culture)
{
var item = value as TabItem;
return item != null && item.Content is ExtraView
? Visibility.Visible
: Visibility.Collapsed;
}
public object ConvertBack
(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
MainView と ExtraView は、それぞれ「メイン ビュー」と「追加ビュー」を表示するラベルが付いた UserControl: の 2 つだけなので、ここにそれらのコードを貼り付ける意味はほとんどありません。