具有网格和共享内容的WPF标签控件

时间:2018-08-23 23:07:35

标签: wpf grid tabcontrol

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

不幸的是,由于图形控件的设计,不可能有一个以上的图形控件,这主要是因为性能不佳。我已经尝试过,但无法正常工作。

另一栏将显示特定于所选标签的项目,例如组合框,单选按钮等-下面是一个示例

enter image description here

我在右侧列中也具有选项卡控件,但是各个选项卡的布局在右侧列中比较拥挤,因此用户体验不太理想。

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

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

我认为执行此操作将涉及控件模板或选项卡控件的另一个模板,但是,到目前为止,我找不到类似的东西。有没有办法做这样的事情,如果有的话,有没有做这件事的指南或一些提示,我应该怎么做?

谢谢。

3 个答案:

答案 0 :(得分:2)

我达到此要求的方式如下。而且我会将模板/样式应用于按钮,以使它们看起来像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>

答案 1 :(得分:0)

您可以将ChartControl声明为资源,并在每个Tab中使用它。

要确认ChartControl相同,请在TextBox中键入内容,然后选择另一个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>

答案 2 :(得分:-1)

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

但是,我发现了自己遇到的问题-有些控件在我认为应该显示的时候没有显示粗体文本。这完全是我的错。

在每个字段的每个选项卡上,我都有多个不同的标签,这些标签根据用户选择的结果集而可见。自从我访问这段代码以来已经有很长时间了,我正在做的是添加粗体字体,因为这会使值更好地显示出来。

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

我将对每个字段使用单个标签,而不是使用多个不同的标签方法,并在多数据触发器中设置适当的内容绑定,因为这样可以使操作更简洁。这是一个非常复杂的应用程序。

我打算删除它,但是其他人也提出了类似的问题,但是,我认为Ritesh的答案与其他情况不同。