6

メイン セクションと、さまざまな TabItems を含む TabControl を持つ LOB アプリケーションを構築しています。保存を押すと、エラーのあるフィールドが強調表示され、エラーのある最初のフィールドにフォーカスが移ります。

最初で唯一のエラーのあるフィールドが未選択のタブにある場合、そのタブは選択され、エラーのあるフィールドは強調表示され、フォーカスされます。しかし、私はこれを機能させることができません。

発生しているように見えるのは、Unselected タブがビジュアル ツリーにないため、所有している TabItem に戻って TabControl で現在選択されている TabItem にすることができないことです。

これをどのように実行できるか\達成できる方法を知っている人はいますか?

4

5 に答える 5

4

TabItem をロードするには:

tabControl.SelectedItem = tabItemOfInterest;
tabControl.UpdateLayout();

これにより、tabItemOfInterest が、TabItem 内に含まれるすべてのコントロールと共に読み込まれます。

以下の行だけでは、tabItemOfInterest はロードされません。

tabControl.SelectedItem = tabItemOfInterest;

しかし、デビッドが誤った制御に到達するために採用したアプローチには非常に興味があります.

于 2011-03-01T18:07:39.920 に答える
1

どのように解決したか (リード アーキテクトに尋ねて)...

1 つのメソッド Activate を持つ Interface ITabActivator を作成します。

TabPageActivator という Grid および ITabActivator から派生したクラスを作成します。そのコンストラクターは、TabITem と TabControl を取ります。

単純な Grid を TabItem.Contents に追加する代わりに、TabPageActivator を追加します。

使用する親検出を変更...

DependencyObject 親 = _Control.Parent;

...VisualTreeHelper を使用する代わりに。

したがって、階層テストをナビゲートすると...

if (親は TabActivator ) (親は ITabActivator).Activate( )

...だからActivateが呼び出されたとき

m_TabControl.SelectedItem = m_TabItem; // コンストラクタ パラメータから。

...そして、タブがネストされている可能性があることを忘れないでください。そのため、階層を上っていく必要があります。

于 2010-05-04T04:10:52.683 に答える
1

私は自分のサイトの 1 つ ( YinYangMoney ) でナビゲーションに TabControls を使用し、タグ名を使用してタブを選択するのに役立ついくつかの拡張メソッドを作成しました。ここにあなたのために働くはずのスニペットがあります.

拡張クラス:

using System;
using System.Linq;
using System.Windows.Controls;

namespace MyApplication
{
    internal static class Extensions
    {
        // Extension for TabControl
        internal static void SelectTab(this TabControl tabControl, this TabItem tabItem)
        {
            if (tabControl == null || tabItem == null)
                return null;

            SelectTab(tabControl, tabItem.Tag);
        }

        // Extension for TabControl
        internal static void SelectTab(this TabControl tabControl, string tabTagName)
        {
            if (tabControl == null)
                return null;

            // Find the TabItem by its Tag name
            TabItem mainTabItem = tabControl.FindByTag(tabTagName);
            if (mainTabItem == null)
                return;

            // Check to see if the tab needs to be selected
            if (tabControl.SelectedItem != mainTabItem)
                tabControl.SelectedItem = mainTabItem;
        }

        // Extension for TabControl
        internal static TabItem FindByTag(this TabControl tabControl, string tagFragment)
        {
            if (tabControl == null || tagFragment == null)
                return null;

            return tabControl.Items
                    .OfType<TabItem>()
                    .Where(item => item.Tag != null && item.Tag.ToString().StartsWithIgnoreCase(tagFragment))
                    .FirstOrDefault();
        }

        // Extension for string
        internal static bool StartsWithIgnoreCase(this string source, string target)
        {
            return source.StartsWith(target, StringComparison.CurrentCultureIgnoreCase);
        }
    }
}

TabControl と TabItems の XAML は次のようになります。

<Controls:TabControl x:Name="x_TabControl">
    <Controls:TabItem Header="Welcome" Tag="/Home/Welcome" x:Name="x_WelcomeTab" />
    <Controls:TabItem Header="FAQ" Tag="/Home/FAQ" />
    <Controls:TabItem Header="Contact Us" Tag="/Home/Contact_Us" />
    <Controls:TabItem Header="Privacy Policy" Tag="/Home/Privacy_Policy" />
    <Controls:TabItem Header="My Account" Tag="/Home/My_Account" />
</Controls:TabControl>

そして、次のように Welcome TabItem を選択できます。

x_TabControl.SelectTab("/Home/Welcome");  

また

x_TabControl.SelectTab(x_WelcomeTab);
于 2010-05-04T04:41:17.330 に答える
1

添付プロパティ TabItem を使用した私のソリューション。クラスTabItemExtender を作成します。

/// <summary>
/// TabItem Extender class with TabItem property
/// </summary>
public class TabItemExtender
{
    #region property getters/setters
    /// <summary>
    /// TabItem attached dependency property
    /// </summary>
    public static readonly DependencyProperty TabItemProperty = DependencyProperty.RegisterAttached("TabItem", typeof(TabItem), typeof(TabItemExtender), null);

    /// <summary>
    /// TabItem Property getter
    /// </summary>
    public static TabItem GetNavigateUri(DependencyObject source)
    {
        return (TabItem)source.GetValue(TabItemExtender.TabItemProperty);
    }

    /// <summary>
    /// TabItem Property setter
    /// </summary>
    public static void SetNavigateUri(DependencyObject target, TabItem value)
    {
        target.SetValue(TabItemExtender.TabItemProperty, value);
    }
    #endregion
}

次に、TabControlロード イベントでこれを行います。

private void ExtendedTabControl_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
    foreach (object item in this.Items)
    {
        var tabItem = item as TabItem;
        if (tabItem != null && tabItem.Content != null)
        {
            var element = (FrameworkElement)tabItem.Content;
            element.SetValue(TabItemExtender.TabItemProperty, tabItem);
        }
    }
}

そして、これはフォーカスを設定する前に:

var element = (UIElement)control;
while (element != null)
{
    //Get TabItem
    var tabItem = (TabItem)element.GetValue(TabItemExtender.TabItemProperty);

    if (tabItem != null)
    {
        if (!tabItem.IsSelected && tabItem.IsEnabled)
        {
            tabItem.IsSelected = true;
            ((TabControl)tabItem.Parent).UpdateLayout();
        }

        break;
    }

    element = (UIElement)VisualTreeHelper.GetParent(element);
}

control.Focus();
于 2012-11-28T18:10:44.747 に答える
0

私は方法を知っていますが、それは醜いです。数ミリ秒間隔で DispatcherTimer を使用する必要があります。Page_Loaded では、タイマーを開始します。次に、ティックごとに、タブ項目の 1 つに IsSelected = true を設定します。次のティックでは、すべてのタブが選択されるまで、次のタブ項目などが選択されます。次に、最初のアイテムをもう一度選択して、タイマーを強制終了する必要があります。これにより、タブ項目のビジュアルが強制的に読み込まれます。

また、この操作中に TabControl を境界線などで覆う必要があります。そうしないと、すべてのタブ項目がすばやくフリックして表示されます。

于 2010-05-03T10:18:35.493 に答える