2010-07-11 33 views
8

Tôi đang cố tạo bảng kiểu tùy chỉnh (StyledStackPanel) giống hệt với StackPanel thông thường, có kiểu tùy chỉnh. Ví dụ - nếu phong cách đơn giản là thêm một gạch dưới, bằng cách viết:Thay đổi mẫu WPF StackPanel

<StyledStackPanel> 
    <!--User content goes here--> 
</StyledStackPanel> 

Tôi muốn nhận sự xuất hiện giống như nếu tôi đã viết:

<StackPanel> 
    <!--User content goes here--> 
</StackPanel> 
<Border Height="1" BorderBrush="Blue"/> 

Nếu StackPanel là một Control, Tôi có thể thay thế số DataTemplate của điều khiển đó. Tuy nhiên, nó được thừa hưởng Panel kế thừa FrameworkElement.
Có cách nào để thay đổi mẫu của StackPanel không?

Trả lời

6

Không có cách nào để thiết lập một ControlTemplate cho một bảng điều khiển, nhưng bạn có một vài lựa chọn:

  1. Tạo một tùy chỉnh/điều khiển người dùng có StackPanel khi còn nhỏ.

  2. Kế thừa từ StackPanel và ghi đè OnRender để vẽ theo phong cách tùy chỉnh của bạn (bạn cũng có thể cần phải ghi đè MeasureOverride và ArrangeOverride để thêm một không gian nhỏ xung quanh trẻ em của bảng điều khiển cho bản vẽ của bạn.

  3. Kế thừa trực tiếp từ Panel và override OnRender, MeasureCore và ArrangeCore - nếu bạn cần sử dụng bảng điều khiển là một cách cụ thể và bạn không cần tất cả các tùy chọn của StackPanel thì đây có thể là cách dễ nhất vì thuật toán bố cục StackPanel là đơn giản. bạn làm bản vẽ của bạn trong mã) hoặc ContentControl (nếu bạn muốn sử dụng ControlTemplate) và wa rp bảng của bạn với nó khi bạn sử dụng nó:

     <l:PanelStyle> 
         <StackPanel> .. <StackPanel> 
        </l:PanelStyle> 
    
  4. Viết kiểu cho ItemsControl, ItemsControl có một ControlTemplate mà bạn có thể thiết lập và về cơ bản kết thúc tốt đẹp một bảng điều khiển (theo mặc định đó là một StackPanel dọc).

Tôi sẽ sử dụng tùy chọn 4 nếu bạn cần quyền truy cập vào thuộc tính của StackPanel hoặc 5 nếu bạn không truy cập.

+0

6 năm sau ... xin lỗi. Nó sẽ có thể ném trong một bản demo ngắn của tùy chọn 4? – matrixugly

1

Bạn nên thực hiện kiểm soát tùy chỉnh thông thường để thêm các phần tử con của nó vào một số StackPanel bên trong.

Ví dụ:

[ContentProperty("Children")] 
public class StyledStackPanel : UserControl { 
    public UIElementCollection Children { get { return stackPanel.Children; } } 
} 

(chưa được kiểm tra)

+3

Vấn đề ở đây là tất cả các thuộc tính StackPanel mong muốn phải được trả lại. Có tồn tại một giải pháp đơn giản hơn? Nó sẽ giúp để lấy được từ StackPanel và sau đó làm stylion addional với một adorner? – HCL

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