2016-02-02 13 views
9

Tôi đã tạo một TabItem tùy chỉnh với một DockPanel và một Nút trong đó.Tab tùy chỉnh WPF - Các điều khiển không được hiển thị trong 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() 
     { 

     } 
    } 
} 

Nếu khởi động chương trình của tôi nút được hiển thị (Ảnh chụp màn hình 2). Nhưng nút và tôi đoán bảng điều khiển của nó mười hai không xuất hiện trong Visual Studio 2015 Designer (Ảnh chụp màn hình 1).

Sự cố ở đâu?

Screenshot Designer Screenshot running Programm

+1

Mã bạn đã cung cấp không đưa tôi đến trạng thái có thể xây dựng để kiểm tra vấn đề của bạn. Phần XAML của mã của bạn có vẻ lạ đối với tôi vì TabItem là lớp cơ sở của bạn. Một câu hỏi, tại sao bạn không tạo một điều khiển người dùng có chứa bảng điều khiển dock của bạn và nút với mã tìm kiếm nền và thêm vào Tablitems trong điều khiển tab của bạn thay vào đó? –

Trả lời

3

Nếu bạn đặt TabItem trong một TabControl nó hoạt động fine.I nghĩ đó là vấn đề. Nhà thiết kế cần điều khiển điều hướng như TabControl, Window Page, v.v.

<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

Vấn đề là, tôi có một tab controll trong MainWindow của tôi. Và tôi thêm một TabItem tùy chỉnh (searchItem) theo chương trình trong trường hợp một người nào đó gõ vào trường tìm kiếm. Vì vậy, đặt nó trong TapControll không phải là một lựa chọn becaus tôi thêm một mục vào một controll hiện có. – Daniel

+0

Nó chỉ là một lời giải thích tại sao nó sẽ không xuất hiện trong nhà thiết kế. Nhưng bạn đã nói khi bạn khởi chạy ứng dụng của bạn nó hoạt động. Có quan trọng không khi bạn thấy nó trong nhà thiết kế? đây là một chủ đề tương tự: [link] (http://stackoverflow.com/questions/20422006/xaml-designer-doesnt-show-content-of-a-usercontrol) – Johannes

+1

Sẽ thoải mái hơn nếu tôi có thể sử dụng nhà thiết kế. Tại thời điểm này tôi thay đổi TapItem-Tag thành Page-Tag và chỉnh sửa nó trong trình thiết kế. Sau đó tôi thay đổi nó trở lại TapItem để xây dựng ứng dụng. Đó là một cách giải quyết nhưng khá anoying làm cho nó mọi lúc. – Daniel

1

Những gì bạn đã làm sẽ hoạt động. Nhưng nó không, và sau đó tôi sẽ cố gắng cho thấy lý do tại sao.

Nhưng trước tiên, cách giải quyết của tôi:

  • mở nhà thiết kế, và nhấp chuột phải vào nó,
  • chọn: Sửa Templates bổ sung, sau đó Sửa Generated Content, sau đó Tạo Rỗng .. . Đặt tên mới DataTemplate của bạn, hãy nói 'DataTemplate1'
.210

Designer sẽ tạo ra một số mã - một sản phẩm nào DataTemplate với một chìa khóa DataTemplate1, và nó sẽ thêm bạn để TabItem thuộc tính ContentTemplate, với DataTemplate1 gán cho nó (bằng cách DynamicResource).

Bây giờ hãy di chuyển nội dung của số TabItem của bạn tới DataTemplate1. Nhà thiết kế nên hiển thị chính xác bố cục của bạn.

Nếu bạn đóng và mở lại điều khiển SearchTab, bạn sẽ thấy rằng bạn không thể xem lại nội dung. Để có nó trở lại nhấp chuột phải vào nhà thiết kế, chọn Chỉnh sửa mẫu bổ sung, sau đó Chỉnh sửa nội dung đã tạo, sau đó Chỉnh sửa hiện tại.

Tại sao nhà thiết kế không thể tải SearchTab của bạn? Nếu bạn nhấp chuột phải vào nhà thiết kế và chọn Chỉnh sửa mẫu, sau đó Chỉnh sửa bản sao ... bạn sẽ tạo kiểu TabItem. Tiêu đề của TabItem được hiển thị bởi ContentPresenter, trong khi nội dung của TabItem phải được hiển thị bên trong innerBorderBorder.Đường viền này có Opacity được đặt thành 0 và được đổi thành 1 theo MultiTriggers, phụ thuộc vào số TabControl. TabControl trong trường hợp của bạn không tồn tại, vì vậy tất cả các ràng buộc đều bị hỏng. Điều này gợi ý rằng việc thay đổi Style mặc định cho 'TabItem', cũng sẽ giải quyết được vấn đề của bạn.

+0

Tôi nghĩ rằng đây thực sự là một câu trả lời tuyệt vời cung cấp một số thông tin chi tiết. BTW nó hoạt động! Ý bạn là gì khi 'thay đổi kiểu cho TabItem'? Có thể tạo ra một phong cách với Opacity! = 0 hay cái gì đó? Và có thể hiển thị vĩnh viễn DataTemplate thay vì ContentPresenter không? – anhoppe

+0

Và làm thế nào tôi có thể nhận được View-> ViewModel ràng buộc của tôi hoạt động trở lại? – anhoppe

+0

@anhoppe. Nếu tôi nhớ rõ (tôi không có mã đó với tôi), tôi đã chơi với Style for TabItem, để ContentTemplate được gắn (TemplateBinding) vào Nội dung. Điều này làm việc. Tôi cần dành chút thời gian cho nó để có câu trả lời sâu hơn. Đối với View-> ViewModel bindings làm việc bạn cần phải đặt DataType trên DataTemplate (DataType = "{x: Type YourType}") –

1

Mặc dù tôi không có máy dev để làm việc cùng, tôi chỉ có thể đưa ra đề xuất. Đối với bất cứ điều gì bạn muốn kiểm soát mục tab của bạn, tại sao không đặt tất cả điều khiển của bạn trong điều khiển người dùng tùy chỉnh hoặc lưới với tiền đề mà bạn BIẾT bạn sẽ thêm nó vào điều khiển tab được thêm động vào trang tab của bạn.

Mục tab cần kiểm soát tab thích hợp của cha mẹ để hiển thị trong trình thiết kế. Nhưng nếu bạn xây dựng tất cả mọi thứ như là một điều khiển tiêu chuẩn làm cho nó trông và hoạt động như bạn mong đợi.

Sau đó, tại thời gian chạy, thêm mục tab của bạn, sau đó thêm điều khiển tùy chỉnh vào mục tab được thêm động và xem điều đó có phù hợp với bạn hay không. Bạn dường như có tất cả các thành phần/quy trình khác đang hoạt động. Ngay cả khi kiểm soát mẫu của bạn chỉ là một nhãn, hộp văn bản hoặc một cái gì đó tương tự.

+0

Sau khi đấu tranh xung quanh với swiszcs trả lời cuối cùng tôi đã đến sử dụng đề xuất của bạn. Nó đơn giản và hiệu quả. Đừng làm cho tôi sai, tôi thực sự đánh giá cao bài viết swiszcz vì nó giúp để hiểu được vấn đề và nó là một giải pháp độc đáo nhưng có vẻ như có quá nhiều sai sót. Những gì tôi thích nhất với cách tiếp cận này là ràng buộc không bị phá vỡ khi tôi kéo nội dung TabItem trong một UserControl được chỉ định. Nó hoàn toàn minh bạch với phần còn lại của mã. – anhoppe

Các vấn đề liên quan