2017-03-08 20 views
5

Đôi khi khi tôi chỉnh sửa bản sao của mẫu điều khiển gốc, tôi không cần phải thay đổi kiểu gốc và màu sắc và muốn tham chiếu trực tiếp các mẫu gốc.Chỉnh sửa mẫu điều khiển wpf nhưng sử dụng kiểu gốc

Ví dụ: tôi muốn thay đổi mẫu ComboBox để thêm một số nút lọc trong trình đơn thả xuống, nút chuyển đổi của nó đề cập đến Kiểu cũng được sao chép vào tệp. Tôi muốn đề cập đến phong cách ban đầu vì vậy XAML của tôi không quá lộn xộn.

Chỉnh sửa: Vì vậy, đây là một phần của mã XAML được tạo khi bạn chọn chỉnh sửa bản sao. ControlTemplate là những gì tôi muốn thay đổi, nhưng tôi không cần kiểu ComboBoxToggleButton, và vì vậy cho toggleButton tôi muốn thiết lập kiểu của nó thành kiểu ComboBoxToggleButton được sao chép từ đó. Có một số không gian tên mà tất cả chúng đều được lưu trữ, hoặc chúng không thể tiếp cận được không?

<Style x:Key="ComboBoxToggleButton" TargetType="{x:Type ToggleButton}"> 
    ... 
</Style> 

<ControlTemplate x:Key="ComboBoxTemplate" TargetType="{x:Type ComboBox}"> 
    <Grid x:Name="templateRoot" SnapsToDevicePixels="true"> 
     ... 
     <ToggleButton x:Name="toggleButton" ... Style="{StaticResource ResourceKey=ComboBoxToggleButton}"/> 
    </Grid> 
</ControlTemplate> 

Và khoảng những gì tôi muốn nó được như

<Window xmlns:baseStyles="{namespace/url to the default wpf styles}"> 
<ControlTemplate x:Key="ComboBoxTemplate" TargetType="{x:Type ComboBox}"> 
    <Grid x:Name="templateRoot" SnapsToDevicePixels="true"> 
     ... 
     <ToggleButton x:Name="toggleButton" ... Style="{StaticResource ResourceKey=baseStyles:ComboBoxToggleButton}"/> 
    </Grid> 
    <ControlTemplate.Triggers> 
     ... 
    </ControlTemplate.Triggers> 
</ControlTemplate> 
+0

Bản sao có thể có của [kiểu kế thừa từ kiểu mặc định] (http://stackoverflow.com/questions/11581475/inherit-style-from-default-style) –

+0

Không, bởi vì tôi không cố gắng kế thừa kiểu, Tôi đang cố gắng xóa hoàn toàn kiểu đã sao chép và chỉ tham chiếu một kiểu mà nó đã được đối chiếu. –

+0

Xem câu trả lời để biết thêm thông tin dựa trên giải thích thêm của bạn. –

Trả lời

1

Phải, do đó, Combobox không phải là điều khiển cơ bản trần của bạn. Bên trong đó là ControlTemplate là một ToggleButton duy nhất (do đó có thêm mẫu Kiểu mẫu cụ thể cho nó) mà nó yêu cầu. Một khi bạn giới thiệu một ControlTemplate mới hơn là bây giờ tất cả những gì nó biết. Nó KHÔNG thể tham khảo một mẫu Style bên trong bản gốc ControlTemplate vì nó không phải là tài nguyên có sẵn bên ngoài nó. Style và ControlTemplate là những con thú khác nhau.

Bạn có hai tùy chọn. Hoặc là bạn lấy mẫu ToggleButton Style duy nhất đó và đặt nó ở đâu đó nó có thể được gọi là StaticResource và ref nó trên thể hiện ToggleButton bên trong ControlTemplate của bạn thông qua số <ToggleButton Style="{StaticResource ComboBoxUniqueToggleButtonStyleKeyNameYouGiveIt}" ..../> bình thường (như thể nó nằm trong từ điển tài nguyên, trừ khi nó được tải tất cả thời gian nói chung là không cần thiết).

Hoặc bạn có thể nhúng trực tiếp vào số ControlTemplate giống như cách thực hiện in the default style/controltemplate for ComboBox.

Bạn có thể kế thừa các phần của mẫu Style qua BasedOn nhưng bạn chỉ có thể có một ControlTemplate cùng một lúc.

Hy vọng điều này sẽ hữu ích và tôi sẽ rút lại phiếu bầu trùng lặp của mình.

+0

Vì vậy, ControlTemplate ComboBox thường xuyên có chứa phong cách cho ToggleButton, mặc dù khi bạn chỉnh sửa một bản sao nó đặt Style bên ngoài ControlTemplate?(Tôi lưu ý rằng phong cách đó có một ControlTemplate cho ToggleButton cũng được xây dựng vào nó) –

+0

Ya Tôi không thể nói với logic của cách VS chiết xuất các phần mẫu. Mẫu Kiểu chỉ cung cấp cách thiết lập thuộc tính thuộc tính (Setter) của ControlTemplate được xác định cho nó. Bạn có thể áp dụng các thiết lập thuộc tính này cho các thừa kế khác nhau của ControlTemplate. Vì vậy, bạn có thể kế thừa mẫu Kiểu (với nó là ControlTemplate) của ToggleButton gần như chính xác như ví dụ thứ hai của bạn. Miễn là nó có thể đạt được một bản sao của mẫu ToggleButton Style, nếu không nó chỉ đi đến mặc định {x: Type ToggleButton} mẫu và có thể không cư xử như bạn muốn một ComoboBox ToggleButon để cư xử –

1

Để tái sử dụng các phong cách mặc định WPF để ComboBox, sử dụng:

<Style TargetType="ComboBox"> 
<!-- Setters in need of change --> 
</ Style> 

Nếu bạn muốn kế thừa từ một Style bạn tự tạo, bạn có thể sử dụng:

<Style TargetType="ComboBox" BasedOn="{StaticResource YourExistentStyle}"> 
<!-- Setters that need to change --> 
</ Style> 
+0

Điều đó không phù hợp với hoàn cảnh của tôi. Tôi đã thêm một ví dụ chi tiết hơn về những gì tôi đang theo dõi. –

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