C# WPF自定义选项卡项-控件未显示在Visual Studio Designer中

C# WPF自定义选项卡项-控件未显示在Visual Studio Designer中,c#,wpf,visual-studio-2015,custom-controls,C#,Wpf,Visual Studio 2015,Custom Controls,我创建了一个自定义选项卡项,其中有一个DockPanel和一个按钮 XAML: C#: 名称空间MovieDB.UI.UserControlls { /// ///Interaktionslogik für SearchTab.xaml /// 公共部分类搜索选项卡:选项卡项 { 私有搜索结果; 公共搜索选项卡() { 初始化组件(); this.Header=“Suche”; } 公共搜索选项卡(SearchContainer结果):this() { 此。更新搜索(结果); } pub

我创建了一个自定义选项卡项,其中有一个DockPanel和一个按钮

XAML:


C#:

名称空间MovieDB.UI.UserControlls
{
/// 
///Interaktionslogik für SearchTab.xaml
/// 
公共部分类搜索选项卡:选项卡项
{
私有搜索结果;
公共搜索选项卡()
{
初始化组件();
this.Header=“Suche”;
}
公共搜索选项卡(SearchContainer结果):this()
{
此。更新搜索(结果);
}
public void updateSearch(搜索容器结果)
{
清除();
如果(results.TotalResults==0)
{
}
其他的
{
这个结果=结果;
Debug.WriteLine(“结果:+Results.Results.Count());
}
}
私人空位清除()
{
}
}
}
如果启动我的程序,将显示按钮(屏幕截图2)。但是按钮和面板本身并没有出现在VisualStudio2015设计器中(截图1)

问题在哪里


如果将TabItem放在TabControl中,效果会很好。我认为这就是问题所在。 设计器需要一个导航控件,如TabControl、windowpage等作为根

<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>

你所做的应该有用。但事实并非如此,我稍后将尝试说明原因

但首先,我的解决办法是:

  • 打开designer,右键单击它
  • 选择:编辑其他模板,然后编辑生成的内容,然后创建空模板。。。给新的
    DataTemplate
    起个名字,说“DataTemplate1”
设计器将生成一些代码-一个空的
DataTemplate
和一个键DataTemplate1,它将把您的
TabItem
添加到
ContentTemplate
属性,并将DataTemplate1分配给它(由
DynamicResource

现在将
选项卡item
的内容移动到DataTemplate1。设计师应正确显示您的布局

如果关闭并重新打开SearchTab控件,您将发现无法再次看到该内容。要使其返回,请右键单击设计器,选择“编辑其他模板”,然后选择“编辑生成的内容”,然后选择“编辑当前内容”


为什么设计师无法加载您的SearchTab?如果右键单击设计器并选择“编辑模板”,则编辑副本。。。您将生成
TabItem
样式。
TabItem
的标题由ContentPresenter显示,而TabItem的内容必须显示在innerBorder
边框内。此边框的
不透明度
设置为零,并由
多触发器
将其更改为1,这取决于
选项卡控件
。您案例中的
TabControl
不存在,因此所有绑定都已断开。这表明,更改“TabItem”的默认
样式也可以解决您的问题。

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

选项卡项需要其适当的父选项卡控件才能在设计器中呈现它。但是,如果您将所有内容都构建为标准控件,那么就让它按照您的期望进行外观和操作


然后在运行时,添加选项卡项,然后将自定义控件添加到动态添加的选项卡项中,并查看是否适合您。很明显,您的所有其他组件/流程都正常工作。即使示例控件只是一个标签、文本框或类似的东西。

问题是,我的主窗口中有一个选项卡控件。我还以编程方式添加了一个自定义选项卡项(searchItem),以防有人在searchfield中键入内容。因此,将其放入TapControll中不是一个选项,因为我向现有控件添加了一个项。这只是解释为什么它不会显示在designer中。但您说,当您启动应用程序时,它可以工作。在designer中查看它对您是否重要?这里有一个类似的线索:如果我可以使用设计器,它会更舒适。此时,我将TapItem标记更改为Page标记,并在设计器中对其进行编辑。之后,我将其改回TapItem以构建应用程序。这是一个解决办法,但每次都很难做到。虽然这不是解决方案,但已经很接近了。如果我将tabitem转换为UserControls,并将UserControls包含在主窗口的tabitem中,我可以使它正常工作。您提供的代码无法使我进入可构建状态以测试您的问题。代码的XAML部分对我来说似乎很奇怪,因为TabItem是您的基类。有一个问题,为什么不创建一个包含停靠面板和按钮以及后台搜索代码的用户控件,并将其添加到选项卡控件中的Tablitems中呢?我认为这是一个非常好的答案,可以提供一些见解。顺便说一句,它的工作!“更改TabItem的样式”是什么意思?是否可以创建具有不透明度的样式!=零还是什么?是否可以永久显示DataTemplate而不是ContentPresenter?如何使我的View->ViewModel绑定重新工作?@anhoppe。如果我记得很清楚的话(我没有这段代码),我一直在使用TabItem的样式,所以ContentTemplate被绑定(TemplateBinding)到内容。这起作用了。我需要花一些时间在这上面,以得到更深入的答案。为了查看->查看模型绑定工作,您需要在数据模板上设置数据类型(DataType=“{x:Type YourType}”),在与SWISZS答案反复讨论之后,我终于开始使用您的建议。它简单有效。别误会,我真的很感谢swiszcz的帖子,因为它有助于理解问题
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()
        {

        }
    }
}
<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>