programing

WPF 탭 컨트롤에서 탭 항목을 프로그래밍 방식으로 선택하는 방법

bestprogram 2023. 5. 7. 12:01

WPF 탭 컨트롤에서 탭 항목을 프로그래밍 방식으로 선택하는 방법

WPF Tab Control에서 특정 Tab Item을 선택하는 방법을 알고 싶습니다.

나는 이것들을 시도했지만 소용이 없었습니다!

MyTabControl.SelectedIndex = x

MyTabControl.SelectedItem = MyTabItem

MyTabControl.SelectedValue = MyTabItem

MyTabItem.IsSelected = True

@Chris가 말했듯이, 처음 세 가지 중 어떤 도 효과가 있어야 하고 @Phyxx가 말하는 것처럼, 그것이 항상 실제로 효과가 있는 것은 아닙니다.문제는 재산 변경 순서에 대한 미묘한 점입니다.이 문제를 해결하려면 WPF가 자체 시간에 탭 선택 코드를 호출하도록 해야 합니다.

Dispatcher.BeginInvoke((Action)(() => MyTabControl.SelectedIndex = x));

이것은 Phyxx의 타이머가 하는 것과 똑같지만, 약간 덜 극단적인 방식으로 합니다.

세 번째 예를 제외한 모든 예는 정확하며 효과가 있을 것입니다.문제는 다른 위치에 있어야 합니다.설정 후 아이템을 재설정하거나 코드가 호출되지 않을 수 있습니다.

유효한

MyTabControl.SelectedIndex = x   
MyTabControl.SelectedItem = MyTabItem    
MyTabItem.IsSelected = True 

무효한

MyTabControl.SelectedValue = MyTabItem 

탭 항목을 반복하고 탭을 선택하려면 다음을 설정합니다.

tabItem.IsSelected = true

바인딩 변경으로 인해 다른 장소가 있으면 문제가 발생합니다.그렇지 않으면 위의 코드가 작동해야 합니다.

위에서 언급되지 않은 한 가지 사항:

탭 항목에 "이름" 속성이 설정되어 있지 않기 때문에 이러한 작업이 수행되지 않습니다.프로그래밍 방식으로 탐색하려는 탭 컨트롤의 각 탭 항목에는 위의 코드가 작동하려면 이름 속성이 설정되어 있어야 합니다.

<tabItem Name="tab1"></tabItem>

탭 패널을 실용적으로 선택하기 위한 작은 MVVM 바인딩 기반 솔루션을 구현했습니다.

  1. 뷰 모델에서 특성 정의 - 선택한 int 유형

  2. 보기에서 속성 바인딩

    <TabControl
        x:Name="TabsCandidate" 
        VerticalAlignment="Stretch" 
        TabStripPlacement="Top"
        SelectedIndex="{Binding Selected}"
    
  3. private int _selected;

    public int Selected
    {
        get { return _selected; }
        set
        {
            _selected = value;
            OnPropertyChanged("Selected");
        }
    }
    
  4. 값을 Select property로 설정합니다. 바인딩을 사용하면 탭 패널이 활성화됩니다.

    상위 탭 패널 내부의 탭 패널에서 탐색하려면 이 솔루션이 작동합니다. 필요한 것은 컨트롤의 데이터 컨텍스트에 액세스하여 설정하는 것입니다.

    // set the property value of the view model which points the index of the tab controller.
    ((CandidateViewModel)((System.Windows.FrameworkElement)candidateTab.Content).DataContext).Selected = CandidateLogTabIndex;
    

설정을 시도합니다.MyTabControl.SelectedIndex = x의 경우에는DataContextChanged또는Loaded사용자 UI.이것이 효과가 있기를 바랍니다.

는 효과가 있어야 하는 모든 방법을 시도했지만, 당신처럼 실제로 선택한 탭을 변경한 것은 없습니다.결국 탭 선택 코드를 입력하여 작동하게 되었습니다.DispatcherTimer째깍째깍

       DispatcherTimer switchTabTimer = new DispatcherTimer();
       switchTabTimer.Interval = new TimeSpan(0);
       switchTabTimer.Tick += (object timerSender, EventArgs timerE) =>
       {
           myTabControl.SelectedIndex = 0;
           switchTabTimer.Stop();
       };
       switchTabTimer.Start(); 

탭의 인덱스를 모르는 경우(아마도 모를 것입니다). TabIndex) 사용:

    private async Task ChangeTabTo(TabItem wantedTab) {
        int index = 0;
        for (var i = 0; i < TabControl.Items.Count; i++) {
            var tab = TabControl.Items[i];
            var t = tab as TabItem;
            if (t == null) continue;
            if (t == wantedTab) {
                index = i;
                break;
            }
        }

        await Dispatcher.BeginInvoke((Action)(() => TabControl.SelectedIndex = index));
    }

또는 탭에 대한 참조를 유지하지 않으려면 이름으로 검색하도록 수정합니다.

누군가에게 도움이 될 수도 있기 때문에 저는 그 주제에 2센트를 투자하고 있습니다.저는 Prims 프레임워크와 함께 WPF를 사용하고 있습니다.

▁binding로 바인딩하여 할 수 .SelectedItem또는SelectedIndex효과가 없었습니다. 또한설수없니다습었할정나다▁unable니▁set를 설정할 수 .TabItem.Name부로부의가 내에서 합니다.TabControl.ItemTemplate또는TabControl.ContentTemplate.

대신 이벤트 기반 솔루션을 구현했습니다.

  1. 내 탭 컨트롤의 이름 값을 추가합니다.
  2. 에서 이트생성파 - 에서클는정생의래다에서 .PubSubEvent<T>(T는 매개 변수의 유형입니다. 제 경우에는 TabItem>에 바인딩된 ViewModel 개체였습니다.
  3. 탭을 선택할 때마다 해당 이벤트 게시
  4. .cs 하고 "View.cs "을 설정합니다.TabControl.SelectedItem으로 프그래로사를 사용하여FindName.

언급URL : https://stackoverflow.com/questions/7929646/how-to-programmatically-select-a-tabitem-in-wpf-tabcontrol