WPF自定义TabItem - 控件在Visual Studio设计器中未显示

8
Great! What language do you need help translating from and to?
<TabItem
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      mc:Ignorable="d" x:Class="MovieDB.UI.UserControlls.SearchTab" d:DesignWidth="500.038" d:DesignHeight="309.055">

    <DockPanel Background="#FFE5E5E5">
        <Button x:Name="button" Content="Button" Height="100" Width="75" HorizontalAlignment="Left" VerticalAlignment="Top"/>
    </DockPanel>
</TabItem>

C#:

namespace MovieDB.UI.UserControlls
{
    /// <summary>
    /// Interaktionslogik für SearchTab.xaml
    /// </summary>
    public partial class SearchTab : TabItem
    {
        private SearchContainer<SearchMovie> results;

        public SearchTab()
        {
            InitializeComponent();
            this.Header = "Suche";
        }

        public SearchTab(SearchContainer<SearchMovie> results):this()
        {
            this.updateSearch(results);
        }

        public void updateSearch(SearchContainer<SearchMovie> results)
        {
            clear();
            if(results.TotalResults == 0)
            {

            }
            else
            {
                this.results = results;
                Debug.WriteLine("Results: " + results.Results.Count());
            }
        }

        private void clear()
        {

        }
    }
}

如果启动我的程序,则会显示按钮(见截图2)。但是,在Visual Studio 2015设计器中,该按钮和我猜测的面板并未显示出来(见截图1)。
问题出在哪里? Screenshot Designer Screenshot running Programm

1
您提供的代码无法使我进入可构建状态以测试您的问题。您代码中的XAML部分对我来说似乎很奇怪,因为TabItem是您的基类。一个问题,为什么不创建一个包含您的停靠面板和带有背景搜索代码的按钮的用户控件,并将其添加到选项卡控件中的Tablitems中呢? - Kelly Barnard
3个回答

3

如果您将TabItem放在TabControl中,它可以正常工作。我认为这就是问题所在。 设计师需要一个导航控件,例如TabControl、Window Page等,作为根。

<TabControl x:Class="CustomControls.tab"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            mc:Ignorable="d" 
            d:DesignWidth="500.038" d:DesignHeight="309.055">
<TabItem>
    <DockPanel Background="#FFE5E5E5">
        <Button x:Name="button" Content="Button" Height="100" Width="75" HorizontalAlignment="Left" VerticalAlignment="Top"/>
    </DockPanel>
    </TabItem>
</TabControl>

1
问题是,我的MainWindow中有一个选项卡控件。如果有人在搜索框中输入内容,我会通过编程方式添加自定义的TabItem(searchItem)。因此,将其放入TapControll不是一个选项,因为我要向现有控件添加一个项目。 - Daniel
这只是一种解释,为什么它不会在设计器中显示。但是你说当你启动你的应用程序时它能正常工作。对于你来说,在设计器中看到它很重要吗? 这里有一个类似的主题:链接 - user5747953
1
如果我能使用设计师会更加舒适。目前我将TapItem-Tag更改为Page-Tag并在设计师中进行编辑。然后我将它改回TapItem来构建应用程序。这是一种解决方法,但每次都这样做非常麻烦。 - Daniel
1
虽然这不是解决方案,但它非常接近。如果我将TabItem转换为UserControl并在主窗口的TabItem中包含UserControl,则可以成功使其工作。 - Bruno Costa

1
你所做的应该是可以的。但它没有生效,我稍后会尝试解释原因。
但首先,我的解决方法:
  • 打开设计师,并右键单击它,
  • 选择:编辑其他模板,然后选择编辑生成内容,再选择创建空白...为你的新DataTemplate命名,比如'DataTemplate1'
设计师将生成一些代码 - 一个带有键DataTemplate1的空DataTemplate,并将其添加到TabItemContentTemplate属性中,通过DynamicResource将其分配给DataTemplate1
现在将你的TabItem内容移动到DataTemplate1中。设计师应该能正确显示你的布局。
如果你关闭并重新打开你的SearchTab控件,你会发现你再也看不到内容了。要将它恢复,请右键单击设计师,选择编辑其他模板,然后选择编辑生成内容,再选择编辑当前项
如果设计师无法加载您的SearchTab,您可以右键单击设计师并选择编辑模板,然后选择编辑副本...,就会生成TabItem样式。 TabItem的标题由ContentPresenter显示,而TabItem的内容必须在innerBorderBorder内部显示。这个边框的Opacity被设置为零,并且它通过依赖于TabControlMultiTriggers被改变为1。在您的情况下,TabControl不存在,因此所有绑定都已中断。这表明,更改“TabItem”的默认Style也将解决您的问题。

我认为这是一个非常好的答案,提供了一些见解。顺便说一句,它有效!你所说的“更改TabItem的样式”是什么意思?是否可以创建一个不透明度不为零或其他内容的样式?并且是否可以永久显示DataTemplate而不是ContentPresenter? - anhoppe
我该如何让我的View->ViewModel绑定再次正常工作? - anhoppe
如果我没记错的话(我手头没有那段代码),我一直在尝试修改TabItem的样式,使得ContentTemplate可以绑定到Content上(使用TemplateBinding)。这个方法是有效的。如果需要更深入的解答,我需要花些时间来研究它。要让View->ViewModel的绑定生效,你需要在DataTemplate中设置DataType属性(DataType="{x:Type YourType}")。 - Maciek Świszczowski

1

虽然我没有我的开发机来使用,但我只能提供一个建议。对于您在选项卡项目控件上想要的任何内容,为什么不将所有控件放入自定义用户控件或网格中,并假定您将其添加到动态添加到选项卡页的选项卡控件中。

选项卡项目需要其适当的父选项卡控件才能在设计器中呈现它。但是,如果您将所有内容构建为标准控件,则使其看起来和操作与您期望的相同。

然后在运行时,添加您的选项卡项目,然后将自定义控件添加到动态添加的选项卡项目中,看看是否适用于您。您显然已经让所有其他组件/进程工作了。即使您的示例控件只是标签、文本框或类似的东西。


在尝试了swiszcz的答案后,我最终采用了您的建议。它简单而有效。别误会,我真的很感激swiszcz的帖子,因为它有助于理解问题并且是一种非常规的解决方案,但它似乎有太多的缺陷。我最喜欢这种方法的原因是,当我从指定的UserControl中拉出TabItem内容时,绑定不会被破坏。对于代码的其余部分来说,这是完全透明的。 - anhoppe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接