如何在 wpf c# 中单击按钮时打开 window 中的特定部分
how to open specific section in window on button click in wpf c#
我想在点击另一个 window 的按钮时打开一个 window,然后转到那个 window 中的特定选项卡。假设新 window (tabsWindow) 有 3 个选项卡 - tab1、tab2 和 tab3,我在主 window (buttonsWindow) btn1、btn2 和 btn3 上有 3 个按钮。所有三个选项卡都在一个 window 上,所有三个按钮都在另一个 window 上。单击 btn1 时,应从 tabsWindow 打开 tab1。在 btn2_Click,tab2 应该打开。我听说过 RoutedCommand 但并不擅长。给我建议任何其他可能或更简单的方法。
我使用 MVVM 模式制作了一个玩具样本。
您可以在 GitHub.
中查看完整源代码
ButtonsWindow.xaml
我用了Command
,把Button
对象交给了CommandParameter
给使用 Button
.
的 Content 指定 TabControl
的 SelectedIndex
<UniformGrid Columns="3">
<Button Margin="50" Content="1" Command="{Binding BtnClick}" CommandParameter="{Binding RelativeSource={RelativeSource Self}}"/>
<Button Margin="50" Content="2" Command="{Binding BtnClick}" CommandParameter="{Binding RelativeSource={RelativeSource Self}}"/>
<Button Margin="50" Content="3" Command="{Binding BtnClick}" CommandParameter="{Binding RelativeSource={RelativeSource Self}}"/>
</UniformGrid>
TabsWindow.xaml
<Grid>
<TabControl x:Name="tab" Width="300" Height="300">
<TabItem Header="Tab1">
<TextBlock TextAlignment="Center" VerticalAlignment="Center" Text="Tab1" FontSize="20" />
</TabItem>
<TabItem Header="Tab2">
<TextBlock TextAlignment="Center" VerticalAlignment="Center" Text="Tab2" FontSize="20" />
</TabItem>
<TabItem Header="Tab3">
<TextBlock TextAlignment="Center" VerticalAlignment="Center" Text="Tab3" FontSize="20" />
</TabItem>
</TabControl>
</Grid>
TabsWindow.xaml.cs
public partial class TabsWindow : Window
{
public TabsWindow()
{
InitializeComponent();
}
internal void SetTab(string content)
{
tab.SelectedIndex = int.Parse(content) - 1;
}
}
MainViewModel.cs
public class MainViewModel
{
private TabsWindow win;
public ICommand BtnClick { get; set; }
public MainViewModel()
{
BtnClick = new RelayCommand<object>(Click);
}
private void Click(object obj)
{
if (obj is Button btn)
{
if (win is null || !win.IsVisible)
{
win = new TabsWindow();
win.Show();
}
win.SetTab(btn.Content.ToString());
}
}
}
单击 Button
时,TabsWindow
将被激活并根据 Button
的 Content
移动到特定选项卡。此外,如果 TabsWindow
已激活,则可以移动选项卡而不显示新的 TabsWindow
。
我想在点击另一个 window 的按钮时打开一个 window,然后转到那个 window 中的特定选项卡。假设新 window (tabsWindow) 有 3 个选项卡 - tab1、tab2 和 tab3,我在主 window (buttonsWindow) btn1、btn2 和 btn3 上有 3 个按钮。所有三个选项卡都在一个 window 上,所有三个按钮都在另一个 window 上。单击 btn1 时,应从 tabsWindow 打开 tab1。在 btn2_Click,tab2 应该打开。我听说过 RoutedCommand 但并不擅长。给我建议任何其他可能或更简单的方法。
我使用 MVVM 模式制作了一个玩具样本。
您可以在 GitHub.
ButtonsWindow.xaml
我用了Command
,把Button
对象交给了CommandParameter
给使用 Button
.
TabControl
的 SelectedIndex
<UniformGrid Columns="3">
<Button Margin="50" Content="1" Command="{Binding BtnClick}" CommandParameter="{Binding RelativeSource={RelativeSource Self}}"/>
<Button Margin="50" Content="2" Command="{Binding BtnClick}" CommandParameter="{Binding RelativeSource={RelativeSource Self}}"/>
<Button Margin="50" Content="3" Command="{Binding BtnClick}" CommandParameter="{Binding RelativeSource={RelativeSource Self}}"/>
</UniformGrid>
TabsWindow.xaml
<Grid>
<TabControl x:Name="tab" Width="300" Height="300">
<TabItem Header="Tab1">
<TextBlock TextAlignment="Center" VerticalAlignment="Center" Text="Tab1" FontSize="20" />
</TabItem>
<TabItem Header="Tab2">
<TextBlock TextAlignment="Center" VerticalAlignment="Center" Text="Tab2" FontSize="20" />
</TabItem>
<TabItem Header="Tab3">
<TextBlock TextAlignment="Center" VerticalAlignment="Center" Text="Tab3" FontSize="20" />
</TabItem>
</TabControl>
</Grid>
TabsWindow.xaml.cs
public partial class TabsWindow : Window
{
public TabsWindow()
{
InitializeComponent();
}
internal void SetTab(string content)
{
tab.SelectedIndex = int.Parse(content) - 1;
}
}
MainViewModel.cs
public class MainViewModel
{
private TabsWindow win;
public ICommand BtnClick { get; set; }
public MainViewModel()
{
BtnClick = new RelayCommand<object>(Click);
}
private void Click(object obj)
{
if (obj is Button btn)
{
if (win is null || !win.IsVisible)
{
win = new TabsWindow();
win.Show();
}
win.SetTab(btn.Content.ToString());
}
}
}
单击 Button
时,TabsWindow
将被激活并根据 Button
的 Content
移动到特定选项卡。此外,如果 TabsWindow
已激活,则可以移动选项卡而不显示新的 TabsWindow
。