簡體   English   中英

RibbonTab的WPF IsSelected綁定在ctrl + tab上停止工作

[英]WPF IsSelected binding for RibbonTab stops working upon ctrl+tab

這是RibbonTab IsSelected無法正常工作的最小化錯誤再現。

這是演示應用程序的主窗口:

在此處輸入圖片說明

當我們單擊應用程序菜單(藍色箭頭)時,將彈出一個菜單。

在此處輸入圖片說明

如果單擊主視圖,則選項卡項將添加到選項卡面板。

在此處輸入圖片說明

“主視圖”既是選項卡的標題,又是選項卡項目的內容,這並不奇怪。

如果還單擊其他視圖,則會得到以下信息:

在此處輸入圖片說明

我們可以看到一個選項卡變得可見,並且功能區中顯示了其他內容。 如果我們在兩個選項卡選項卡之間切換,則僅當選擇“額外視圖”時,才顯示額外的RibbonTab。

現在,如果我們選擇“附加視圖”選項卡,以便可以看到額外的RibbonTab,然后單擊文本框,以便在其中閃爍光標,然后按ctrl + TAB兩次以選項卡順序瀏覽元素,我們很快就會再次選擇標題為“額外視圖”的標簽。 這樣,多余的RibbonTab看起來將與我們的預期有所不同。

在此處輸入圖片說明

唯一剩下的就是選項卡文本“額外的選項卡”,該文本框不再存在。 為什么不?

如果我們單擊選項卡面板中的選項卡(顯示“主視圖”和“額外視圖”,則“額外選項卡”僅在選擇“額外視圖”時可見。這是預期的行為。但是,文本框和功能區選項卡定界符不再存在,這是意外的。

RibbonTab的可見性通過返回Visibility的轉換器綁定到TabPanel中選擇的TabItem的類型。如果選項卡項目的類型為ExtraView,則可見;而如果其他類型的項(例如MainView)則不可見。

RibbonTab的IsSelected屬性也綁定到選定的Tabitem,使用一個轉換器,如果選項卡項的類型為ExtraView,則返回true。

如前所述,這是程序的最小示例,其中菜單選項卡將不僅僅是“額外的選項卡”,因此,當選項卡內容的類型正確時,將其變為選中狀態很重要。 我說這是為了強調IsSelected是必需的(除了Visibility)。

任何幫助是極大的贊賞。

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:s,分別顯示“主視圖”和“額外視圖”,因此將代碼粘貼到此處幾乎沒有意義。

在某些情況下,我通過手動實現綁定解決了我的問題。 似乎無法完全依靠結合中的綁定。 他們顯然可以互相打擾!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM