2016-02-02 52 views
9

DockPanelとButtonを含むカスタムTabItemを作成しました。WPFカスタムTabItem - Visual Studio Designerに表示されないコントロール

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)でノックが表示されると思います。

問題はどこですか?

Screenshot Designer Screenshot running Programm

+1

あなたが提供したコードは、問題をテストするためのビルド可能な状態にはなりません。 TabItemが基本クラスであるため、コードのXAML部分が私にとって奇妙に見えます。あなたのドックパネルとバックグラウンド検索コードを含むボタンを含むユーザーコントロールを作成し、代わりにタブコントロールのTablitemsに追加するのはなぜですか? –

答えて

3

あなたはそれはそれは問題だと思うfine.I作品のTabControlでのTabItemを置く場合。 デザイナーは、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にタブコントロールがあることです。そして、searchfieldに人型を入力するために、カスタムTabItem(searchItem)をプログラムで追加します。だから私は既存のコントロールに項目を追加するTapControllにそれを置くオプションではありません。 – Daniel

+0

それはデザイナーに表示されない理由だけの説明でした。しかし、あなたはあなたのアプリを起動すると、あなたはそれが動作すると言った。あなたがデザイナーでそれを見ることが重要ですか?ここに同様のスレッドです:[リンク](http://stackoverflow.com/questions/20422006/xaml-designer-doesnt-show-content-of-a-usercontrol) – Johannes

+1

私はデザイナーを使用することができればもっと快適です。現時点では、TapItem-TagをPage-Tagに変更し、デザイナーで編集します。その後、TapItemに戻してAppをビルドします。これは回避策ですが、毎回かなり不便です。 – Daniel

1

あなたがしたことはうまくいくはずです。しかし、それはしません、そして、私は後で理由を示すことを試みます。

しかし、最初に、私の回避策:

  • オープンデザイナー、そしてそれを右クリックし、
  • を選択:編集、追加テンプレートを、そして編集は、が空の作成、コンテンツを生成しました。.. 。 'DataTemplate1'
を言って、あなたの新しい DataTemplate名前を付けてキー DataTemplate1で空 DataTemplate、それは( DynamicResourceにより)それに割り当てられ DataTemplate1で、 ContentTemplate属性を TabItemためにあなたが追加されます -

デザイナーは、いくつかのコードを生成します。

TabItemの内容をDataTemplate1に移動してください。デザイナーはレイアウトを正しく表示する必要があります。

SearchTabコントロールを閉じてもう一度開くと、コンテンツが再び表示されないことがわかります。デザイナーを右クリックしてを選択し、追加のテンプレートを編集、次に作成されたコンテンツを編集、次に現在の編集を選択します。

デザイナーがあなたのページを読み込めなかった理由SearchTab?デザイナーを右クリックしてテンプレートを編集を選択した場合、コピーを編集...TabItemスタイルが生成されます。 TabItemのヘッダーはContentPresenterによって表示されますが、TabItemの内容は内枠内に表示する必要がありますBorder。この境界線はOpacityがゼロに設定されており、に依存するMultiTriggersによって1に変更されています。あなたのケースのTabControlは存在しないので、すべてのバインディングが壊れています。つまり、 'TabItem'のデフォルト値であるStyleを変更すると、あなたの問題は解決されます。

+0

これは実際にいくつかの洞察を与えるgreateの答えだと思います。それは動作します! 「TabItemのスタイルを変更する」とはどういう意味ですか? Opacity!= 0などのスタイルを作成することは可能ですか?そして、ContentPresenterの代わりにDataTemplateを永久に表示することは可能ですか? – anhoppe

+0

そして、View-> ViewModelバインディングを再び機能させるにはどうしたらいいですか? – anhoppe

+0

@anhoppe。私がよく覚えていれば(私にはそのコードはありません)、私はContentItemがContentにバインドされた(TemplateBinding)ように、TabItemのスタイルで遊んできました。これはうまくいった。私は深い答えのためにそれに時間を費やす必要があります。 View-> ViewModelバインディングの場合、DataTemplateにDataTypeを設定する必要があります(DataType = "{x:Type YourType}") –

1

私の開発マシンは動作しませんが、私は提案することしかできません。タブアイテムコントロールで必要なものは、カスタムコントロールやグリッドにすべてのコントロールを配置し、タブページに動的に追加されるタブコントロールに追加することを前提にしてください。

タブ項目には、デザイナーでレンダリングするための適切な親タブコントロールが必要です。しかし、標準的なコントロールとしてすべてを構築すると、見た目と動作が期待どおりになります。

実行時に、タブ項目を追加し、動的に追加されたタブ項目にカスタムコントロールを追加し、それが機能するかどうかを確認します。他のすべてのコンポーネント/プロセスが動作しているようです。あなたのサンプルコントロールがラベル、テキストボックス、または同様のものだったとしても。

+0

swiszcsで苦労した後、私は最終的にあなたの提案を使用しました。シンプルで効果的です。私は間違っていない、私は本当に問題を理解するのに役立ちますので、swiszczポストに感謝し、それは普遍的な解決策ですが、あまりにも多くの欠陥があるようです。私がこのアプローチで最も気に入っているのは、指定されたUserControlでTabItemコンテンツを取り出すときにバインディングが壊れていないということです。それはコードの残りの部分に対して完全に透過的です。 – anhoppe

関連する問題