具有网格和共享内容的 WPF 选项卡控件

WPF tab control with grid and shared content

我有一个 wpf 选项卡控件,我希望其中有两列。一列将始终显示一个图形控件,该控件将用于根据所选选项卡显示数据 - 但它始终是相同的图形控件。

不幸的是,由于图形控件的设计,不可能有一个以上的图形控件,主要是性能很差。我已经试过了,但它不能正常工作。

另一列将显示特定于所选选项卡的组合框、单选按钮等项目 - 下面是一个示例

我也有在右栏中的选项卡控件,但是各个选项卡的布局在右栏中很拥挤,导致用户体验不太理想。

现在,我将选项卡控件托管在一个网格中,该网格有两列,列跨度设置为二。对于右侧窗格,我有各种组框,我使用相应选项卡项的 IsSelected 属性 触发器控制这些组框的可见性。然而,这导致了其他问题,我已经追踪到有问题的控件的可见性。

我想做的是修改控件的模板,这样我就可以在选项卡控件中托管所有当前控件,以便图形控件始终显示在左侧,而右侧的内容-手选项卡由所选选项卡控制。

我认为这样做将涉及选项卡控件的控件模板或另一个模板,但是,到目前为止我还找不到类似的东西。有没有办法做这样的事情?如果有,是否有这样做的指南或关于如何完成此操作的一些提示?

谢谢。

您可以将 ChartControl 声明为资源并在每个选项卡中使用它。

要确认 ChartControl 相同,请在 TextBox 中键入内容,然后 select 另一个 Tab。文本保持不变。 TextBlock 中显示的初始化时间保持不变。

<Window x:Class="XamlApp.Window6"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:system="clr-namespace:System;assembly=mscorlib"
        Title="TabsWindow" 
        Height="480" Width="640">
    <Window.Resources>

        <Grid x:Key="IamChartControl" Background="Khaki">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>

            <TextBlock Text="{Binding Source={x:Static system:DateTime.Now}}" Margin="5"/>

            <TextBox Text="hello" Grid.Row="1" Margin="5"/>
        </Grid>

    </Window.Resources>

    <Grid>
        <TabControl ItemsSource="{Binding Source='12345'}">
            <TabControl.ContentTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="2*"/>
                            <ColumnDefinition/>
                        </Grid.ColumnDefinitions>

                        <ContentControl Content="{StaticResource IamChartControl}"/>

                        <TextBlock Grid.Column="1" Text="{Binding}"/>
                    </Grid>
                </DataTemplate>
            </TabControl.ContentTemplate>
        </TabControl>
    </Grid>
</Window>

我处理此要求的方式如下所示。我会将 template/style 应用于按钮,以便它们看起来像 TabHeader。

 <Grid Name="MainGrid">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"></ColumnDefinition>
            <ColumnDefinition Width="Auto"></ColumnDefinition>
        </Grid.ColumnDefinitions>

        <StackPanel Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Orientation="Horizontal">
            <StackPanel.Resources>
                <ControlTemplate x:Key="ButtonTemplate">
                    <!--Template style-->
                </ControlTemplate>
            </StackPanel.Resources>

            <Button>Root bending</Button>
            <Button>S-N curve bending</Button>
            <Button>S-N curve contact</Button>
        </StackPanel>

        <Grid Grid.Row="1" Grid.Column="0">
            <!--Your graph control goes here-->
        </Grid>

        <Grid Grid.Row="1" Grid.Column="1">
            <!--Show/hide these based on buttons-->
            <!--Control 1 with combo boxes, radio buttons, etc.-->
            <!--Control 2 with combo boxes, radio buttons, etc.-->
            <!--Control 3 with combo boxes, radio buttons, etc.-->
        </Grid>
    </Grid>

感谢您的建议。鉴于存在大量现有代码,并且由于图形控件不完全符合 WPF MVVM,因此在这种情况下更好的答案是 Ritesh 发布的答案。将图表放入资源需要重写的代码比我目前有时间做的要多。

但是,我发现了我所看到的问题 - 有些控件没有显示粗体文本,而我认为它们应该是粗体文本。这完全是我的错。

在每个字段的每个选项卡上,根据用户选择的结果集,我有多个不同的标签可见。我已经很久没有访问这段代码了,我正在做的是添加粗体字体,因为它可以使值更好地突出。

尴尬,我忘了我是这样实现的。

我将为每个字段使用一个标签,并在多数据触发器中设置适当的内容绑定,而不是使用多个不同的标签方法,因为这会使内容更加清晰。这是一个相当复杂的应用程序。

我本来想删掉的,但其他人也问过类似的问题,不过,我认为Ritesh的回答与其他案例不同。