【问题标题】:WPF Custom TabItem - Controls not displayed in Visual Studio DesignerWPF 自定义 TabItem - 控件未显示在 Visual Studio 设计器中
【发布时间】:2016-02-02 21:25:40
【问题描述】:

我创建了一个自定义 TabItem,其中包含一个 DockPanel 和一个按钮。

XAML:

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

问题出在哪里?

【问题讨论】:

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

标签: c# wpf visual-studio-2015 custom-controls


【解决方案1】:

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

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

【讨论】:

  • 问题是,我的主窗口中有一个选项卡控件。我以编程方式添加了一个自定义 TabItem(searchItem),以防有人在搜索字段中输入。所以把它放在 TapControll 中不是一个选项,因为我将一个项目添加到现有的控件中。
  • 这只是解释为什么它不会出现在设计器中。但是你说当你启动你的应用程序时它可以工作。你在设计器中看到它重要吗?这是一个类似的线程:link
  • 如果能用设计师就更舒服了。目前我将 TapItem-Tag 更改为 Page-Tag 并在设计器中对其进行编辑。之后,我将其改回 TapItem 以构建应用程序。这是一种解决方法,但每次都非常讨厌。
  • 虽然这不是解决方案,但它非常接近。如果我将 tabitem 转换为 UserControls 并将 usercontrols 包含在主窗口的 tabitem 中,我可以设法使其正常工作。
【解决方案2】:

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

但首先,我的解决方法:

  • 打开设计器,然后右键单击它,
  • 选择:Edit Additional Templates,然后 Edit Generated Content,然后 Create Empty... 为您的新 DataTemplate 命名,说“DataTemplate1

Designer 将生成一些代码 - 一个带有键 DataTemplate1 的空 DataTemplate,它会将您添加到 TabItemContentTemplate 属性,带有 DataTemplate1分配给它(由DynamicResource)。

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

如果您关闭并重新打开您的 SearchTab 控件,您会发现您无法再次看到内容。要让它回来,右键单击设计器,选择 Edit Additional Template,然后 Edit Generated Content,然后 Edit Current

为什么设计师无法加载您的SearchTab?如果您右键单击设计器并选择编辑模板,然后编辑副本...您将生成TabItem 样式。 TabItem 的标题由 ContentPresenter 显示,而 TabItem 的内容必须显示在 innerBorder Border 内。此边框将Opacity 设置为零,并被MultiTriggers 更改为1,这取决于TabControlTabControl 在您的情况下不存在,因此所有绑定都已损坏。这表明,更改“TabItem”的默认 Style 也可以解决您的问题。

【讨论】:

  • 我认为这确实是一个很好的答案,可以提供一些见解。顺便说一句,它有效! “更改 TabItem 的样式”是什么意思?是否可以使用 Opacity != 零或其他方式创建样式?是否可以永久显示 DataTemplate 而不是 ContentPresenter?
  • 我怎样才能让我的 View->ViewModel 绑定再次工作?
  • @anhoppe。如果我没记错的话(我没有那个代码),我一直在玩 TabItem 的样式,因此 ContentTemplate 被绑定(TemplateBinding)到 Content。这行得通。我需要花一些时间来获得更深入的答案。对于 View->ViewModel 绑定工作,您需要在 DataTemplate (DataType="{x:Type YourType}") 上设置 DataType
【解决方案3】:

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

标签项需要其适当的父标签控件才能在设计器中呈现。但是,如果您将所有内容构建为标准控件,请使其外观和操作符合您的预期。

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

【讨论】:

  • 在用 swiszcs 的回答苦苦挣扎之后,我终于开始使用你的建议了。它简单有效。不要误会我的意思,我非常感谢 swiszcz 的帖子,因为它有助于理解问题,这是一个非常规的解决方案,但似乎有太多缺陷。我最喜欢这种方法的是,当我在指定的 UserControl 中拉出 TabItem 内容时,绑定不会被破坏。它对其余代码完全透明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多