Tạo ứng dụng có chủ đề 'Tương phản cao' tùy chỉnh để sử dụng ngoài trời có thể được bật và tắt trong khi chạy. Điều này hoạt động tốt bằng cách hợp nhất và hủy hợp nhất từ điển tài nguyên chứa các kiểu như dưới đây ...DynamicResource cho Style BasedOn
<Style x:Key="{x:Type MenuItem}" TargetType="{x:Type MenuItem}">
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
<Setter Property="Template" Value="{StaticResource Theme_MenuItemTemplate}"/>
</Style>
Điều này rất hữu ích khi sử dụng menuitem không chỉ định kiểu. Điều này là không thực tế mặc dù trong nhiều tình huống vì không có cách nào để ràng buộc ItemsSource tạo ra trẻ em mà không có Styles. Ví dụ:
<ContextMenu.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Header" Value="{Binding Path=Name}"/>
<Setter Property="IsCheckable" Value="True"/>
<Setter Property="IsChecked" Value="{Binding Path=Checked}"/>
<EventSetter Event="Checked" Handler="HistoryItem_Checked"/>
</Style>
</ContextMenu.ItemContainerStyle>
Mỗi bài khác trên StackOverflow nói rằng bạn chỉ cần làm điều này ...
<Style TargetType="MenuItem" BasedOn="{StaticResource {x:Type MenuItem}}">
<!-- Your overrides -->
</Style>
Nhưng điều này không làm việc cho hoàn cảnh của tôi bởi vì Basedon tôi có thể và sẽ thay đổi trong thời gian chạy (và tất nhiên bạn không thể sử dụng phần mở rộng DynamicResource trên thuộc tính BasedOn). Làm điều này trong ứng dụng của tôi hiện đang dẫn đến kiểm soát mà ghi đè lên bị mắc kẹt với phong cách của họ khi kiểm soát được nạp trong khi mọi điều khiển khác chuyển đổi một cách chính xác mà không cần tải lại.
Vì vậy, câu hỏi của tôi ...
Có cách nào để có được gia hạn DynamicResource làm việc cho Basedon hoặc là có một phương pháp khác/hack tôi có thể thực hiện được điều này để làm việc?
Có một cách dễ dàng hơn để 'sao chép' các kiểu cơ sở. Tôi đã thêm câu trả lời này vào một câu trả lời mới. – aliceraunsbaek