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 바인딩 기반 솔루션을 구현했습니다.
뷰 모델에서 특성 정의 - 선택한 int 유형
보기에서 속성 바인딩
<TabControl x:Name="TabsCandidate" VerticalAlignment="Stretch" TabStripPlacement="Top" SelectedIndex="{Binding Selected}"
private int _selected;
public int Selected { get { return _selected; } set { _selected = value; OnPropertyChanged("Selected"); } }
값을 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
.
대신 이벤트 기반 솔루션을 구현했습니다.
- 내 탭 컨트롤의 이름 값을 추가합니다.
- 에서 이트생성파 - 에서클는정생의래다에서 .
PubSubEvent<T>
(T는 매개 변수의 유형입니다. 제 경우에는 TabItem>에 바인딩된 ViewModel 개체였습니다. - 탭을 선택할 때마다 해당 이벤트 게시
- .cs 하고 "View.cs "을 설정합니다.
TabControl.SelectedItem
으로 프그래로사를 사용하여FindName
.
언급URL : https://stackoverflow.com/questions/7929646/how-to-programmatically-select-a-tabitem-in-wpf-tabcontrol
'programing' 카테고리의 다른 글
Eclipse 기본 작업 공간을 변경하는 방법은 무엇입니까? (0) | 2023.05.07 |
---|---|
스크립트 파일의 시작 부분에 #!/bin/bash를 입력해야 하는 이유는 무엇입니까? (0) | 2023.05.07 |
연결이 끊긴 멀티플렉서를 만들기 위해 redis 서버에 연결할 수 없습니다. (0) | 2023.05.07 |
Bash 셸 스크립트에 디렉토리가 있는지 확인하려면 어떻게 해야 합니까? (0) | 2023.05.02 |
XCode 명령줄 도구가 설치되어 있는지 확인하는 방법은 무엇입니까? (0) | 2023.05.02 |